master-detail datagridview:将焦点从详细记录移动到非父节点的主记录时RowValidating错误行为

时间:2014-09-29 06:49:30

标签: c# events datagridview master-detail

在我的WinForms应用中。我有master-detail DataGridViews。我已将RowValidating事件处理程序附加到我的详细信息网格中,以进行一些验证和计算。

只要详细记录失去焦点,就会触发RowValidating。

问题是:

当我将焦点放在详细记录上(用于编辑或其他),然后通过单击不是THAT详细记录的父级的记录将焦点移动到主网格时,会发生以下情况:

首先:触发该详细记录的RowValidating事件,这是合乎逻辑的(因为它失去了焦点)。

然后:触发其父记录的RowValidating事件,这也是合乎逻辑的(因为我们将焦点移到了新的父节点上)。

然后:详细记录的RowValiding事件再次被触发!!! RowIndex与先前失去焦点的详细记录的索引相同,但现在详细网格中存在的实际细节是NEW父级(我们点击了)的详细信息!这不是逻辑的。

我尝试了其他事件(CellLeave,RowLeave)并且它们的行为相同: 细节事件首先针对失去焦点的细节行触发, 然后为其父级触发主事件, 然后详细事件被触发了AGAIN,但是有关旧详细记录的新父级和RowIndex的详细信息...

为什么详细事件会被触发两次?为什么他们使用前一个详细记录的RowIndex?

P.S。我下载了一个主 - 细节DGV演示,并尝试了相同的事件,并发生了类似的事情。 演示:

http://www.codeproject.com/Articles/42569/Three-Master-Details-Related-Grids-on-the-Same-For

1 个答案:

答案 0 :(得分:0)

对于某些研究,当我点击主网格时,在完成所有主验证后,执行细节RowValidating,然后执行细节RowEnter(即使我没有点击细节)..所以,因为输入了详细信息,RowValidating在详细RowEnter之前触发。因为我们输入了新的细节,所以旧的细节应该被验证,这就是RowIndex是旧细节行的索引的原因,但不幸的是,在对它们执行RowValidating之前已经从细节网格中删除了旧细节,因此验证是“意外”应用的关于新细节。

解决这个问题我添加了以下内容:

private void detailGrid_RowValidating(object sender , DataGridViewCellCancelEventARgs e)
{

  string current_parent_row_id =  masterGrid.CurrentRow.Cells["id"].Value.ToString();
  string validated_parent_row_id = detailGrid.Rows[0].Cells["id"].Value.ToString();

if (current_parent_row_id != validated_parent_row_id) return;

// validation goes next ...

}