2012-06-01 4 views
3

У меня есть ListView, который отображает несколько строк ListViewItems. Пользователь может редактировать один из этих элементов через диалог, который открывается после нажатия «Изменить». Когда диалог закрывается, я хотел бы изменить выбранный ListViewItem таким образом, чтобы он отражал новые настройки.Как обновить выбранный элемент ListView?

Вот как я в настоящее время обновить мою деталь:

private void btnEditSnmpV3Setting_Click(object sender, EventArgs e) 
{ 
    if (lstVwSNMPv3Settings.SelectedItems.Count > 0) 
    { 
     ListViewItem selectedItem = lstVwSNMPv3Settings.SelectedItems[0]; 
     NetworkDiscoverySnmpSetting settings = (NetworkDiscoverySnmpSetting)selectedItem.Tag; 
     NetworkDiscoverySnmpV3SettingsDialog dialog = new NetworkDiscoverySnmpV3SettingsDialog(settings); 

     //Pass in the owner for centering of dialog. 
     if (dialog.ShowDialog(this) == DialogResult.OK) 
     { 
      selectedItem.SubItems.Clear(); 
      selectedItem.Text = settings.SnmpV3Username; 
      selectedItem.SubItems.Add(settings.SecurityMode.ToString()); 
      selectedItem.SubItems.Add(settings.AuthenticationProtocol.ToString()); 
      selectedItem.SubItems.Add(settings.PrivacyProtocol.ToString()); 
      selectedItem.Tag = settings; 
     } 
    } 
} 

Я нашел, что это плохое решение в связи с тем, что мне нужно коснуться кода в нескольких местах, если номер моего элемента ListView столбцов изменены.

я обращался этот вопрос кода многократного использования во время мероприятия «Добавить» (в отличие от «Edit»), давая NetworkDiscoverySnmpSetting метод полезности:

public ListViewItem ToListViewItem() 
{ 
    ListViewItem listViewItem = new ListViewItem(); 
    listViewItem.Text = SnmpV3Username; 
    listViewItem.SubItems.Add(SecurityMode.ToString()); 
    listViewItem.SubItems.Add(AuthenticationProtocol.ToString()); 
    listViewItem.SubItems.Add(PrivacyProtocol.ToString()); 
    listViewItem.Tag = this; 
    return listViewItem; 
} 

, который используется как так:

private void btnAddSnmpV3Setting_Click(object sender, EventArgs e) 
{ 
    NetworkDiscoverySnmpSetting settings = new NetworkDiscoverySnmpSetting(NetworkDiscovery.ID); 
    NetworkDiscoverySnmpV3SettingsDialog dialog = new NetworkDiscoverySnmpV3SettingsDialog(settings); 
    //Pass in the owner for centering of dialog. 
    if (dialog.ShowDialog(this) == DialogResult.OK) 
     lstVwSNMPv3Settings.Items.Add(settings.ToListViewItem()); 
} 

К сожалению, ListView.SelectedItems не разрешает модификацию коллекции. Таким образом, это не компилируется:

lstVwSNMPv3Settings.SelectedItems[0] = settings.ToListViewItem(); 

Как я должен изменить свой первый код-фрагмент кода, так что мне не нужно, чтобы обновить свой код в нескольких местах, когда столбцы ListView меняются?

+0

Сделайте ОГРОМНУЮ пользу и Google и узнайте о ObjectListView. Это, в 1 слове, УДИВИТЕЛЬНО. – banging

ответ

4

Вы можете изменить сам элемент, а не заменять его другим, поскольку ListViewItem является классом, поэтому он является ссылочным типом.

Для этого выполните следующие действия:

  • получить в данный момент выбранный элемент и сохранить его в переменной, как это: ListViewItem selectedItem = lstVwSNMPv3Settings.SelectedItems[0];
  • модифицировать свой метод ToListViewItem к void ToListViewItem(ListViewItem listViewItem) (возвращается тщетным и принять ListViewItem объект как параметр и изменить его вместо создания нового объекта.Это также должно скорее модифицировать свойства существующих подэлементов, чем создавать новые. Он может выглядеть примерно так:

    public void ToListViewItem(ListViewItem listViewItem) 
    { 
        listViewItem.Text = SnmpV3Username; 
        listViewItem.SubItems[0].Text = SecurityMode.ToString(); 
        listViewItem.SubItems[1].Text = AuthenticationProtocol.ToString(); 
        listViewItem.SubItems[2].Text = PrivacyProtocol.ToString(); 
        listViewItem.Tag = this; 
    } 
    
  • вызов ToListViewItem(selectedItem);

  • вы не должны назначить измененный элемент обратно в коллекцию, потому что вы используете ссылку, которая означает, что вы просто изменить один и тот же объект, который в ListView

Я проверил быструю проверку, и, похоже, метод не меняет тексты существующих элементов без проблем.

+1

Я изменил ваш метод обратно в основном, что было моим оригинальным, но использовал вашу идею. Для дальнейшего использования - установка свойства Text в элементе ListViewItem имеет побочный эффект добавления элемента в массив SubItems. Вот почему я звонил в Clear. :) –

2

ListViewItem s имеет свойство bool Selected, которое вы можете переключить, чтобы сделать их выбранными или не выбранными.

Смежные вопросы