C# DataGridView添加行在底部显示加扰的行

C# DataGridView添加行在底部显示加扰的行,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我正在构建一个简单的工具来编辑分号分隔的值文件,并使用datagridview来显示和编辑数据。当我在datagridview中显示数据时,最后一行中的文本显示不好,这很奇怪,因为最后一行应该是空的。当我将allowUserToAddress设置为true时,就会发生这种情况。当我将此属性设置为false时,最后一行显示正确,但我希望能够向datagridview添加行。我尝试通过单击按钮添加一个空行,然后执行以下代码行来解决这个问题:DataTable.Rows.Add()其中DataTabl

我正在构建一个简单的工具来编辑分号分隔的值文件,并使用datagridview来显示和编辑数据。当我在datagridview中显示数据时,最后一行中的文本显示不好,这很奇怪,因为最后一行应该是空的。当我将
allowUserToAddress
设置为true时,就会发生这种情况。当我将此属性设置为false时,最后一行显示正确,但我希望能够向datagridview添加行。我尝试通过单击按钮添加一个空行,然后执行以下代码行来解决这个问题:
DataTable.Rows.Add()其中DataTable的类型为DataGridView,但同样的呈现问题再次发生。在这两种情况下,当我单击错误渲染的行并单击另一行时,我会在
rowIndex
上得到
ArgumentOutOfRangeException
。这是DataGridView中的一个bug吗?如果是的话,是否有解决方案,我可以在DataGridView中加载一个基于文本、分号分隔的值文件,并能够向其中添加行?或者我必须改变一些属性吗

首先,您需要将文件正确地转换为
DataTable
。 然后将
DataGridView
DataSource
设置为使用该文件加载的数据表。将
allowUserToAddress
设置为true,然后将
DataTable
保存回文件

示例

假设文件内容如下:

Column1;Column2
a1;b1
a2;b2
a3;b3
我们希望在
DataGridView
中显示它们,如下所示:

| Column1     | Column2    |
|=============|============|
|a1           |b1          |
|-------------|------------|
|a2           |b2          |
|-------------|------------|
|a3           |b3          |
|-------------|------------|
|             |            |
|-------------|------------|
您可以使用以下代码简单地加载和保存数据:

DataTable dt;
string fileName = @"d:\file1.txt";
private void Form1_Load(object sender, EventArgs e)
{
    dt = LoadFile(fileName);
    this.dataGridView1.DataSource = dt;
}
private void SaveButton_Click(object sender, EventArgs e)
{
    SaveFile(dt, fileName);
}
加载文件

保存文件

public void保存文件(DataTable dt,字符串文件名)
{
var list=新列表();
添加(dt.Columns.Cast().Select(x=>x.ColumnName));
list.AddRange(dt.Rows.Cast().Select(x=>x.ItemArray.Cast());
var lines=list.Select(x=>string.Join(“;”,x));
System.IO.File.writeAllines(文件名,行);
}

谢谢,使用DataTable作为数据源是可行的。我曾试图在不使用数据源的情况下达到我的目标,但我想那是行不通的。
DataTable LoadFile(string fileName)
{
    var dt = new DataTable();
    var lines = System.IO.File.ReadAllLines(fileName);
    if (lines.Count() == 0)
        return dt;
    lines.First().Split(';').ToList().ForEach(x =>
    {
        dt.Columns.Add(new DataColumn(x));
    });
    lines.Skip(1).ToList().ForEach(x =>
    {
        dt.Rows.Add(x.Split(';'));
    });
    return dt;
}
public void SaveFile(DataTable dt, string fileName)
{
    var list = new List<IEnumerable<string>>();
    list.Add(dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName));
    list.AddRange(dt.Rows.Cast<DataRow>().Select(x => x.ItemArray.Cast<string>()));
    var lines = list.Select(x => string.Join(";", x));
    System.IO.File.WriteAllLines(fileName, lines);
}