该DataGridView中
当用户浏览网格控件生成许多事件。有小区入口/出口,排进/出,单元格和行验证事件等。为了让这些事件的充分利用,发生时你需要知道,当你以不同的方式响应这些事件会发生什么。本文提供:
EditOnKeystroke
编辑模式。还提供了按钮,让你可以影响事件处理程序的行为。例如,当一个细胞无法验证可以产生事件的不同序列。改变这些验证答复仅仅是一个点击即可。
可执行文件在下载提供的,因此它的简单尝试一下,看看哪些事件的DataGridView
是在你射击。
我并不支持所有的电网事件,日志会少些有用的,如果它是与所有的人都被塞住了,但我已经包括了主要的导航和验证事件。添加新的处理程序是微不足道的解释如下,如果你需要做到这一点。
让我们来看看应用程序第一次,那么我会更详细地描述的事件,并介绍了状态机。
该应用程序包含一个事件日志,网格和工具栏。只要你运行它,电网事件将触发和这些事件将显示在日志中。在网格点击任何细胞和更多的事件将被添加到日志中。我觉得你的想法。
OnCellValidating
事件被处理,处理程序将设置取消标志,指示验证失败。再次单击该按钮正常处理该事件。OnRowValidating
事件被处理,处理程序将设置取消标志,指示验证失败。再次单击该按钮正常处理该事件。OnValidating
事件被处理,处理程序将设置取消标志,指示验证失败。再次单击该按钮正常处理该事件。OnCellBeginEdit
事件被处理,处理程序将设置取消标志,表示拒绝编辑。再次单击该按钮正常处理该事件。代码并不复杂,而且我不打算本文是一个网格程序设计教程,所以我不会进入它的细节。你可能想,虽然做的是添加/删除网格事件。
在EventGrid.cs,你会看到我的支持,事件的事件处理程序OnCellEnter()
,OnCellBeginEdit()
等。例如:
protected override void OnRowValidating(DataGridViewCellCancelEventArgs e)
{
base.OnRowValidating(e);
if (!ctrlInitialised)
{
return;
}
eventList.AddEvent("OnRowValidating (" + e.ColumnIndex + "," + e.RowIndex +
") - " + (form1.RowFail "FAIL" : "OK"));
e.Cancel = form1.RowFail;
}
每个处理器执行以下操作:
eventList.AddEvent()
用字符串在日志中显示。我把处理单元指数字符串中的适当位置。如果你不感兴趣,我所支持的事件,只是删除处理。如果你想支持别人,添加处理程序为新事件,并按照上面的步骤。
让我们以事件序列的高层视图,并包含在下载状态机的描述跟进。
有几种变化,以一般的情况下,但让我们通过假定电网编辑模式(启动DataGridView.EditMode
)是EditOnKeystroke
并且所有细胞,所有的行,和网格,是有效的。这使得电网的导航,没有滑倒进入编辑模式。当我们从一个细胞移动到另一个,我们看到(按顺序):
所述OnCellLeave()
时试图来导航从细胞离开总会发生的事件。可能会出现额外假期的事件,这取决于我们移动到。例如:
Leave事件很简单,在这个意义上,未来事件不会影响在离开事件处理程序的任何更改参数。
一旦离开事件已经结束,验证事件将开始起火。现在,请记住我们在这里假设成功验证,因此验证/ Validated事件是成对出现的,确认后生效。你会从上面认识的顺序。
一切验证,因此如预期的细胞焦点可以移动,而该事件序列由烧制该输入事件为新小区完成。
OnCellLeave()
OnCellLeave()
,OnRowLeave()
OnCellLeave()
,OnRowLeave()
,OnLeave()
(这是网格离开的事件)OnCellValidating()
,OnCellValidated()
OnCellValidating()
,OnCellValidated()
,OnRowValidating()
,OnRowValidated()
OnCellValidating()
, OnCellValidated()
, OnRowValidating()
,OnRowValidated()
, OnValidating()
, OnValidated
OnCellEnter()
OnRowEnter()
,OnCellEnter()
OnRowEnter()
,OnCellEnter()
,的OnEnter()
(这是网格输入事件)把该批次一起,从有效行R1有效的单元格C1朝着行R2为C2单元格时,事件将按照下列顺序将触发:
OnCellLeave(C1)
OnRowLeave(R 1)
OnCellValidating(C1)
OnCellValidated(C1)
OnRowValidating(R 1)
OnRowValidated(R 1)
OnRowEnter(R 2)
OnCellEnter(C2)
现在,如前所述,这只是一个案例中,有许多变化,让我们遵循此情况下(即移动到细胞在不同的行)通过有限状态机(FSM)。该FSM处理所有的变化对于EditOnKeystroke
,当你熟悉了,它是不是一个伟大的飞跃EditOnEnter
。更多以后,但现在看看在主FSM DgvFsmMasterEoK.pdf。
在图的左上方开始在状态1。在这种状态下,被选择的单元中的一个,但不被编辑。当选择另一行的细胞,到状态5的转换发生。这表明,事件OnCellLeave()
,OnRowLeave()
,和OnCellValidating()
发生(按该顺序)。状态5是一个子FSM你可以找到DgvFsmA2.pdf。现在看看FSM A2,从状态1(假设OnCellValidating()
处理表明细胞是有效的),到状态2发生转变。这种转变表明事件OnCellValidated()
和OnRowValidating()
发生。接着,假设OnRowValidating()
表示该行是有效的,则事件OnRowValidated()
,OnRowEnter()
,和OnCellEnter()
发生,并且子状态机退出回到掌握的FSM状态1.(旧)和(新)参数在图上显示的事件表示在事件提供的参数是否引用单元格/行正在退出(旧)或输入的(新)。
通过例如工作过,您现在应该能够进行实验,(例如,当发生了什么OnRowValidating()
事件处理程序,指示该行是无效的)。也许与应用程序尝试并按照它通过的FSM。
因此,要改变编辑模式到什么EditOnEnter
?好了,主要的区别是在主FSM状态1。状态1在等待用户选择另一小区或按一个键以启动编辑模式该小区。随着EditOnEnter
,这种状态成为短暂的,也就是说,没有等待,因为只要细胞被选中,它会自动进入编辑模式。有没有挂在状态1身边了。的变化中可以看出DgvFsmMasterEoE.pdf。所有输入状态1现在触发事件OnCellBeginEdit()
进入该状态之前的最后一场比赛。您OnCellBeginEdit()
处理程序可以拒绝修改,留在状态2选定的单元格,或者接受它,并在状态3正如前面进入编辑模式。您可能还注意到该国3可以通过Escape键,它会被忽略不再退出编辑模式。没有其他的差异,则子的FSM不受影响。
热门源码