数据网格视图添加行在底部显示乱序行



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

首先,您需要将文件正确转换为DataTable。 然后将DataGridViewDataSource设置为使用该文件加载的数据表。将AllowUserToAddRows设置为 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);
}

加载文件

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

最新更新