【问题标题】:Put TextBox into editing mode programmatically以编程方式将 TextBox 置于编辑模式
【发布时间】:2019-12-06 20:23:26
【问题描述】:

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

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

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。

【问题讨论】:

  • 你在哪里/如何打电话给startEditing?请分享minimal reproducible example
  • 好的,我会准备一些东西...我认为关注子控件是一项常见的任务,不需要可重现的示例。
  • 至少我们需要知道你在哪里调用这个方法。 MouseDown 事件例如?还有一些ListView 属性的值,例如FullRowSelect
  • 我在 ListView.OnMouseDown 中调用它。不过不管怎样,我会尽量准备一个完整的例子。
  • 把你的代码移到MouseUp,问题就解决了。

标签: c# .net winforms listview textbox


【解决方案1】:

如果您在 listView 上调用事件处理程序,例如 listView.ItemSelectionChanged,则在触发 eventHandler 后焦点会返回到 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();
}

【讨论】:

  • 不知何故这不起作用,至少在我的情况下不是。我已经按照 RezaAghaei 的建议成功了。还是谢谢。
【解决方案2】:

OP:我在 ListView.OnMouseDown 中调用它。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2011-04-14
    • 1970-01-01
    • 2013-04-23
    • 2017-05-03
    • 2011-03-12
    • 2010-12-10
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多