Winforms 控件。由鼠标向下而不是鼠标向上触发离开

Winforms 控件。由鼠标向下而不是鼠标向上触发离开,winforms,onmouseup,Winforms,Onmouseup,我有一个C.NET WinForm。在表单中,我允许用户通过双击ListView向ListView添加项目。这将向ListView添加一个TextBox控件,并将键光标放置在TextBox中,以便用户可以键入 我检测到用户以几种方式处理某个项目,例如按Enter、Esc、Tab…,但在他们离开TextBox时也是如此。离开TextBox 问题在于这组步骤: 用户触发文本框。在文本框外向下鼠标离开。 我将新项目添加到ListView。 我在ListView中选择新项目。 鼠标向上移动时,我刚刚选择

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

我检测到用户以几种方式处理某个项目,例如按Enter、Esc、Tab…,但在他们离开TextBox时也是如此。离开TextBox

问题在于这组步骤:

用户触发文本框。在文本框外向下鼠标离开。 我将新项目添加到ListView。 我在ListView中选择新项目。 鼠标向上移动时,我刚刚选择的新项目会失去焦点而未被选中。 我想要的是文本框。让鼠标点击触发,而不是鼠标下移。我怎样才能做到这一点

编辑:Cody建议使用ListView.LabeleEdit属性。以下是我尝试的结果:

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。如果双击listview中的任何其他空白区域,则会添加新项目,但不会进入编辑模式。这里发生了什么?

在另一个控件上按下鼠标会导致另一个控件请求焦点,因此焦点移动会导致文本框。保留事件发生。阻止任何其他可能的控件请求焦点不是一个非常可行的选择。但幸运的是,您只需要防止ListView使用鼠标向下移动焦点。因此,您需要覆盖ListView的WndProc,当MousedDown windows消息出现时,您当前正在显示一个文本框,您就可以接收该消息。为了避免这种情况,您不允许基类处理它。

将行添加到ListView控件中是一种非常奇怪的方式。为什么需要一个单独的文本框控件?你有没有试过把这个设定为真?另外,如果您需要允许用户在运行时添加项目,我会考虑使用DATAGIDVIEW控件。@ CODY——我正在尝试LabelEdgt,但是看到奇怪的行为。查看我的更新。