我有一个继承Form的类。此类包含Button和自定义DataGridView等。
DataGridView根据数据库显示项目,可能需要很长时间才能加载。我实际上有:
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开始加载时,关闭按钮没有被加载,用户无法点击它(如果加载太长则取消)。
如何设置我的代码以确保用户可以取消?
编辑: 我正在使用虚拟GridView(我更新了我的代码)
答案 0 :(得分:0)
这里的问题是UI和数据加载都是在同一个线程中顺序发生的。
因此UI被阻止,直到处理完所有数据。您应该尝试使用多线程并在与UI不同的线程中加载数据。
像这样的东西
do
{
for (int number = 1; number <= divNum; number++)
if (number % divisor == 0) countH++;
for (int i = 0; i < count; i++)
Console.Write(" ");
if ((c = divNum % divisor ) < divisor )
{
Console.WriteLine(" " + ((divNum- (countH * divisor ))) * 10);
}
else Console.WriteLine(" " + (divNum- (countH * divisor )));
c = divNum % divisor ;
if (c < divisor )
{
divNum = c * 10;
}
count++; countH = 0;
} while ((divNum >= divisor ) && (count < x));
这是一个可以帮助您掌握基础知识的链接。
https://visualstudiomagazine.com/Articles/2010/11/18/Multithreading-in-WinForms.aspx