如何更新ListView的选定项目?
我有一个ListView,它显示多行ListViewItems。 用户可以通过单击“编辑”后打开的对话框编辑其中一个项目。 当对话框关闭时,我想修改所选的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
一个实用工具方法在’Add’事件(而不是’Edit’)中处理了这个代码重用问题:
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
有一个bool Selected
属性,您可以切换它以使它们被选中或不被选中。