我有一个C#.NET WinForm。在表单中,我允许用户通过双击ListView将项添加到ListView。这会将一个TextBox控件添加到ListView,并将键光标放在TextBox中,以便用户可以键入。
我检测用户在几种方法(例如,按下Enter键,Esc键,Tab键...)与物品完成,而且当它们离开(TextBox.Leave)文本框。
问题在于这一系列步骤:
我想要的是TextBox.Leave由MouseUp触发,而不是MouseDown。我怎么能做到这一点?
编辑:Cody建议使用ListView.LabelEdit属性。以下是我的结果:
listView_DoubleClick(...) {
listView.LabelEdit = true;
if(double clicked on existing listViewItem) {
listViewItem.BeginEdit(); //this works as expected
} else {
var newItem = listView.Items.Add("");
newItem.BeginEdit(); //this doesn't work, see below
}
}
对newItem.BeginEdit()的调用仅在用户双击新项目所在的位置时才有效。如果他们双击列表视图中的任何其他空白区域,则会添加新项目,但不会进入编辑模式。这是怎么回事?
答案 0 :(得分:0)
在另一个控件上按下鼠标会导致其他控件请求焦点,因此焦点移动会导致TextBox.Leave事件发生。防止其他可能的控制请求焦点不是一个非常可行的选择。但幸运的是,您只需要阻止ListView使用MouseDown来移动焦点。因此,您需要覆盖ListView的WndProc,并且当MouseDown窗口消息出现并且您当前正在显示TextBox时,您会看到该消息。换句话说,你不允许基类处理它。