Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在DataGridView中对大数据使用虚拟模式_C#_Datagridview - Fatal编程技术网

C# 如何在DataGridView中对大数据使用虚拟模式

C# 如何在DataGridView中对大数据使用虚拟模式,c#,datagridview,C#,Datagridview,我发帖是想看看是否有办法改进一些遗留代码。代码将用x行数填充DataGridView。最初,代码运行良好,因为填充的数据量很小。然而,数据急剧增加,我发现填充DataGridView的性能非常慢 基本上,我知道有几个考虑因素(例如虚拟模式)。但是,我想采用的方法是使用数组或列表(然后将其转换为数组),并通过调用Rows.AddRange(array)来添加行的范围。然而,我在实现它时遇到了困难 就目前情况而言,这就是代码的存在: if (value !=0) { int row = 0; d

我发帖是想看看是否有办法改进一些遗留代码。代码将用x行数填充DataGridView。最初,代码运行良好,因为填充的数据量很小。然而,数据急剧增加,我发现填充DataGridView的性能非常慢

基本上,我知道有几个考虑因素(例如虚拟模式)。但是,我想采用的方法是使用数组或列表(然后将其转换为数组),并通过调用Rows.AddRange(array)来添加行的范围。然而,我在实现它时遇到了困难

就目前情况而言,这就是代码的存在:

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”
};
单元格