C# 如何从ListView中选择要聚焦的控件

C# 如何从ListView中选择要聚焦的控件,c#,winforms,listview,focus,C#,Winforms,Listview,Focus,考虑以下形式: 当我在listview中单击“1”或“2”时,我希望textbox1或textbox2成为焦点 我编写了以下代码: private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { if (e.IsSelected) { if (e.Item.Text == "1")

考虑以下形式:

当我在listview中单击“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();
        }
    }
但它不起作用。(Textbox会聚焦一段时间,但之后焦点会回到listview。)我希望在listview中选择相关项目时,焦点会在Textbox上

有什么建议吗


谢谢您的帮助。

Mmmm,当ListView从focus/Select命令返回时,它可能再次接收到焦点。一种方法可能是使用计时器/延迟回调并触发该回调-即,使其异步,比如说50毫秒后,ListView onclick事件将在传递控件时完成。

Mmmm,当ListView从focus/Select命令返回时,可能再次接收到焦点。一种方法可能是使用计时器/延迟回调,然后只触发它-即使其异步,比如说50毫秒后,ListView onclick事件将在传递控件时完成。

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

  • MouseDown-选择列表视图中的项目
  • ItemSelectionChanged-调用
    listView1\u ItemSelectionChanged
  • 鼠标悬停-如果光标仍在列表视图1上,则将焦点设置为列表视图
  • 禁用控件将起作用,但单击该项时会增加“闪烁”。否则,您可以在
    MouseDown
    MouseUp
    /
    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;
    }
    

    旁注-是否需要使用
    列表视图
    ?在我这边做了一个快速测试,一个
    列表框
    按照你想要的方式运行,没有任何攻击。

    由于触发事件的顺序,焦点被重置为
    列表视图

  • MouseDown-选择列表视图中的项目
  • ItemSelectionChanged-调用
    listView1\u ItemSelectionChanged
  • 鼠标悬停-如果光标仍在列表视图1上,则将焦点设置为列表视图
  • 禁用控件将起作用,但单击该项时会增加“闪烁”。否则,您可以在
    MouseDown
    MouseUp
    /
    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;
    }
    

    旁注-是否需要使用
    列表视图
    ?在我这方面做了一个快速测试,
    ListBox
    的行为符合您的要求,没有任何黑客攻击。

    Select的行为与Focus()的行为完全相同。尝试调试您的应用程序,看看哪个元素正在窃取焦点。很明显,listView本身正在窃取焦点。如何停止此操作?Select的行为与Focus()的行为完全相同。请尝试调试应用程序,并查看哪个元素正在窃取焦点。显然,listView本身正在窃取焦点。如何阻止这一切?是的,谢谢。这会奏效的。但我不太喜欢这种方法,因为计时器太长了。当然,我也是。然而,您可能会发现这是LV控制的内部,它并不真正适合您所使用的。我想您可以使用异步事件(但随后您需要整理非Gui线程COM)。是否有理由使用LV?我过去使用过面板,控制图标布局和鼠标位置/事件-这可能是一个更好的选择(尽管moren参与了)?我相信在VS的错误列表中使用了具有类似行为的LV:!。或者可能是datagrid视图,但没有区别。但是他们是怎么做到的呢?你有没有试过用鼠标向上而不是向下触发呢。如果你对两者之间的移动感到担忧,你可以捕捉鼠标下降时的位置并触发鼠标上升时的焦点,那么在LV中不应该调用任何东西来拉回控制。是的,谢谢。这会奏效的。但我不太喜欢这种方法,因为计时器太长了。当然,我也是。然而,您可能会发现这是LV控制的内部,它并不真正适合您所使用的。我想您可以使用异步事件(但随后您需要整理非Gui线程COM)。是否有理由使用LV?我过去使用过面板,控制图标布局和鼠标位置/事件-这可能是一个更好的选择(尽管moren参与了)?我相信在VS的错误列表中使用了具有类似行为的LV:!。或者可能是datagrid视图,但没有区别。但是他们是怎么做到的呢?你有没有试过用鼠标向上而不是向下触发呢。如果你对两者之间的移动感到担忧,你可以捕捉鼠标下降时的位置并触发鼠标上升时的焦点,那么在LV中不应该调用任何东西来拉回控制。我需要这样的东西:!。他们是怎么做到的?:)我需要这样的东西:!。他们是怎么做到的?:)