Control.Leave由MouseDown触发,而不是MouseUp

时间:2011-03-06 09:13:40

标签: winforms onmouseup

我有一个C#.NET WinForm。在表单中,我允许用户通过双击ListView将项添加到ListView。这会将一个TextBox控件添加到ListView,并将键光标放在TextBox中,以便用户可以键入。

我检测用户在几种方法(例如,按下Enter键,Esc键,Tab键...)与物品完成,而且当它们离开(TextBox.Leave)文本框。

问题在于这一系列步骤:

  1. 用户通过将鼠标悬停在TextBox外部来触发TextBox.Leave。
  2. 我将新项目添加到ListView。
  3. 我在ListView中选择了新项目。
  4. 发生鼠标上移,我刚刚选择的新项目失去焦点而未被选中。
  5. 我想要的是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()的调用仅在用户双击新项目所在的位置时才有效。如果他们双击列表视图中的任何其他空白区域,则会添加新项目,但不会进入编辑模式。这是怎么回事?

1 个答案:

答案 0 :(得分:0)

在另一个控件上按下鼠标会导致其他控件请求焦点,因此焦点移动会导致TextBox.Leave事件发生。防止其他可能的控制请求焦点不是一个非常可行的选择。但幸运的是,您只需要阻止ListView使用MouseDown来移动焦点。因此,您需要覆盖ListView的WndProc,并且当MouseDown窗口消息出现并且您当前正在显示TextBox时,您会看到该消息。换句话说,你不允许基类处理它。