Таймер выбора ListView - PullRequest
       6

Таймер выбора ListView

1 голос
/ 16 февраля 2010

Я использую следующий метод, чтобы выбрать все элементы в ListView:

private void listView_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        foreach (ListViewItem item in listView.Items)
            item.Selected = true;

        e.Handled = true;
    }
}

Когда я щелкаю по уже выбранному элементу и затем нажимаю Ctrl + A, он выбирает все элементы, но через 1 секунду выбор возвращается к единственному элементу, который был нажат.

Решение

Я не смог найти, где ListView запускает таймер или изменяет выбор, просто игнорирование WM_TIMER не останавливает таймер, поэтому мы должны восстановить выбор вручную:

public class CustomListView : ListView
{
    private const int WM_TIMER = 0x113;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_TIMER)
        {
            base.WndProc(ref m);
        }
        else
        {
            var selectionCache = Items.Cast<ListViewItem>().Select(x => x.Selected).ToArray();

            BeginUpdate();

            base.WndProc(ref m);

            for (int i = 0; i < Items.Count; i++)
                Items[i].Selected = selectionCache[i];

            EndUpdate();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...