C# 如何在DataGridView中对大数据使用虚拟模式
我发帖是想看看是否有办法改进一些遗留代码。代码将用x行数填充DataGridView。最初,代码运行良好,因为填充的数据量很小。然而,数据急剧增加,我发现填充DataGridView的性能非常慢 基本上,我知道有几个考虑因素(例如虚拟模式)。但是,我想采用的方法是使用数组或列表(然后将其转换为数组),并通过调用Rows.AddRange(array)来添加行的范围。然而,我在实现它时遇到了困难 就目前情况而言,这就是代码的存在:C# 如何在DataGridView中对大数据使用虚拟模式,c#,datagridview,C#,Datagridview,我发帖是想看看是否有办法改进一些遗留代码。代码将用x行数填充DataGridView。最初,代码运行良好,因为填充的数据量很小。然而,数据急剧增加,我发现填充DataGridView的性能非常慢 基本上,我知道有几个考虑因素(例如虚拟模式)。但是,我想采用的方法是使用数组或列表(然后将其转换为数组),并通过调用Rows.AddRange(array)来添加行的范围。然而,我在实现它时遇到了困难 就目前情况而言,这就是代码的存在: if (value !=0) { int row = 0; d
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());
object[]data={“Test”,9,“test2”,“test3”};
列表=新列表();
for(int i=0;i
但是,这样做会在SetValues行上得到一个NullPointerException
我知道最好的方法是创建一个DataTable或使用虚拟模式,但我想尝试使用这种方法添加范围并为数据传递一个容器,而不是添加一行
我希望我的解释清楚。如果我需要进一步解释,请告诉我
编辑:我认为使用虚拟模式是最好的方式。不过,我不知道如何真正做到这一点。我查看了MSN的教程,但有点困惑。如果我要为100000行实现虚拟模式,我将如何着手实现它。没有什么特别的,只是总共显示了10000行。我认为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; }
}
private void Form5\u加载(对象发送方,事件参数e)
{
var lstemp=新列表();
对于(int i=0;i<10;i++)
lstemp.Add(newtest(){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(LSTEMP中的var temp)
{
DataGridViewRow=(DataGridViewRow)dataGridView1.Rows[0].Clone();
行。单元格[0]。值=临时名称;
行。单元格[1]。值=临时编号;
行。单元格[2]。值=临时说明;
行。单元格[3]。值=temp.Desc1;
dataGridView1.Rows.Add(row);
}
}
公开课考试
{
公共字符串名称{get;set;}
公共int No{get;set;}
公共字符串Desc{get;set;}
公共字符串Desc1{get;set;}
}
这可能会对您有所帮助,我认为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; }
}
private void Form5\u加载(对象发送方,事件参数e)
{
var lstemp=新列表();
对于(int i=0;i<10;i++)
lstemp.Add(newtest(){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(LSTEMP中的var temp)
{
DataGridViewRow=(DataGridViewRow)dataGridView1.Rows[0].Clone();
行。单元格[0]。值=临时名称;
行。单元格[1]。值=临时编号;
行。单元格[2]。值=临时说明;
行。单元格[3]。值=temp.Desc1;
dataGridView1.Rows.Add(row);
}
}
公开课考试
{
公共字符串名称{get;set;}
公共int No{get;set;}
公共字符串Desc{get;set;}
公共字符串Desc1{get;set;}
}
这可能会对您有所帮助,对于您的情况,您需要在行之前添加列
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);
object[]data={“Test”,9,“test2”,“test3”};
dataGridView1.Columns.Add(“Name”、“Name”);
dataGridView1.Columns.Add(“No”,“Number”);
dataGridView1.Columns.Add(“Desc”、“Description1”);
dataGridView1.Columns.Add(“Desc1”、“Description2”);
对于(int i=0;i<10;i++)
dataGridView1.Rows.Add(数据);
对于您的案例,您需要在行之前添加列
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);
object[]data={“Test”,9,“test2”,“test3”};
dataGridView1.Columns.Add(“Name”、“Name”);
dataGridView1.Columns.Add(“No”,“Number”);
dataGridView1.Columns.Add(“Desc”、“Description1”);
dataGridView1.Columns.Add(“Desc1”、“Description2”);
对于(int i=0;i<10;i++)
dataGridView1.Rows.Add(数据);
尝试使用数据填充的绑定列表,可以使用类映射属性,也可以使用动态类。您必须首先创建COL,以便绑定de数据:以下是一个示例:
DataGridViewCell cell = new DataGridViewTextBoxCell();
DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn()
{
CellTemplate = cell,
Name = "Value1",
HeaderText = "Value 1",
DataPropertyName = "Col1"
};
DataGridViewCell cell2 = new DataGridViewTextBoxCell();
DataGridViewTextBoxColumn colFileName2 = new DataGridViewTextBoxColumn()
{
CellTemplate = cell2,
Name = "Value2",
HeaderText = "Value 2",
DataPropertyName = "Col2"
};
dataGridView1.Columns.Add(colFileName);
dataGridView1.Columns.Add(colFileName2);
List<DataPopulate> list = new List<DataPopulate>();
list.Add(new DataPopulate() { Col1 = "tes1", Col2 = "teste2"});
list.Add(new DataPopulate() { Col1 = "tes1", Col2 = "teste2" });
list.Add(new DataPopulate() { Col1 = "tes1", Col2 = "teste2" });
var dataPopulateList = new BindingList<DataPopulate>(list);
dataGridView1.DataSource = dataPopulateList;
DataGridViewCell单元格=新建DataGridViewTextBoxCell();
DataGridViewTextBoxColumn colFileName=新DataGridViewTextBoxColumn()
{
CellTemplate=单元格,
Name=“Value1”,
HeaderText=“值1”,
DataPropertyName=“Col1”
};
单元格