我试图让我的 DGV 在用户按下 Ctrl+PgDown 时不滚动。我想滚动其他一些控件。问题是,无论某些单元格是否处于编辑模式,都有一些不同的行为。
第一种情况。当没有编辑模式时,我们有以下事件链:
- DGV KeyDown
- DGV 卷轴
- DGV KeyUp
所以我处理 DGV KeyDown。听说我可以检测是否按下了 Ctrl+PgDown 并停止 DGV 滚动发生。
第二种情况。当有编辑模式并且我按下 Ctrl+PgDown 时,我们有以下事件链(请注意,在编辑模式下 DGV 会动态创建 TextBox 控件):
- 在 txtbox_PreviewKeyDown Key = ControlKey Ctrl = True
- 在 txtbox_KeyDown Key = ControlKey Ctrl = True
- 在 txtbox_PreviewKeyDown Key = Next Ctrl = True
- 在 dGV_Scroll
- 在 dGVEditor_KeyUp Key = Next Ctrl = True
- 在 dGVEditor_KeyUp Key = ControlKey Ctrl = False
- 在 dGVEditor_KeyUp Key = ControlKey Ctrl = False
我还跟踪 txtbox_KeyUp 和 txtbox_KeyPress 但它们从不触发。
所以在这种情况下,我只能在 PreviewKeyDown 中处理 Ctrl+PgDown 但不能阻止它触发滚动事件。
第三种情况。如果用户先按下 txtbox_KeyDown 键,则不会在 PageDown 键上触发(在编辑的单元格中未进行任何更改)。当在单元格中进行一些更改后按下 PageDown(或 Ctrl+PgDown)时,我会跟踪以下内容:
- txtbox_PreviewKeyDown Key = ControlKey Ctrl = True
- txtbox_KeyDown Key = ControlKey Ctrl = True
- txtbox_PreviewKeyDown Key = Next Ctrl = True
- txtbox_KeyDown Key = Next Ctrl = True
- txtbox_KeyUp 键 = 下一个 Ctrl = True
- txtbox_KeyUp Key = ControlKey Ctrl = False
所以在这种情况下,我可以在 txtbox_KeyDown 中处理 Ctrl+PgDown 并可以停止滚动。
我的问题是如何处理第二种情况?是否有某种方法(某些事件)可以在所有情况下由一个事件处理程序处理 Ctrl+PgDown?在我的例子中,我使用了三个:dGV_KeyDown、dGV_EditingControlShowing(用于配置捕获 txtbox_KeyDown)和 txtbox_KeyDown。