我为Form继承了一个类。这个类包含一个按钮和一个自定义的DataGridView。
DataGridView根据DataBase显示项目,加载可能需要很长时间。我实际上有:
public partial class dlgDetailsObj : Form
{
List<object> listItem;
public dlgDetailsObj(List<object> obj)
{
listItem = obj;
customGridView.CellValueNeeded += onCellValueNeeded;
customGridView.VirtualMode = true;
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
customGridView.RowCount = listItem.Count; // When RowCount changes, items are loaded
}
private void onCellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (e.RowIndex >= listItem.Count)
return;
String value = "";
customItem item = listItem[e.RowIndex];
if (e.ColumnIndex == columnId.Index)
{
value = item.Name; // If Name is null, it is loaded from dataBase (can take time)
}
/* Some else if*/
e.Value = value;
}我的问题是,当customGridView开始加载时,close按钮没有加载,用户无法单击它(如果加载时间太长,就会取消)。
我怎样才能把我的代码段放到确保用户可以取消的地方?
编辑:我正在使用虚拟GridView (我更新了我的代码)
发布于 2017-11-22 23:06:13
这里的问题是UI和数据加载都是在同一个线程中顺序发生的。
因此,在处理完所有数据之前,UI都会被阻塞。您应该尝试使用多线程,并在单独的线程而不是UI中加载数据。
像这样的东西
public partial class dlgDetailsObj : Form
{
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
UpdateListFromDatabase();
}
private static void UpdateListFromDatabase()
{
var thread = new Thread(() =>
{
//code that should run separately from the UI
});
thread.Start();
}
}这里有一个链接,它将帮助你学习基础知识。
https://visualstudiomagazine.com/Articles/2010/11/18/Multithreading-in-WinForms.aspx
https://stackoverflow.com/questions/47437800
复制相似问题