我必须说我已经读了这个网站很长一段时间,总能找到我想要的东西。可悲的是,今天情况并非如此。
我有一个.NET C#Winforms应用程序,它使用MySQL .NET Connector查询数据库并用结果填充DataGridView。
这是我的代码:
using (var SqlConn = new MySqlConnection(MyConnectionString)
{
using (var SqlComm = new MySqlCommand("SELECT * FROM my_database.city", SqlConn)
{
using (var SqlAdapter = new MySqlDataAdapter(SqlComm)
{
DataTable SqlOutput = new DataTable();
SqlAdapter.Fill(SqlOutput);
myDataGridView.DataSource = SqlOutput;
}
}
}
代码运行正常。问题是,考虑到表格有20K行,加载需要一些时间,同时会阻止用户界面。
做一些测试,我得出结论,数据库查询Fill()非常快(实际上需要10ms)。 因此,设置DataGridView.DataSource属性会延迟整个操作。
所以我的问题是,有没有办法设置DataSource propery异步?或者也许是在数据加载时我仍然可以使用表单的方式?
我还想知道是否有更好的方法,因为每次我对数据库表进行更改时都会调用此方法,因此我可以向用户显示更新的信息。
提前致谢。
答案 0 :(得分:0)
文档建议使用" virualmode"物业设置。
https://msdn.microsoft.com/en-us/library/15a31akc.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
还有其他有趣的话题"及时加载"。 在Windows窗体DataGridView控件中使用即时数据加载实现虚拟模式
https://msdn.microsoft.com/en-us/library/ms171624(v=vs.110).aspx
您在上面的链接中有很好的例子。值得一看。
答案 1 :(得分:-1)
使用线程。以编程方式填充DataGridView,而不是使用DataSource。
public void LoadDataGrid(DataTable d, DataGridView dg )
{
if (dg.InvokeRequired)
{
dg.BeginInvoke((MethodInvoker)delegate()
{
dg.Rows.Clear();
dg.ColumnCount = 7;
dg.Columns[0].Name = "Order No.";
dg.Columns[0].Width = 110;
dg.Columns[1].Name = "Order Date";
dg.Columns[1].Width = 100;
dg.Columns[2].Name = "Excepted rcv date";
dg.Columns[2].Width = 100;
dg.Columns[3].Name = "Supplier";
dg.Columns[3].Width = 150;
dg.Columns[4].Name = "Total Items";
dg.Columns[4].Width = 80;
dg.Columns[5].Name = "Total";
dg.Columns[5].Width = 80;
dg.Columns[6].Name = "Status";
dg.Columns[6].Width = 100;
});
foreach (DataRow row in d.Rows)
{
if (dg.InvokeRequired)
{
dg.BeginInvoke((MethodInvoker)delegate() { dg.Rows.Add(row[0].ToString(), row[1].ToString(), row[2].ToString(), row[3].ToString(), row[4].ToString(), row[5].ToString(), row[6].ToString()); });
}
Thread.Sleep(100);
}
}
}