如何在DataGridView

时间:2017-06-08 10:38:01

标签: c# datagridview

我发帖是为了看看是否有办法改进一些遗留代码。代码将使用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行。

3 个答案:

答案 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]]