winforms 如何在单击ListView中不存在的行时保持Selected属性为真?

cld4siwp  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(107)

除非LightTime值发生更改,否则我的ListView必须将Selected属性保持为true。(因为ListView应保持此状态,并且Enabled应更改为false。)

当我在ListView外部单击时,Selected属性保持为true。但是,当我单击ListView的"不存在"行时,Selected属性不保持为true。

为了解决这个问题,我在ListView_Click事件中写了一段代码,但是ListView_Click事件只发生在有值的行上。
我该怎么办?

6ju8rftf

6ju8rftf1#

如果要将选定内容锁定到特定项,并且无论窗体或控件是否具有焦点都要将其突出显示,请执行下列操作:
首先,设置listView1.HideSelection = false
然后处理ItemSelectionChanged并相应地设置背景色、前景色和选定状态:

int LockSelectionToIndex = 0; //Lock selection to index 0
private void listView1_ItemSelectionChanged(object sender,
    ListViewItemSelectionChangedEventArgs e)
{
    e.Item.Selected = (e.ItemIndex == LockSelectionToIndex);
    if (e.Item.Selected)
    {
        e.Item.BackColor = SystemColors.Highlight;
        e.Item.ForeColor = SystemColors.HighlightText;
    }
    else
    {
        e.Item.BackColor = SystemColors.Window;
        e.Item.ForeColor = SystemColors.WindowText;
    }
}
bttbmeg0

bttbmeg02#

在这种情况下,抑制单击行为的一种方法是创建一个自定义ListViewEx类,该类覆盖WndProc并在单击鼠标时执行HitTest(当然,您必须转到设计器文件并交换出ListView引用)。

class ListViewEx : ListView
{
    const int WM_LBUTTONDOWN = 0x0201;
    protected override void WndProc(ref Message m)
    {
        if(m.Msg == WM_LBUTTONDOWN)
        {
            if (suppressClick())
            {
                m.Result = (IntPtr)1;
                return;
            }
        }
        base.WndProc(ref m);
    }
    private bool suppressClick()
    {
        var hitTest = HitTest(PointToClient(MousePosition));
        if ((hitTest.Item == null) || string.IsNullOrEmpty(hitTest.Item.Text))
        {
            return true;
        }
        return false;
    }
}

相关问题