C# 在datagridview中添加新行后,立即显示它

C# 在datagridview中添加新行后,立即显示它,c#,sql,winforms,performance,datagridview,C#,Sql,Winforms,Performance,Datagridview,我有一个datagridview。当我以编程方式添加新行时,它应该立即出现在datagridview上,而不是等待完成所有的行 我正在使用下面的解决方案 ... adapter.Fill(ds); foreach (DataColumn dc in ds.Tables[0].Columns) { datagridView1.Columns.Add(dc.ColumnName, dc.ColumnName); } foreach (DataRow row in ds.Tables[0].R

我有一个datagridview。当我以编程方式添加新行时,它应该立即出现在datagridview上,而不是等待完成所有的行

我正在使用下面的解决方案

...
adapter.Fill(ds);
foreach (DataColumn dc in ds.Tables[0].Columns)
{
    datagridView1.Columns.Add(dc.ColumnName, dc.ColumnName);
}
foreach (DataRow row in ds.Tables[0].Rows)
{
    datagridView1.Rows.Add(row.ItemArray);
}
...
在这个解决方案中,我必须等到
ds.Tables[0].行
完成,然后datagridview显示这些行


我要求提供一个解决方案或建议,在该解决方案或建议中,我可以看到在datagridview上插入实时行,这与执行查询后在SQL Server上的结果类似。

没有立即添加行的原因是UI线程正在忙于执行循环,循环尚未完成时,它没有机会重新绘制UI

解决方案:

  • 旧的
    应用程序.DoEvents()
    “magic”调用
    没有立即添加行的原因是UI线程正在忙于执行循环,而在循环尚未完成时,它没有机会重新绘制UI

    解决方案:

  • 旧的
    应用程序.DoEvents()
    “magic”调用 还是只使用数据绑定

    private DataTable Dt = new DataTable();
    dataGridView1.DataSource = Dt;
    //do what ever
    DataRow dataRow = Dt.NewRow();
    //add data here to data row
    Dt.Rows.Add(dataRow);
    
    虽然这不会解决GUI锁定的问题, 我建议阅读。

    还是只使用数据绑定

    private DataTable Dt = new DataTable();
    dataGridView1.DataSource = Dt;
    //do what ever
    DataRow dataRow = Dt.NewRow();
    //add data here to data row
    Dt.Rows.Add(dataRow);
    
    虽然这不会解决GUI锁定的问题,
    我建议您阅读。

    您是否意识到这会降低所有记录的呈现速度?如果您想分块加载,这很好,但在每一行之后都是多余的。记录在案,几年前我有一个DataGridView,我将30k条记录加载到其中(大约20列),时间不到一分钟。如果我再做一次那个项目,我很可能会一次把它分解成1k,然后继续加载,直到我拥有了所有的东西。你知道这会减慢所有记录的呈现吗?如果您想分块加载,这很好,但在每一行之后都是多余的。记录在案,几年前我有一个DataGridView,我将30k条记录加载到其中(大约20列),时间不到一分钟。如果我再次处理该项目,我会一次将其分解为1k,并继续加载,直到我拥有所有内容。这也修复了在将行添加到DatagridView后立即选择新行的问题。ArgumentOutOfBoundException,因为未立即创建行。这也修复了在将行添加到DatagridView之后选择新行的问题。ArgumentOutOfBoundException,因为未立即创建行。选择它会给你带来很多好处。