[英]How to update ListView's selected item?
我有一個顯示多行 ListViewItems 的 ListView。 用戶可以通過單擊“編輯”后打開的對話框來編輯這些項目之一。 當對話框關閉時,我想修改選定的 ListViewItem,使其反映新設置。
這是我目前更新我的項目的方式:
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 的列更改時不需要在多個位置更新我的代碼?
您可以修改元素本身而不是將其替換為另一個元素,因為 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
的同一個對象我做了一個快速測試,該方法似乎可以毫無問題地修改現有項目的文本。
ListViewItem
s 有一個bool Selected
屬性,您可以通過切換使它們被選中或不被選中。
一個更簡單的解決方案,對我有用:
lstVwSNMPv3Settings.Items[lstVwSNMPv3Settings.SelectedIndices[0]] = myNewItem;
但要小心,首先確保選擇了一個項目:
if (lstVwSNMPv3Settings.SelectedIndices.Count > 0) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.