我只需要在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相同。
注意:
提前谢谢。
答案 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 *。
我可以看到它工作正常。没有例外。数据显示正确。