C#CellValueNeeded块表格

时间:2017-11-22 14:59:25

标签: c# winforms

我有一个继承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(我更新了我的代码)

1 个答案:

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