【问题标题】:c# - DataGridView to txt...Header and first row on same line issuec# - DataGridView to txt...标题和第一行在同一行问题
【发布时间】:2018-01-05 04:29:06
【问题描述】:

我正在尝试将数据从 datagridview 导出到 .txt 表格中。

当我导出到 .txt 时,标题也会像预期的那样打印在第一行,但表格的第一行也会打印在该行上……现在我已经尝试了很多东西,但显然我的逻辑在这里非常错误。

我基本上想要一种将 dataGridView_Excel.Rows.Count - 1; 设置为没有 -1 的正常计数的方法。但是每次我这样做时都会抛出一个未设置为对象实例的 对象引用。 或者如果我尝试增加列数以抵消我得到的 索引超出范围。必须是非负数且小于集合的大小。 有关如何更好地做到这一点的任何建议?我理解它为什么会发生,我修复它的逻辑不合理,我非常困惑。

if (save.ShowDialog() == DialogResult.OK)
        {
            TextWriter writer = new StreamWriter(save.OpenFile());

            int i2 = 0;
            while (i2 < 19)
            {
                writer.Write(dataGridView_Excel.Columns[i2].HeaderText + "\t        " + "|");
                i2++;
            }

            for (int i = 0; i < dataGridView_Excel.Rows.Count - 1; i++)
            {                                      
                for (int j = 0; j < dataGridView_Excel.Columns.Count; j++)
                {
                    writer.Write("\t" + dataGridView_Excel.Rows[i].Cells[j].Value.ToString() + "\t        " + "|");

                }

                writer.WriteLine("");
                writer.WriteLine("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
            }
            writer.Close();
            MessageBox.Show("Data Exported");

【问题讨论】:

    标签: c# visual-studio windows-forms-designer visual-c#-express-2010


    【解决方案1】:

    只是因为看东西太久而心烦意乱......哎呀

    这是解决此问题的最简单方法:

    if (save.ShowDialog() == DialogResult.OK)
            {
                TextWriter writer = new StreamWriter(save.OpenFile());
    
                int i2 = 0;
                while (i2 < 20)
                {
                    writer.Write(dataGridView_Excel.Columns[i2].HeaderText + "\t        " + "|");
                    i2++;
                }
    
                writer.Write(Environment.NewLine);
                writer.WriteLine("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
    
                for (int i = 0; i < dataGridView_Excel.Rows.Count - 1; i++)
                {                                      
                    for (int j = 0; j < dataGridView_Excel.Columns.Count; j++)
                    {
                        writer.Write("\t" + dataGridView_Excel.Rows[i].Cells[j].Value.ToString() + "\t        " + "|");
    
                    }
    
                    writer.WriteLine("");
                    writer.WriteLine("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
                }
                writer.Close();
                MessageBox.Show("Data Exported");
            }
    

    我刚刚在循环之前添加了一个 Environment.NewLine 和我的 ---- 分隔符。我在主 for 循环之外的 while 循环中将 Header 添加到文件的全部原因是为了便于更改为 .txt 格式。感谢@ainwood 的想法让我重回正轨!

    Before

    After!

    【讨论】:

      【解决方案2】:

      您的 DataGridView 索引为 0,总行数为 'count'。这一行: for (int i = 0; i

      将从零开始,一直到((行数-1)-1),因为它是:小于。

      试试:

      for (int i = 0; i <= dataGridView_Excel.Rows.Count - 1; i++)
      

      即添加 = 符号,或:

      for (int i = 0; i < dataGridView_Excel.Rows.Count; i++)
      

      除非我误解了您的问题。问题是循环问题,还是要在新行上写东西?

      要让它写一个新行,请尝试将 Environment.NewLine 添加到末尾:

      writer.Write("\t" + dataGridView_Excel.Rows[i].Cells[j].Value.ToString() + "\t        " + "|" + Environment.NewLine);
      

      【讨论】:

      • 当我执行 Object reference not set to an instance of an object 因为行数不再少于列数,它们变得相等。这是我的问题的图片:linklinklinklink 所以我的标题行和我的 datagridview 的第一行在导出到 .txt 时结合在一起。我已经尝试过按照您的建议进行操作,但它不起作用。
      • 感谢换行的建议和回复!
      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多