我有一个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
实用程序方法,在“添加”事件(而不是“编辑”)中处理了此代码重用问题:
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 :(得分:5)
您可以修改元素本身而不是将其替换为另一个元素,因为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 :(得分:2)
ListViewItem
具有bool Selected
属性,您可以切换以选择或不选择它们。
答案 2 :(得分:0)
一个更简单的解决方案,对我有用:
lstVwSNMPv3Settings.Items[lstVwSNMPv3Settings.SelectedIndices[0]] = myNewItem;
但是请务必先确保已选择一项:
if (lstVwSNMPv3Settings.SelectedIndices.Count > 0) { ... }