簡體   English   中英

如何更新 ListView 的選定項?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM