ShortCutKey的动作确认
好!MultiRow For Winforms 7.0
如果一个键绑定了Action动作,该键就不会触发KeyDown事件。 目前试验的结果是这样,不过觉得这样也合理。如果想要在KeyDown事件中处理按键,需要先将Action清除。(个别按键,如Tab,还需要PreviewKeyDown中额外处理)
问题:
Me.GcMultiRow1.ShortcutKeyManager.Clear()
Me.GcMultiRow1.EditMode = EditMode.EditOnEnter
这种设置下,在Cell中按下Tab键,我认为应该没有任何动作,但是实际上Tab键按下后,会使MultiRow失去焦点,触发Leave事件。
从现象上看像是执行了系统的Tab动作。
但是我在ProcessCmdKey将Tab键吃掉了,按下tab键的时候仍然触发Leave事件。
所以是不是MultiRow在这种情况下,做了什么处理? MultiRow没有做任何的处理,这时你的消息被直接派发到了GcMultiRow.EditingControl上,默认TextBoxCell的EditingControl是TextBox,它内部有特殊的Tab处理逻辑,所以想禁止他的能力你需要在Form的ProcessDialogKey中Handle这个消息。
示例代码:
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Tab)
{
if (this.ActiveControl != null &&
this.ActiveControl.Parent != null &&
this.ActiveControl.Parent.Parent is GcMultiRow)
{
return false;
}
}
return base.ProcessDialogKey(keyData);
}
回复 2楼dafo的帖子
好!
这种方案我尝试过,这样做的话相当于彻底把这个键屏蔽了。
我只是希望Tab键做触发默认动作,然后在KeyDown中处理Tab键的行为。
几经周折,问题已经解决了。
多谢版主。 回复 2楼dafo的帖子
发现一个现象,斑竹看看我描述的对不对,是否可以改进。
需求:按下Tab键的时候移动活动单元格,移动之前,在CellValidating事件中check单元格的值,如果值不正确则取消移动Cancel,将该单元格的颜色设置为红色,感觉这是很常用的需求。
现象:Check失败后,单元格显示的颜色没有变化,但是输出log发现该单元格的颜色的确已经被设置为红色,只不过没有重绘。
猜测原因:在CellValidating中设置颜色,当CellValidatin被Cancel之后,执行了CellLeave和CellEnter事件,但是这两个事件没有重新绘制颜色。为什么没有执行CellBeginEdit和CellEndEdit事件?我猜测是Tab键默认并没有绑定BeginEdit和EndEdit的动作,同时Cancel前后该单元格的EditState没有变化,所以可能内部没有执行CellXXXXEdit事件。
基于以上分析,我给Tab键绑定了BeginEdit和EndEdit两个动作,结果颜色就被成功设置了。
是不是说颜色修改以后,需要触发BeginEdit后,颜色才会真正被绘制到单元格上?(大部分情况下CellEnter和BeginEdit好像都会执行,但是以上情况比较特殊) 我试验了你的Case,但是在我这里单元格背景色是可以更新的,是否可以给一些你的相关代码我们测试下,或者你建一个干净的Sample测试下。
如果你要刷新GcMultiRow建议使用方法this.gcMultiRow1.Refresh()来强制刷新,不用调用BeginEdit和EndEdit。 回复 5楼dafo的帖子
使用干净的Sample也不好使。
Private Sub EidtMultiRow_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.GcMultiRow1.EditMode = GrapeCity.Win.MultiRow.EditMode.EditOnEnter
Me.GcMultiRow1.ShortcutKeyManager.Clear()
End Sub
Private Sub GcMultiRow1_KeyDown(sender As Object, e As KeyEventArgs) Handles GcMultiRow1.KeyDown
If e.KeyCode = Keys.Enter Then
GrapeCity.Win.MultiRow.SelectionActions.MoveToNextCell.Execute(Me.GcMultiRow1)
End If
End Sub
Private Sub GcMultiRow1_EditingControlShowing(sender As Object, e As GrapeCity.Win.MultiRow.EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing
Dim controlType As String = e.Control.GetType.Name
If controlType = "TextBoxEditingControl" Then
Dim tbControl As TextBoxEditingControl = TryCast(e.Control, TextBoxEditingControl)
If tbControl IsNot Nothing Then
RemoveHandler tbControl.KeyDown, AddressOf Me.GcMultiRow1_KeyDown
AddHandler tbControl.KeyDown, AddressOf Me.GcMultiRow1_KeyDown
End If
End If
End Sub
Private Sub GcMultiRow1_CellValidating(sender As Object, e As CellValidatingEventArgs) Handles GcMultiRow1.CellValidating
If e.FormattedValue = "123" Then
Me.GcMultiRow1.CurrentCell.Style.BackColor = Color.Red
e.Cancel = True
End If
End Sub 回复 5楼dafo的帖子
不好意思,高级编辑器被屏蔽了,使用不了。 GcMultiRow只有在进入编辑状态时才渲染EditingControl,在你的Case中当Validating失败,EditingControl没有机会退出编辑状态,应此你之前的方案是一个办法,强行EndEdit再EnterEdit使得GcMultiRow有一个机会把Cell对象上用户设置的Style应用到EditingControl上。
我这里有另外一个方案,你可以参考:
void gcMultiRow1_CellValidating(object sender, GrapeCity.Win.MultiRow.CellValidatingEventArgs e)
{
this.gcMultiRow1.CurrentCell.Style.BackColor = Color.Red;
this.gcMultiRow1.EditingControl.BackColor = Color.Red;
this.gcMultiRow1.EditingPanel.BackColor = Color.Red;
e.Cancel = true;
}
回复 8楼dafo的帖子
了解了,和我想象的一样,明白为什么就好了。
谢谢斑竹的解答和方案! 回复 8楼dafo的帖子
以前对EditingControl和Cell没什么理解,遇到了一些问题之后,发现应该好好认识一下。
页:
[1]
2