prevent listview to lose selected item

后端 未结 6 1818
失恋的感觉
失恋的感觉 2021-01-18 03:43

I\'m currently working on a listview in winform c# and everytime I click on an empty space on the listview, the selected item is lost.

6条回答
  •  孤街浪徒
    2021-01-18 03:57

    This is much harder to do in WinForms than in WPF. WinForms has a SelectedIndexChanged event which doesn't tell you anything about what was already selected, plus it is fired every time a row is selected or deselected.

    So if a row is selected and you select a different row, you receive two SelectedIndexChanged events:

    1. one after the selected row is deselected
    2. another when the new row is selected.

    The problem is that, during event #1, the ListView has nothing selected and you don't know if event #2 is coming that will select the second row.

    The best you can do is wait until your application is idle (a few milliseconds after the selection has changed), and if the listview still has nothing selected, put back the last selected row.

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListView lv = (ListView)sender;
        if (lv.SelectedIndices.Count == 0)
        {
            if (!this.appIdleEventScheduled)
            {
                this.appIdleEventScheduled = true;
                this.listViewToMunge = lv;
                Application.Idle += new EventHandler(Application_Idle);
            }
        }
        else
            this.lastSelectedIndex = lv.SelectedIndices[0];
    }
    
    void Application_Idle(object sender, EventArgs e)
    {
        Application.Idle -= new EventHandler(Application_Idle);
        this.appIdleEventScheduled = false;
        if (listViewToMunge.SelectedIndices.Count == 0) 
            listViewToMunge.SelectedIndices.Add(this.lastSelectedIndex);
    }
    
    private bool appIdleEventScheduled = false;
    private int lastSelectedIndex = -1;
    private ListView listViewToMunge;
    

提交回复
热议问题