web-dev-qa-db-ja.com

チェックリストボックスのチェックボックスを無効にする方法は?

CheckedListBoxにいくつかの項目があります。その最初の項目のCheckBoxを無効にしたいと思います。
すなわちCheckedListBoxの最初の項目を無効にしたいのは、オプションが使用できないことをユーザーに視覚的に伝えたいからです。

19
Subodh Bansal

上記の部分的な回答のうち2つを組み合わせると、うまくいきました。次の方法でアイテムをリストに追加します。

myCheckedListBox.Items.Add(myItem, myState);

MyStateは、無効にする必要があるアイテムのCheckState.Indeterminateです。次に、イベントハンドラーを追加して、これらのアイテムが変更されないようにします。

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

これは通常の目的でこのリストの「不確定」を使用することを許可しませんが、無効にされたアイテムに期待されるものと非常によく似ており、正しい動作を提供します!

14
Mick Bruno

アイテムを無効にするのは良い考えではありません。ユーザーがチェックボックスをクリックしても効果がないという良いフィードバックはありません。カスタム描画を使用してそれを明確にすることはできません。最善の方法は、アイテムを単に省略することです。

ただし、ItemCheckイベントでユーザーを簡単に無効にすることができます。

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

この投稿はかなり古いですが、最後に追加された回答が今年の4月に提出されました。
そして、これが誰かを助けることを願っています。
私は似たようなものを求めていました:多くのインストーラーのように動作するチェックリストボックス。これは、いくつかの機能が必要なオプションのリストを提供するため、両方がチェックされますおよび無効。
この投稿のおかげで( CheckItemListBoxでDrawItemイベントハンドラーを使用できますか? )どうにかして、CheckedListBoxコントロールをサブクラス化しました。
リンクされた投稿のOPの状態と同様に、CheckedListBoxコントロールでは、OnDrawItemイベントが発生しないため、サブクラス化が必要です。
非常に基本的ですが、機能します。これは次のようになります(上のチェックボックスは比較用です)。

checked list box

[〜#〜]注[〜#〜]:無効化されたアイテムは本当に無効:クリックしても何も起こりません(私が知る限り)。そしてこれはコードです:

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);

これが誰かを助けることを願っています。

9
Jack Griffin

特定のアイテムを無効にするには、以下を使用します。

checkedListBox1.SetItemCheckState(0, CheckState.Indeterminate);

SetItemCheckStateはアイテムのインデックスを取り、CheckState Enum Indeterminateは影付きの外観を示すために使用されます

7
Boomer

久しぶりのことですが、リストボックスの検索でこれが見つかり、ディスカッションに追加しようと思いました。

リストボックスがあり、クリックできないようにすべてのチェックボックスを無効にしたいが、ユーザーが引き続きスクロールできるようにコントロールを無効にしない場合は、次のようにします。

listbox.SelectionMode = SelectionMode.None
5
Simon Smith

CheckedListBoxはこの方法では機能しません。 CheckedListBox.Items は文字列のコレクションなので、そのように「無効化」することはできません。

以下は、役立つ可能性のある解決策についての議論です: here および here

3
msergeant

解決策は、イベントItemCheckingを使用することです。

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

これにより、すべてのアイテムのすべてのチェックがキャンセルされますが、常により洗練されたソリューションを実行できますが、現在の.SelectedItem

1
Baptiste Pernet

以下のコードを試してください:

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
0
Raj

別の解決策は、Telerikコンポーネントを使用することだと思います。

RadListControlはあなたにそのオプションを与えることができます:

enter image description here

0
shA.t

これは私にとってはうまくいきます:

checkedListBox1.SelectionMode = SelectionMode.None;

これは、アイテムを選択できないことを意味します

なし:アイテムは選択できません。

詳細については、 SelectionMode Enumeration で確認できます。

0
Willy David Jr

これが私が書いたヘルプデスクアプリケーションでの方法です。

最初に、フォームの読み込み中にリストに追加したときにチェックボックスがグレー表示されるようにしました。

    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);
        }
    }

ここでの考え方は、私のフォームでは、ボックスがアイテムのクリック/選択をチェックするように設定されているということです。このようにして、1石で2羽の鳥を殺すことができました。フォームの読み込み中にアイテムが最初にチェックおよび追加されるときに、このイベントが問題を引き起こさないようにすることができました。さらに、selectをチェックすることで、item checkedイベントの代わりにこのイベントを使用できます。結局のところ、アイデアは、ロード中に混乱しないようにすることです。

また、私のアプリでは特定のOUに存在するADからグループのリストを取得しているため、インデックス番号が何であるかは関係ありません。この変数は不明です。

これが良いアイデアかどうかは、状況次第です。無効にするアイテムが別の設定に依存している別のアプリがあります。このアプリでは、ヘルプグループがこのグループが必要であることを確認して、彼らがグループを削除しないようにします。

0
Nathan McKaskle