2012-06-01 79 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的數量。

我的「添加」事件期間處理此碼再使用問題通過給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

做你自己一個巨大的忙,谷歌和了解ObjectListView。簡而言之,這真是太棒了。 – banging

回答

4

您可以修改元素本身,而不是用另一個元素替換它,因爲ListViewItem是一個類,所以它是一個引用類型。

爲了做到這一點請按照下列步驟操作:

  • 目前獲得所選項目並將其保存到這樣的變量:ListViewItem selectedItem = lstVwSNMPv3Settings.SelectedItems[0];
  • 修改ToListViewItem方法void ToListViewItem(ListViewItem listViewItem)(返回void,並採取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

我將你的方法修改回原來的方法,但使用了你的想法。爲了將來的參考 - 設置ListViewItem的Text屬性具有將元素添加到SubItems數組的副作用。這就是我叫Clear的原因。 :) –

2

ListViewItem s有一個bool Selected屬性,您可以切換以使其處於選中狀態或未選中狀態。