以编程方式将 TextBox 置于编辑模式

Put TextBox into editing mode programmatically

我正在修改多列列表视图以便能够编辑其单元格。当用户单击已选择的单元格时,将显示一个文本框,随后键入文本,将更改单元格内容(当然是在确认输入后)。

但是当我使用下面的方法时,出现了文本框,但它似乎没有被聚焦,所以没有进入编辑模式:插入符号没有显示,用键盘输入也没有改变文本文本框的字段。只有在第二次单击文本框后才会出现插入符号。

public void startEditing(TableIndex cell)
{
    editedCell = cell;
    editTextBox.Bounds = CellBounds(cell);
    editTextBox.Text = this[editedCell.RowIndex, editedCell.ColumnIndex];
    editTextBox.Show();
    editTextBox.Focus();
}

如何以编程方式将 TextBox 置于编辑模式?

在任何人提出建议之前:不,我不想切换到 DataGridView 等。每次我尝试使用它们时,它们都太慢了,让我觉得我在 Raspberry Pi.

上模拟 Windows

如果您在 listView 上调用事件处理程序,例如 listView.ItemSelectionChanged 焦点会在事件处理程序被触发后返回到 listView 框,这就是它切换回选择 listView 的原因。

您可以通过在原始事件处理程序之后添加另一个 GotFocus 事件处理程序并将焦点设置到文本框来解决此问题。

this.listView1.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler( this.listView1_SelectedIndexChanged);
this.listView1.GotFocus += new System.EventHandler(this.listView1_Focused);

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
//call startEditing code
}

private void listView1_Focused(object sender, EventArgs e)
{
editTextBox.Focus();
}

OP: I am calling it in ListView.OnMouseDown.

OnMouseUp 中显示并聚焦编辑器控件。

ListView 处理 WM_LBUTTONDOWN 并推送焦点,这意味着在处理您的 OnMouseDown 代码后,ListView 将获得焦点。

TextBox 获得焦点的最简单解决方法是显示 TextBox 并聚焦在 OnMouseUp