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