C # ListView проблема выбора элемента после удаления элемента - PullRequest
0 голосов
/ 18 февраля 2010

Использование Visual Studio 2008, .Net 3.5

У меня есть ListView, загруженный кучей элементов. У меня есть всплывающее окно правой кнопкой мыши для удаления элемента. После удаления элемента я перерисовываю представление списка, повторно открывая мои первичные данные, и сбрасываю выбранный элемент. Однако выбранный элемент не отображается как selected .

Идея кода:

public ListView m_lv;  
public MyDataCollection m_Data;  // Has a function to get data based on a tag.  

public void RemoveEventHandler(object sender, EventArgs e)  
{  
  int iSelectedItem= m_lv.FocusedItem.Index;

  int iDataIndexToRemove= m_Data.GetIndexOf(m_lv.FocusedItem.Tag.ToString());  

  m_Data.RemoveAt(iDataIndexToRemove);  // Remove the item.  

  if(0 != m_lv.Items.Count)  
  {  
    if(iSelectedItem == m_Data.Items.Count)  // Removed last.  
      iSelectedItem= m_Data.Items.Count - 1;  
  }

  m_lv.Items.Clear();  // Clear the list view items.  

  // Completely rebuild the list view.  
  foreach(MyData md in m_Data)  
  {  
    ListViewItem lvi= new ListViewItem(md.Column0.ToString());  
    lvi.SubItems.Add(md.Column1.ToString());  
    lvi.SubItems.Add(md.Column3.ToString());  
    lvi.SubItems.Add(md.Column4.ToString());  

    m_lv.Items.Add(lvi);  
  }  

  // Set up tags, column sizes, etc.  

  if(0 != m_lv.Items.Count)  
    m_lv.Items[iSelectedItem].Selected= true;  // Set the selection.      
}  

Если я сделаю что-то подобное, выбранный элемент никогда не покажет визуально как выбранный (без изменения цвета фона), если я не изменю размер столбца или не произведу сортировку. Затем он показывает, как выбран. Однако, если я использую отладчик или добавляю кнопку, чтобы использовать окно сообщения, чтобы показать мне выбранные элементы, элемент знает, он выбран.

Я знаю, что это какая-то проблема обновления / рисования - есть идеи?

Ответы [ 4 ]

2 голосов
/ 18 февраля 2010

Похоже, ваш ListView не имеет фокуса в результате всплывающего щелчка правой кнопкой мыши, и для HideSelection установлено значение true. Это будет означать, что, хотя ваш элемент выбран , WinForms не отображает его. Сначала выключите HideSelection, чтобы проверить, затем вам понадобится код, чтобы вернуть фокус обратно к списку.

Дополнительно:

  1. Если вы используете ListView.Items.Clear(), вы не потеряете столбцы и, следовательно, должны будете добавлять их каждый раз (что раздражало бы пользователей, которые изменили размер заголовков столбцов).
  2. Не делай ничего ясного и свежего. Установите каждое ListViewItem Name свойство в качестве первичного ключа, тогда вы можете сделать ListViewItem liToRemove = listView[name];
0 голосов
/ 05 октября 2011

Все оказалось довольно просто:

// Figure out index of item to remove, iRemoved, do some work....  

m_lv.Items.RemoveAt(iRemoved);  
m_lv.Refresh();

// Figure out what is left so new selection, iNewSelection, can be set....
m_lv.Items[iNewSelection].Selected = true;  

Забыли, я не обновлял это сообщение!

0 голосов
/ 18 февраля 2010

Используйте это:

m_lv.BeginUpdate();

// Add the items

m_lv.EndUpdate();
//
if(0 != m_lv.Items.Count)  
    m_lv.Items[iSelectedItem].Selected= true;  // Set the selection.   

Не вызывайте «Invalidate», использование «Начало / Конец обновления» должно предотвращать мерцание и обновление ...

Редактировать: Чтобы объяснить мои аргументы в пользу заявления ... BeginUpdate замораживает любые сообщения WM_PAINT ... EndUpdate размораживает WM_PAINT, это делает добавление элементов в список намного быстрее, и в любом случае, после вызова EndUpdate, оно обновится! Выбор может быть любым, я предпочитаю ставить его вне EndUpdate ... это мое мнение ... Invalidate генерирует сообщение WM_PAINT, но не обязательно обрабатывается сразу ... Не рекомендуется вызывать Invalidate () в цикл, в котором элементы добавляются, поскольку обновление будет замедляться!

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 18 февраля 2010

После установки выбора попробуйте вызвать Invalidate метод в ListView.

...