在c#中保存datagridview中的数据

Posted

技术标签:

【中文标题】在c#中保存datagridview中的数据【英文标题】:save data from datagridview in c # 【发布时间】:2018-11-19 08:28:16 【问题描述】:

1 我在存储数据时遇到问题。 在此之前,我有已经显示在 DataGridview 中的数据,我想以 * txt 的形式存储来自 DataGridview 的数据。我已尝试保存数据,但仅存储了一个数据而不是全部。

在这里,我向您展示我的代码。希望可以有人帮帮我?非常感谢之前

row.Cells["colProjection"].Value = string.Join("\t", feature.Select(f => Math.Abs(f / 30).ToString("N3")));
            TextWriter writer = new StreamWriter(@"C:\Users\LENOVO\Desktop\OKE.txt");
            writer.Write(row.Cells["colProjection"].Value);
            writer.WriteLine("");
            writer.Close();

【问题讨论】:

为什么您将整个表达式写入该单元格(使用制表符),然后尝试从该单元格写入文本文件?只需将您的表达式写入文本文件即可。 你保存一个单元格你就有一个单元格。明显的。如果您有更多单元格,则需要将它们全部写入。如果你想在一个文本文件中添加一个行分隔符,也许是 '\v':如果你有更多行,同样适用。也许使用 \r 来分隔行,或者像现在这样使用换行符序列。 因为我的datagridview格式就是这样。有一列用于显示图像,有一列用于显示值。我会将值保存在显示该值的列中。 @SeM 【参考方案1】:

您应该获取所有行数据,您可以使用for 循环来执行此操作,如下所示:

  StringBuilder sr=new StringBuilder();
  for (int i=0 ;i>=mygrid.Rows.Count;i++)
  
     sr.AppendLine(mygrid.Rows[i].Cells["colProjection"].Text);
  

  System.IO.File.WriteAllText("D:\output.txt",sr.ToString());

更新:

private void btnFeature_Click(object sender, EventArgs e)

    if (pca == null)
    
        MessageBox.Show("Please compute the analysis first!");
        return;
    

    ImageToArray converter = new ImageToArray(min: 0, max: 1);

    int rows = dataGridView3.Rows.Count;
    double[][] inputs = new double[rows][];
    double[][] features = new double[rows][];
    int[] outputs = new int[rows];

    int index = 0;
    StringBuilder sr=new StringBuilder();
    foreach (DataGridViewRow row in dataGridView3.Rows)
    
        Bitmap image = row.Cells["colFace2"].Value as Bitmap;
        int label = (int)row.Cells["colLabel2"].Value;

        double[] input;
        converter.Convert(image, out input);

        double[] feature = pca.Transform(input);

        row.Cells["colProjection"].Value = string.Join("\t", feature.Select(f => Math.Abs(f / 30).ToString("N3")));
       // TextWriter writer = new StreamWriter(@"C:\Users\LENOVO\Desktop\OKE.txt");
        /*for (int i = 0; i < dataGridView3.RowCount; i++)
        
            writer.Write(); 
        */

        sr.Append(row.Cells["colProjection"].Text);// Or .Value


        row.Tag = feature;
        inputs[index] = input;
        features[index] = feature;
        outputs[index] = label;
        index++;
    
  System.IO.File.WriteAllText("C:\Users\LENOVO\Desktop\OKE.txt",sr.ToString());

【讨论】:

对不起,我试过你的代码。但是,该程序仍然无法运行,并且错误出现在代码“row [i]”中。我收到一个错误“无法使用 [] 将索引应用到表达式以键入 'datagridview'”。那么,我该怎么办? 它只是一个示例,使用mygrid.Rows[i].Cells["colProjection"].Value; 而不是row[i].Cells["colProjection"].Value @IrmaDewita 我已经更新了答案。另请在我之前的评论中将 .Value 替换为 .Text 是的,我明白了,我已经成功地使用循环功能将数据完全存储起来了。但是当我看到txt中的数据时,第一行中的值与第二行相同,依此类推。我应该怎么做才能克服这个问题?【参考方案2】:

这是我用来存储数据的代码。 但是存储的数据仍然有错误。因为存储的数据是最后一行数据,而不是从第一行到最后一行的数据。

private void btnFeature_Click(object sender, EventArgs e)
    
        if (pca == null)
        
            MessageBox.Show("Please compute the analysis first!");
            return;
        

        ImageToArray converter = new ImageToArray(min: 0, max: 1);

        int rows = dataGridView3.Rows.Count;
        double[][] inputs = new double[rows][];
        double[][] features = new double[rows][];
        int[] outputs = new int[rows];

        int index = 0;
        foreach (DataGridViewRow row in dataGridView3.Rows)
        
            Bitmap image = row.Cells["colFace2"].Value as Bitmap;
            int label = (int)row.Cells["colLabel2"].Value;

            double[] input;
            converter.Convert(image, out input);

            double[] feature = pca.Transform(input);

            row.Cells["colProjection"].Value = string.Join("\t", feature.Select(f => Math.Abs(f / 30).ToString("N3")));
            TextWriter writer = new StreamWriter(@"C:\Users\LENOVO\Desktop\OKE.txt");
            for (int i = 0; i < dataGridView3.RowCount; i++)
            
                writer.Write(row.Cells["colProjection"].Value + "\t"); 
            
            writer.WriteLine("");
            writer.Close();

            row.Tag = feature;
            inputs[index] = input;
            features[index] = feature;
            outputs[index] = label;
            index++;
        
    

【讨论】:

row.Cells["colProjection"].Value = string.Join("\t", feature.Select(f =&gt; Math.Abs(f / 30).ToString("N3"))); 这个代码行是做什么的? 用于以数组形式在每一行的“colprojetion”中显示值的代码。 对不起,但需要更多说明。 row这是指什么?为什么不使用当前行索引i 来检索循环中的所有行(正如我在上一个答案中解释的那样)? 抱歉,我不明白这是什么意思。但我已经更新了我使用的完整代码。我希望你能帮我解决我的问题。谢谢@MKH 嗯,您正试图通过ForeEach 循环获取所有行,但为什么要在其中使用for 循环?这个for 循环重复从foreach 检索到的每一行.RowCount 次,然后将其保存到文件中。另外,请在 foreach 结束后放置您的 Save & Close Writer,因为这就是为什么您在输出文件中只保存一条记录(在这种情况下为最后一行)n 次。

以上是关于在c#中保存datagridview中的数据的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何通过textbox修改dataGridView中的值单击button并保存到数据库中

将datagridview中的数据集存储到新的访问数据库文件c#

使用 c# 编辑 DataGridview 并将其保存在数据库表中

如何实现c# winform DataGridView添加一行,添加数据后,保存到数据库?

怎么删除datagridview中选中的行啊

c# winform DataGridView添加一行,添加数据后,保存到数据库