0

我有一个 C# 程序,它有两个元素,一个 TreeView 和一个 DataGridView 以及两个 EventHandelrs。当在 TreeView 中选择一个项目时,DataGridView 带有一个表格,显示一些信息并且可以由用户编辑。TreeView 中的每个项目都有自己唯一的表。当用户不关注 DataGridView 时,软件底层软件模型被更新(保存用户所做的更改):

aDataGridView_Leave(object sender, EventArgs e)
{
     //Update the software model (save the current DataGridView)
}

aTreeView_AfterSelect(object sender, EventArgs e)
{
    //Update the table that is shown in aDataGridView
}

我的问题是,如果用户通过在 TreeView 中选择不同的项目来分散对 DataGridView 的关注,我基本上在这些事件中的哪一个首先发生之间存在竞争条件(即使这一切都在一个线程上)。显然,在这种情况下,我希望 DataGridView_Leave 事件首先触发,否则用户对表所做的更改会被在保存更改之前加载的新表所吹走。

无论如何,有没有优雅的方式来强制执行首先发生的事件?

4

3 回答 3

0

立即想到的是某种计数器。为每个事件调用分配一个编号并存储最后处理的事件。这样你就可以检查它是否是一个旧事件并忽略它。我还没有看到它完全用在 C# 中,但是当网络延迟经常导致这种情况时,很多时候使用 AJAX。

于 2012-05-31T18:50:13.897 回答
0

听起来您可以通过isDirty在必须保存更改时保持一个布尔值来解决这个问题。您需要自己跟踪这一点,例如在属性设置器中。如有必要,签isDirtyaTreeView_AfterSelect并保存,aDataGridView_Leave这样如果没有更改就不会保存。

这应该可行,但听起来您的设置有点 hacky,并且当元素失去焦点时保存更改对于用户来说可能是违反直觉的。

于 2012-05-31T18:53:30.820 回答
0

我创建了一个简单的 Windows 窗体应用程序,其中包含树视图、网格视图和文本框来记录发生的事件。当您离开网格视图时,它的离开事件总是在选择后的树视图之前触发。

您是否将数据异步保存在 gridview 中?我可以看到您是否正在异步保存,然后在您的异步方法抓取数据以从网格中保存之前,select 之后的树视图可能会触发。

如果是这种情况,请将 gridviews 数据推送到堆栈并在执行保存的方法中将其弹出。

于 2012-05-31T21:05:13.350 回答