1

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

我检测到用户以多种方式完成了项目(例如按 Enter、Esc、Tab...),而且当他们离开 (TextBox.Leave) 文本框时也是如此。

问题是这组步骤:

  1. 用户通过将鼠标移到 TextBox 外触发 TextBox.Leave。
  2. 我将新项目添加到 ListView。
  3. 我在 ListView 中选择新项目。
  4. 鼠标上移,我刚刚选择的新项目失去焦点并被取消选择。

我希望 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() 的调用仅在用户双击新项目将显示的位置时起作用。如果他们双击列表视图中的任何其他空白区域,则会添加新项目,但不会进入编辑模式。这里发生了什么?

4

1 回答 1

0

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

于 2011-03-06T09:19:45.827 回答