De-select/ listBox WinForm C# 的高亮逻辑

De-select/ highlight logic for listBox WinForm C#

当再次单击同一项目或简单地单击列表框(如果可能的话)时,我正在努力形成取消select项目的逻辑。

目前我已经设置了一个变量 prevSelectedIndex = -2 然后在列表框的 selectedIndexChanged() 方法中 -> 我检查 list.SelectedIndex == prevSelectedIndex 如果那是真的,那么我调用列表的 ClearSelected() 方法。

如果为 false,我设置 prevSelectedIndex = SelectedIndex 并将 selectedIndex 传递给一个函数,这样我就可以使用项目 selected 中的数据预先设置一些输入字段。但是,它无法删除它,因为我认为列表框的 selectedIndexChanged() 方法显然只在它确实发生变化而不是保持不变时调用(用于再次单击相同项目时尝试取消 select ) .

此外,当我单击 within/outside 列表框而不是某个项目时,我尝试检查输出是否可能会更改为索引以外的其他内容,例如 -1,但这并没有发生。

感谢任何帮助!

谢谢

如果您需要通过鼠标输入切换项目的选择状态,ListBox.SelectedIndexChanged 不是要处理的正确事件。您需要处理鼠标事件。

例如,您可以处理 MouseClick 事件来调用 IndexFromPoint 方法,如果您点击某个项目 returns 或 -1 如果你点击客户区。然后,您可以将该索引与 class 字段进行比较,该字段通过鼠标或键盘箭头存储最后选择的索引,如果数字相等则取消选择该项目。

将其与其他要求放在一起

public partial class YourForm : Form
{
    private int toggleIndex = -1;

    public YourForm()
    {
        InitializeComponent();
    }

    private void yourListBox_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            var s = sender as ListBox;
            var i = s.IndexFromPoint(e.Location);

            if (i >= 0)
            {
                if (i == toggleIndex)
                {
                    s.SetSelected(i, false);
                    // or
                    // s.ClearSelected();
                    i = -1;
                }                
            }
            else
            {
                s.ClearSelected();
            }

            toggleIndex = i;
        }
    }

    private void yourListBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        toggleIndex = yourListBox.SelectedIndex;
    }

    private void yourListBox_Leave(object sender, EventArgs e)
    {
        toggleIndex = -1;
        yourListBox.ClearSelected();
    }
}