предотвратить просмотр списка потерянного элемента - PullRequest
7 голосов
/ 04 марта 2010

Я сейчас работаю над списком в winform c # и каждый раз, когда я нажимаю на пустое место в списке, выбранный элемент потерян.

Ответы [ 5 ]

9 голосов
/ 31 июля 2012

Элемент управления listview имеет свойство HideSelection, по умолчанию True. Сделайте это False, и вы готовы пойти ... в некоторых случаях этого достаточно.

2 голосов
/ 21 августа 2011

Вы должны унаследовать от класса ListView и выполнить низкоуровневую обработку сообщений

class ListViewThatKeepsSelection : ListView
{
    protected override void WndProc(ref Message m)
    {
        // Suppress mouse messages that are OUTSIDE of the items area
        if (m.Msg >= 0x201 && m.Msg <= 0x209)
        {
            Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
            var hit = this.HitTest(pos);
            switch (hit.Location)
            {
                case ListViewHitTestLocations.AboveClientArea:
                case ListViewHitTestLocations.BelowClientArea:
                case ListViewHitTestLocations.LeftOfClientArea:
                case ListViewHitTestLocations.RightOfClientArea:
                case ListViewHitTestLocations.None:
                    return;
            }
        }
        base.WndProc(ref m);
    }
}
2 голосов
/ 28 марта 2010

Я сделал это так:

private void lvReads_MouseUp(object sender, MouseEventArgs e)
    {
        if (lvReads.SelectedItems.Count == 0)
            if (lvReads.Items.Count > 0)
                lvReads.Items.Find(currentName, false)[0].Selected = true;
    }

и

private void lvReads_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lvReads.SelectedItems.Count == 1)
        {               
            selectedIndex = lvReads.SelectedIndices[0];

            if (currentName != lvReads.Items[selectedIndex].Name)
            {

                //load item
            }

            currentName = lvReads.Items[selectedIndex].Name;
        }
    }
2 голосов
/ 04 марта 2010

Я думал, что есть свойство, которое препятствовало этому, но теперь я не могу его найти.

Вы можете попробовать это:

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListView listView = sender as ListView;
    if (listView.SelectedItems.Count == 0)
        foreach (object item in e.RemovedItems)
            listView.SelectedItems.Add(item);
}
1 голос
/ 08 марта 2010

Это гораздо сложнее сделать в WinForms, чем в WPF. WinForms имеет событие SelectedIndexChanged, которое ничего не говорит о том, что уже было выбрано, плюс , оно запускается каждый раз, когда строка выбирается или отменяется.

Таким образом, если выбрана строка и вы выбрали другую строку, вы получите два события SelectedIndexChanged:

  1. один после выбранной строки отменяется
  2. еще один при выборе новой строки.

Проблема в том, что во время события # 1 в ListView ничего не было выбрано, и вы не знаете, наступает ли событие # 2, которое выберет вторую строку.

Лучшее, что вы можете сделать, это подождать, пока ваше приложение не будет работать (через несколько миллисекунд после изменения выбора), и, если в списке пока ничего не выбрано, вернуть последнюю выбранную строку.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...