簡體   English   中英

如何禁用選中列表框中的復選框?

[英]How to disable a checkbox in a checkedlistbox?

我在CheckedListBox有一些項目,我想禁用其中第一個項目的CheckBox
即我想禁用CheckedListBox的第一項,因為我想直觀地告訴用戶該選項不可用。

結合上述部分答案中的 2 個對我來說非常有用。 將您的項目添加到列表中:

myCheckedListBox.Items.Add(myItem, myState);

對於應該禁用的項目,其中 myState 是 CheckState.Indeterminate。 然后添加一個事件處理程序以防止這些項目被更改:

myCheckedListBox.ItemCheck += (s, e) => { if (e.CurrentValue == CheckState.Indeterminate) e.NewValue = CheckState.Indeterminate; };

這不允許您出於正常目的在此列表中使用“不確定”,但它確實與人們對禁用項目的期望非常相似,並且它提供了正確的行為!

雖然這個帖子已經很老了,但最后一次添加的答案是今年4月提交的,
我希望這會幫助某人。
我在尋找類似的東西:一個選中的列表框,它的行為類似於許多安裝程序,它提供了需要某些功能的選項列表,因此被選中禁用。
感謝這篇文章( 我可以將 DrawItem 事件處理程序與 CheckedListBox 一起使用嗎? )我設法做到了,繼承了CheckedListBox控件。
由於鏈接帖子中的 OP 狀態,在CheckedListBox控件中,永遠不會觸發OnDrawItem事件,因此子類化是必要的。
這是非常基本的,但它有效。 這是它的樣子(上面的CheckBox用於比較):

選中的列表框

注意:禁用的項目實際上是禁用的:單擊它沒有任何效果(據我所知)。

這是代碼:

public class CheckedListBoxDisabledItems : CheckedListBox {
    private List<string> _checkedAndDisabledItems = new List<string>();
    private List<int> _checkedAndDisabledIndexes = new List<int>();

    public void CheckAndDisable(string item) {
        _checkedAndDisabledItems.Add(item);
        this.Refresh();
    }

    public void CheckAndDisable(int index) {
        _checkedAndDisabledIndexes.Add(index);
        this.Refresh();
    }

    protected override void OnDrawItem(DrawItemEventArgs e) {
        string s = Items[e.Index].ToString();

        if (_checkedAndDisabledItems.Contains(s) || _checkedAndDisabledIndexes.Contains(e.Index)) {
            System.Windows.Forms.VisualStyles.CheckBoxState state = System.Windows.Forms.VisualStyles.CheckBoxState.CheckedDisabled;
            Size glyphSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, state);
            CheckBoxRenderer.DrawCheckBox(
                e.Graphics,
                new Point(e.Bounds.X + 1, e.Bounds.Y + 1), // add one pixel to align the check gliph properly
                new Rectangle(
                    new Point(e.Bounds.X + glyphSize.Width + 3, e.Bounds.Y), // add three pixels to align text properly
                    new Size(e.Bounds.Width - glyphSize.Width, e.Bounds.Height)),
                s,
                this.Font,
                TextFormatFlags.Left, // text is centered by default
                false,
                state); 
        }
        else {
            base.OnDrawItem(e);
        }
    }

    public void ClearDisabledItems() {
        _checkedAndDisabledIndexes.Clear();
        _checkedAndDisabledItems.Clear();
        this.Refresh();
    }
}

像這樣使用它:

checkedListBox.Items.Add("Larry");
checkedListBox.Items.Add("Curly");
checkedListBox.Items.Add("Moe");

// these lines are equivalent
checkedListBox.CheckAndDisable("Larry");
checkedListBox.CheckAndDisable(0);

希望這可以幫助某人。

禁用項目不是一個好主意,用戶將不會有很好的反饋,即單擊復選框不會產生任何效果。 您不能使用自定義繪圖使其顯而易見。 最好的辦法是簡單地省略該項目。

但是,您可以使用 ItemCheck 事件輕松擊敗用戶:

    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
        if (e.Index == 0) e.NewValue = e.CurrentValue;
    }

要禁用任何特定項目,請使用以下內容:

checkedListBox1.SetItemCheckState(0, CheckState.Indeterminate);

SetItemCheckState獲取項目的索引, CheckState Enum Indeterminate用於顯示陰影外觀

我知道已經有一段時間了,但我在搜索列表框時發現了這個,並認為我會將其添加到討論中。

如果您有一個列表框並且想要禁用所有復選框以便無法單擊它們,但又不禁用控件以便用戶仍然可以滾動等,您可以這樣做:

listbox.SelectionMode = SelectionMode.None

CheckedListBox 不會以這種方式工作。 CheckedListBox.Items是一個字符串集合,因此它們不能被“禁用”。

以下是有關可能對您有所幫助的可能解決方案的一些討論: 此處此處

解決方案是使用事件ItemChecking

_myCheckedListBox.ItemChecking += (s, e) => e.Cancel = true;

這將取消對每個項目的所有檢查,但您總是可以做更精細的解決方案,但測試當前的.SelectedItem

這對我有用:

checkedListBox1.SelectionMode = SelectionMode.None;

這意味着不能選擇任何項目

無:不能選擇任何項目。

有關更多信息,您可以在此處查看: SelectionMode Enumeration

以下是我在編寫的幫助台應用程序中的做法:

首先,當我在表單加載期間將它添加到列表時,我做了它,所以復選框是灰色的:

    private void frmMain_Load(object sender, EventArgs e)
    {
        List<string> grpList = new List<string>();
        ADSI objADSI = new ADSI();

        grpList = objADSI.fetchGroups();

        foreach (string group in grpList)
        {
            if (group == "SpecificGroupName")
            {
                chkLst.Items.Add(group, CheckState.Indeterminate);

            }
            else
            {
                chkLst.Items.Add(group);
            }

        }

然后我使用了一個事件,以便在單擊時確保它保持單擊狀態:

    private void chkLst_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (chkLst.SelectedItem.ToString() == "SpecificGroupName")
        {
            chkLst.SetItemCheckState(chkLst.SelectedIndex, CheckState.Indeterminate);
        }
    }

這里的想法是在我的表單上設置它以便框檢查項目單擊/選擇。 這樣我就可以用一塊石頭殺死兩只鳥。 在表單加載期間首次檢查和添加項目時,我可以防止此事件引起問題。 加上在選擇上檢查允許我使用這個事件而不是項目檢查事件。 最終的想法是防止它在加載過程中搞砸。

您還會注意到索引號是什么並不重要,該變量是未知的,因為在我的應用程序中,它從 AD 中獲取存在於特定 OU 中的組列表。

至於這是否是一個好主意,這取決於具體情況。 我有另一個應用程序,其中要禁用的項目取決於另一個設置。 在這個應用程序中,我只希望幫助台看到這個組是必需的,這樣他們就不會將他們從其中刪除。

試試下面的代碼:

Private Sub CheckedListBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles CheckedListBox1.MouseUp
        If (Condition) Then
         Me.CheckedListBox1.SelectedIndex = -1
        End If
End Sub

我認為另一種解決方案是使用Telerik組件。

RadListControl可以為您提供該選項:

在此處輸入圖片說明

暫無
暫無

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

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