为什么DataGridView第二次不显示数据?

时间:2016-03-10 18:08:21

标签: c# datagridview

我只需要在DataGridView中显示更新的数据。我尝试了一些选项,但所有选项都不起作用。 :-( 似乎是非常棘手的控制。

以下是代码:

    private delegate void displaySearchResultsDgvMethod(DataGridView pDgv, DataTable pTable);
    private void displaySearchResultsDgv(DataGridView pDgv, DataTable pTable)
    {
        if (pDgv.InvokeRequired)
        {
            pDgv.BeginInvoke(new displaySearchResultsDgvMethod(this.displaySearchResultsDgv), pDgv, pTable);
        }
        else
        {
            // Option 1. Smiple direct set
            // pDgv.DataSource = pTable;

            // option 2. update only when different DataTable object
            //bool isDifferent = (pDgv.DataSource == null || !pDgv.DataSource.Equals(pTable));
            //if (isDifferent)
            //    pDgv.DataSource = pTable;

            // option 3. use BindingSource
            if (pTable == null)
            {
                bsOrdersList.DataSource = null;
                bsOrdersList.ResetBindings(true);
            }
            else
            {
                bsOrdersList.DataSource = pTable;
            }
        }
    }

    private bool searchOrders(IProgressor pProgressor, object pState)
    {
        int count = AppDocument.Instance.SearchOrders(this.searchFields, AppDocument.ESearchOptions.EstimateOnly);
        if (count > 1000)
        {
            DialogResult dr = MessageBox.Show(Languages.TranslateFmt("{0} orders found, loading may take time. Do you want to continue?", count),
                Languages.Translate("Confirm"), MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
            if (dr == System.Windows.Forms.DialogResult.Cancel) return true;
        }

        /* Option 1-A: reset data before re-loading */ displaySearchResultsDgv(dgvOrdersList, null);
        Thread.Sleep(10);

        AppDocument.Instance.SearchOrders(this.searchFields, (this.joinToLoaded ? AppDocument.ESearchOptions.Join : AppDocument.ESearchOptions.None));
        updateStatusLabs(
            Languages.Translate("Displaying..."),
            Languages.TranslateFmt("+ {0} orders found...", AppDocument.Instance.SearchResults.Rows.Count));

        //displaySearchResults(lvOrdersList);
        displaySearchResultsDgv(dgvOrdersList, AppDocument.Instance.SearchResults);

        return true;
    }

使用选项#1 *它仅在第一次搜索呼叫时正确显示数据。在搜索订单的所有其他尝试中,尽管 AppDocument.Instance.SearchResults 中的数据存在(我看到UI中显示的行数,也在日志文件中),但它始终显示为空DataGridView。 / p>

使用选项#2 *显示数据,但在第二次搜索尝试后尝试滚动数据时崩溃。

选项#3的工作方式与选项1相同。

注意:

  • AppDocument.Instance.SearchResults 的类型是 DataTable
  • 总会有多次搜索尝试,但都将数据加载到 DataTable 对象的同一个实例中。有时数据将添加到 DataTable 对象,有时数据将替换 DataTable 对象的内容。我需要DataGridView在所有情况下都能正确显示数据。
  • 在这种特殊情况下,列组始终相同
  • 不要期望在DataGridView中编辑数据,它应该是只读的
  • 此处使用的 DataTable 对象的实例是手动创建的,因为没有可以使用此类数据接口的db-provider。
  • 我不想处理&重新创建 AppDocument.Instance.SearchResults DataTable 对象的实例。因此,重新使用 DataTable 对象的相同实例会很不错。注意:我知道如果我将处理 AppDocument.Instance.SearchResults DataTable 对象并创建新对象 - 这段代码可以正常工作但我想避免这种情况。
  • 是.NET 3.5

提前谢谢。

1 个答案:

答案 0 :(得分:0)

似乎我找到了非常简单的解决方案:

    private DataTable dummyTable = new DataTable("DUMMY");

    private bool searchOrders(IProgressor pProgressor, object pState)
    {
        int count = AppDocument.Instance.SearchOrders(this.searchFields, AppDocument.ESearchOptions.EstimateOnly);
        if (count > 1000)
        {
            DialogResult dr = MessageBox.Show(Languages.TranslateFmt("{0} orders found, loading may take time. Do you want to continue?", count),
                Languages.Translate("Confirm"), MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
            if (dr == System.Windows.Forms.DialogResult.Cancel) return true;
        }

        displaySearchResultsDgv(dgvOrdersList, this.dummyTable);
        Thread.Sleep(10);

        AppDocument.Instance.SearchOrders(this.searchFields, (this.joinToLoaded ? AppDocument.ESearchOptions.Join : AppDocument.ESearchOptions.None));
        updateStatusLabs(
            Languages.Translate("Displaying..."),
            Languages.TranslateFmt("+ {0} orders found...", AppDocument.Instance.SearchResults.Rows.Count));

        displaySearchResultsDgv(dgvOrdersList, AppDocument.Instance.SearchResults);

        return true;
    }

因此,只需创建一个附加表 - dummyTable ,然后只需在这两个表之间切换 - dummyTable 和* AppDocument.Instance.SearchResult *。

我可以看到它工作正常。没有例外。数据显示正确。