c# - DataGridView 到文本...Header 和同一行问题的第一行

c# - DataGridView to txt...Header and first row on same line issue

我正在尝试将数据从 datagridview 导出到 .txt table 之类的文件中。

当我导出到 .txt 时,header 也像预期的那样打印在第一行,但 table 的第一行也在该行打印...现在我已经尝试了很多事情,但显然我的逻辑在这里是错误的。

我基本上想要一种方法来将 dataGridView_Excel.Rows.Count - 1; 设置为没有 -1 的正常计数。但是每次我这样做都会抛出一个 Object 引用未设置为 object. 的实例或者如果我尝试增加列数来抵消我获取 索引超出范围。必须是 non-negative 并且小于 collection 的大小。 关于如何做得更好的任何建议?我明白为什么会这样,我解决它的逻辑并不合理,我很困惑。

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");

您的 DataGridView 是 0 索引的,共有 'count' 行。这一行: 对于 (int i = 0; i < dataGridView_Excel.Rows.Count - 1; 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);

只是看东西太久而分心的情况...哎呀

这是最简单的解决方法:

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!