5

ListViewItemの複数の行を表示するListViewがあります。ユーザーは、[編集]をクリックした後に開くダイアログを介してこれらの項目の1つを編集できます。ダイアログが閉じたら、選択した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の列が変更されたときに複数の場所でコードを更新する必要がないように、最初のコードスニペットをどのように変更する必要がありますか?

4

3 に答える 3

7

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

簡単なテストを行いましたが、このメソッドは既存のアイテムのテキストを問題なく変更しているようです。

于 2012-06-01T19:56:21.667 に答える
2

ListViewItembool Selectedこれらを選択または非選択にするために切り替えることができるプロパティがあります。

于 2012-06-01T19:15:43.420 に答える
0

私のために働いたはるかに簡単な解決策:

lstVwSNMPv3Settings.Items[lstVwSNMPv3Settings.SelectedIndices[0]] = myNewItem;

ただし、最初にアイテムが選択されていることを確認するように注意してください。

if (lstVwSNMPv3Settings.SelectedIndices.Count > 0) { ... }
于 2020-04-05T21:33:26.293 に答える