【问题标题】:How to select control to be focused from ListView如何从 ListView 中选择要聚焦的控件
【发布时间】:2012-03-29 16:45:05
【问题描述】:

考虑以下形式:

当我在列表视图中单击“1”或“2”时,我希望 textbox1 或 textbox2 成为焦点。

我写了以下代码:

  private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            if (e.Item.Text == "1")
                textBox1.Focus();
            else
                textBox2.Focus();
        }
    }

但它不起作用。 (文本框获得焦点片刻,但之后焦点又回到列表视图。)当我在列表视图中选择相关项目时,我希望焦点位于文本框上。

有什么建议吗?

感谢您的帮助。

【问题讨论】:

  • Select 的行为与 Focus() 的行为完全相同。
  • 尝试调试您的应用并查看哪个元素正在窃取焦点。
  • 显然 listView 本身正在窃取焦点。如何阻止这种情况?

标签: c# winforms listview focus


【解决方案1】:

由于事件被触发的顺序,焦点被重置为ListView

  1. MouseDown - 选择列表视图中的项目。
  2. ItemSelectionChanged - 调用 listView1_ItemSelectionChanged
  3. MouseUp - 如果光标仍在listView1 上,则将焦点设置到列表视图。

禁用该控件将起作用,但它会在单击该项目时添加一个“闪烁”。否则,您可以在MouseDownMouseUp/MoustLeave 上跟踪所选项目并适当设置焦点。

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    if (e.IsSelected)
    {
        if (e.Item.Text == "1")
            textBox1.Focus();
        else
            textBox2.Focus();
    }
    listView1.Enabled = false;
}

private void listView1_MouseUp(object sender, MouseEventArgs e)
{
    listView1.Enabled = true;

}

private void listView1_MouseLeave(object sender, EventArgs e)
{
    listView1.Enabled = true;
}

旁注 - 您需要使用 ListView 吗?对我进行了快速测试,ListBox 的行为方式符合您的要求,没有任何黑客攻击。

【讨论】:

  • 我需要这样的东西:!Error List。他们是怎么做到的?:)
【解决方案2】:

嗯,当 ListView 从 Focus/Select 命令返回时,它可能再次获得焦点。一种方法可能是使用计时器/延迟回调并触发它 - 即使其异步,例如 50 毫秒后,然后 ListView onclick 事件将在时间控制通过时完成。

【讨论】:

  • 是的,谢谢。这将起作用。但由于计时器,我不太喜欢这种方法。
  • 当然,我也是。但是,您可能会发现这是 LV 控件的内部功能,它并不是真正适合您使用的。我想你可以使用异步事件(但是你有非 Gui 线程 coms 来整理)。有使用LV的理由吗?我过去曾使用过一个面板并控制图标布局和鼠标位置/事件 - 这可能是一个更好的(尽管更多)替代方案???
  • 我相信在 VS 的错误列表中使用了类似行为的 LV:!Error List。或者可能是数据网格视图,但没有区别。但是他们是怎么做到的呢?
  • 您是否尝试过在鼠标向上而不是鼠标向下时触发。如果您担心两者之间的移动,您可以捕获鼠标向下的位置并触发鼠标向上的焦点,然后在 LV 中不应调用任何内容来拉回控制。
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 2010-10-30
  • 1970-01-01
  • 2018-07-26
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多