簡體   English   中英

如何在運行時使用 C#/WinForms 從 ComboBox 中刪除項目

[英]How to delete items from a ComboBox at runtime using C# / WinForms

我有一個組合框,我已經可以向其中添加項目,並且我希望能夠在按下刪除鍵時刪除我選擇的項目。

這是我現在使用的代碼。

    private void commandComboBox_KeyDown(object sender, KeyEventArgs e)
    {
        var myComboBox = (ComboBox)sender;
        string text = myComboBox.Text;
        if (e.KeyCode == Keys.Enter)
        {
            myComboBox.Items.Add(myComboBox.Text); // Add
        }

        if (e.KeyCode == Keys.Delete)
        {
            myComboBox.Items.Remove(myComboBox.SelectedItem);
        }
    }

當我單擊組合框並開始鍵入然后按 Enter 鍵時,我聽到 Windows 聲音(不確定是哪一個),然后該項目被添加到列表中。 當我點擊下拉按鈕時,我會在那里看到帶有我在上面輸入的文本的項目。 當我點擊刪除該項目消失(至少我認為它確實如此)然后當我點擊其他地方時我得到這個異常

System.ArgumentOutOfRangeException: InvalidArgument='0' 的值對 'index' 無效。
參數名稱:索引

此外,當我點擊下拉按鈕時,我仍然看到空白區域

所以我的問題是如何從 ComboBox 中正確刪除項目:)

另外,如果有更好的東西,那么這種東西的 ComboBox 也請提及它們,TY

您聽到的 Windows 聲音實際上是錯誤提示音。 組合框不接受輸入鍵,所以它會向你發出嗶嗶聲“不!” 當然,您的代碼也會運行,添加項目,但這不會改變組合框認為您在將焦點設為錯誤時按 Enter 的事實。 如果您對當前設計感興趣,則需要在收到它后按下 Enter 鍵,這樣組合框就不會繼續嘗試處理它。 為此,請將e.SuppressKeyPress設置為 true。

你得到的例外是因為你已經刪除了組合框中的所有項目,但你的代碼的其他部分試圖獲取項目 #0(第一項)的文本。 沒有第一項,因為你刪除了它,所以拋出異常。 我不確定是什么代碼負責這個,因為我看不到它,但我猜你已經為 SelectedIndexChanged 事件編寫了一個處理程序。

的確,這是一個非常不尋常的界面。 組合框的目的是為用戶提供一個選項列表,而不是讓他們輸入多個選項。 如果需要,請使用多行文本框。 至少這樣,他們將能夠看到他們輸入的所有內容。

或者,您可以為此使用經典的界面習慣用法,其中有一個文本框可以輸入,該文本框與“添加”按鈕一起使用以將輸入的文本添加到 ListBox 控件。 刪除按鈕刪除列表框中當前選定的項目。 清除按鈕清除列表框中的所有項目。 是的,使用和解釋一樣令人困惑。 盡可能避免這些。 在 UI 設計糟糕的過去,它們更受歡迎。

此外,當我點擊下拉按鈕時,我仍然看到空白區域

這些實際上不是空白空間。 嗯,他們是,但不是真的。 :-) 我的意思是它們不是代表單個“空”項目的占位符。 當整個組合框為空(不包含任何項目)時,這就是您所看到的。 因為它不包含任何項目,所以它不能自動調整其下拉窗口的高度,所以它使用固定大小。

我在 ComboBox 上遇到了同樣的問題。 請注意,僅當用戶在刪除項目但未選擇新項目后點擊其他地方時才會發生錯誤。 通過在刪除后添加新項目的選擇來解決它。 還將最后一項作為特殊情況處理。 請參閱下面的工作代碼:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    ComboBox comboBox = sender as ComboBox;

    switch (e.KeyCode)
    {
        case Keys.Delete:
            if ((comboBox.DroppedDown) && (comboBox.SelectedItem != null))
            {
                if (comboBox.Items.Count == 1)  // Removing Last Item
                {
                    comboBox.DroppedDown = false;
                    comboBox.Text = string.Empty;
                    comboBox.Items.Clear();
                }
                else
                {
                    comboBox.Items.Remove(comboBox.SelectedItem);
                    comboBox.SelectedIndex = comboBox.Items.Count - 1;
                }
                e.Handled = true;
            }
            break;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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