我发帖是为了看看是否有办法改进一些遗留代码。代码将使用x行数填充DataGridView。最初,代码工作正常,因为填充数据量很小。但是,数据有了极大的增长,我发现填充DataGridView的性能非常慢。
基本上,我知道有几个注意事项(例如虚拟模式)。但是,我想采用的方法是使用数组或List(然后将其转换为数组)并通过调用Rows.AddRange(数组)添加行的范围。但是,我无法实现它。
就目前而言,这就是代码的存在:
if (value !=0)
{
int row = 0;
dataGridView1.AddRow();
dataGridView1.Rows[row].Cells[0] = "Test";
dataGridView1.Rows[row].Cells[1] = 9;
dataGridView1.Rows[row].Cells[2] = "Test Two";
dataGridView1.Rows[row].Cells[3] = "Test Three";
row++;
}
if (valueTwo !=0)
{
dataGridView1.AddRow();
dataGridView1.Rows[row].Cells[0] = "Test";
dataGridView1.Rows[row].Cells[1] = 9;
dataGridView1.Rows[row].Cells[2] = "Test Two";
dataGridView1.Rows[row].Cells[3] = "Test Three";
row++;
}
因此,当然,这根本没有效率。我知道.AddRow()本身就是一种征税方法,并且单独添加行,一个接一个并不是很好。
我尝试过类似的事情:
object[] data = {"Test", 9, "Test Two", "Test Three"};
List<DataGridViewRow> list = new List<DataGridViewRow>();
for (int i = 0; i < data.Length; i++)
{
DataGridViewRow row = new DataGridViewRow();
row.SetValues(data[i]);
list.Add(row);
}
dataGridViewRow1.Rows.AddRange(list.ToArray());
但是,这样做会在SetValues行上产生NullPointerException。
我知道这样做的最好方法是创建一个DataTable或者使用虚拟模式,但是我想尝试使用这种方法来添加范围并传入数据的容器,而不是添加一行。 / p>
我希望我的解释清楚。如果我需要进一步解释,请告诉我。
编辑:我认为使用虚拟模式是最好的方法。不过,我不确定如何真正做到这一点。我检查了MSN的教程,但我对此感到有些困惑。如果我要实现100,000行的虚拟模式,我将如何去做。没什么好看的,只显示了10,000行。
答案 0 :(得分:0)
我更喜欢DataTable是正确的方法, 但是如果你想动态地向gridView添加数据, 首先,您需要添加列然后添加行。
private void Form5_Load(object sender, EventArgs e)
{
var lstTemp = new List<test>();
for (int i = 0; i < 10; i++)
lstTemp.Add(new test() { Name = "Test", No = i, Desc = "Desc " + i, Desc1 = "Desc1 " + i });
dataGridView1.Columns.Add("Name", "Name");
dataGridView1.Columns.Add("No", "Number");
dataGridView1.Columns.Add("Desc", "Description1");
dataGridView1.Columns.Add("Desc1", "Description2");
foreach (var temp in lstTemp)
{
DataGridViewRow row = (DataGridViewRow) dataGridView1.Rows[0].Clone();
row.Cells[0].Value = temp.Name;
row.Cells[1].Value = temp.No;
row.Cells[2].Value = temp.Desc;
row.Cells[3].Value = temp.Desc1;
dataGridView1.Rows.Add(row);
}
}
public class test
{
public string Name { get; set; }
public int No { get; set; }
public string Desc { get; set; }
public string Desc1 { get; set; }
}
这可能会对你有帮助,
答案 1 :(得分:0)
对于您的情况,您需要在行之前添加列,
object[] data = { "Test", 9, "Test Two", "Test Three" };
dataGridView1.Columns.Add("Name", "Name");
dataGridView1.Columns.Add("No", "Number");
dataGridView1.Columns.Add("Desc", "Description1");
dataGridView1.Columns.Add("Desc1", "Description2");
for (int i = 0; i < 10; i++)
dataGridView1.Rows.Add(data);
答案 2 :(得分:0)
尝试使用填充数据的BindingList,您可以使用类来映射属性或使用动态属性。你必须先创建cols才能绑定数据:这是一个例子:
[[1 1 1 0]
[1 1 1 0]
[0 0 0 0]]