当前位置:首页 > 开发教程 > .net教程 >

C#开发中DataGridView的事件序列

时间:2016-05-23 09:41 来源:互联网 作者:源码搜藏 收藏

该 DataGridView中 当用户浏览网格控件生成许多事件。 有小区入口/出口,排进/出,单元格和行验证事件等。为了让这些事件的充分利用,发生时你需要知道,当你以不同的方式响应这些事件会发生什么。 本文提供: 其中包含一个网格和一个事件日志的应用程序。

DataGridView中当用户浏览网格控件生成许多事件。有小区入口/出口,排进/出,单元格和行验证事件等。为了让这些事件的充分利用,发生时你需要知道,当你以不同的方式响应这些事件会发生什么。本文提供:

  • 其中包含一个网格和一个事件日志的应用程序。通过编辑网格,你会看到在日志中生成的事件。
  • 有限状态机图,它描述了事件序列EditOnKeystroke编辑模式。

还提供了按钮,让你可以影响事件处理程序的行为。例如,当一个细胞无法验证可以产生事件的不同序列。改变这些验证答复仅仅是一个点击即可。

可执行文件在下载提供的,因此它的简单尝试一下,看看哪些事件的DataGridView是在你射击。

我并不支持所有的电网事件,日志会少些有用的,如果它是与所有的人都被塞住了,但我已经包括了主要的导航和验证事件。添加新的处理程序是微不足道的解释如下,如果你需要做到这一点。

让我们来看看应用程序第一次,那么我会更详细地描述的事件,并介绍了状态机。

使用应用程序

C#开发中DataGridView的事件序列

该应用程序包含一个事件日志,网格和工具栏。只要你运行它,电网事件将触发和这些事件将显示在日志中。在网格点击任何细胞和更多的事件将被添加到日志中。我觉得你的想法。

工具栏按钮

  • 电池故障 -当点击时,电池故障状态已启用。每当OnCellValidating事件被处理,处理程序将设置取消标志,指示验证失败。再次单击该按钮正常处理该事件。
  • 行失败 -点击时,行失效状态已启用。每当OnRowValidating事件被处理,处理程序将设置取消标志,指示验证失败。再次单击该按钮正常处理该事件。
  • 电网故障 -单击时,电网故障状态已启用。每当OnValidating事件被处理,处理程序将设置取消标志,指示验证失败。再次单击该按钮正常处理该事件。
  • 拒绝编辑 -当点击后,拒绝编辑状态已启用。每当OnCellBeginEdit事件被处理,处理程序将设置取消标志,表示拒绝编辑。再次单击该按钮正常处理该事件。
  • 日志点击 -点击时,日志点击状态已启用。这迫使一个空行日志中插入,只要点击鼠标。这往往使得它更容易使日志意义的,因为你可以很容易地看到自上次点击被触发的事件。
  • 编辑模式 -该网格支持各种编辑模式。每种模式来自不同的事件的行为。通过模式,点击自动编辑循环和日志会告诉你哪种模式被激活。
  • 干净的日志 -只需点击这个清空日志。所有记录都将丢失。如果要预先保存日志复制(^ C)的作品在事件日志中。

使用代码

代码并不复杂,而且我不打算本文是一个网格程序设计教程,所以我不会进入它的细节。你可能想,虽然做的是添加/删除网格事件。

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;
}

每个处理器执行以下操作:

  1. 调用基事件处理程序。
  2. 检查网格是否被初始化。
  3. 调用eventList.AddEvent()用字符串在日志中显示。我把处理单元指数字符串中的适当位置。
  4. 可选修改国旗在事件参数来表示一些具体该事件的行为。

如果你不感兴趣,我所支持的事件,只是删除处理。如果你想支持别人,添加处理程序为新事件,并按照上面的步骤。

了解事件的DataGridView

让我们以事件序列的高层视图,并包含在下载状态机的描述跟进。

有几种变化,以一般的情况下,但让我们通过假定电网编辑模式(启动DataGridView.EditMode)是EditOnKeystroke并且所有细胞,所有的行,和网格,是有效的。这使得电网的导航,没有滑倒进入编辑模式。当我们从一个细胞移动到另一个,我们看到(按顺序):

所述OnCellLeave()时试图来导航从细胞离开总会发生的事件。可能会出现额外假期的事件,这取决于我们移动到。例如:

Leave事件很简单,在这个意义上,未来事件不会影响在离开事件处理程序的任何更改参数。

一旦离开事件已经结束,验证事件将开始起火。现在,请记住我们在这里假设成功验证,因此验证/ Validated事件是成对出现的,确认后生效。你会从上面认识的顺序。

一切验证,因此如预期的细胞焦点可以移动,而该事件序列由烧制该输入事件为新小区完成。

  1. Leave事件
    • 移动到细胞上的同一行 - OnCellLeave()
    • 移动到细胞在不同的行 - OnCellLeave() OnRowLeave()
    • 网格外的设定对焦 - OnCellLeave() OnRowLeave() OnLeave() 这是网格离开的事件)
  2. 验证事件
    • 移动到同一行的单元格 - OnCellValidating() OnCellValidated()
    • 移动到细胞在不同的行 - OnCellValidating() OnCellValidated() OnRowValidating() OnRowValidated()
    • 将焦点设置外grid - OnCellValidating() , OnCellValidated() , OnRowValidating() ,OnRowValidated() , OnValidating() , OnValidated
  3. 输入事件
    • 移动到细胞上的同一行 - 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不受影响。


.net教程阅读排行

最新文章