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; };
これは通常の目的でこのリストの「不確定」を使用することを許可しませんが、無効にされたアイテムに期待されるものと非常によく似ており、正しい動作を提供します!
アイテムを無効にするのは良い考えではありません。ユーザーがチェックボックスをクリックしても効果がないという良いフィードバックはありません。カスタム描画を使用してそれを明確にすることはできません。最善の方法は、アイテムを単に省略することです。
ただし、ItemCheckイベントでユーザーを簡単に無効にすることができます。
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
if (e.Index == 0) e.NewValue = e.CurrentValue;
}
この投稿はかなり古いですが、最後に追加された回答が今年の4月に提出されました。
そして、これが誰かを助けることを願っています。
私は似たようなものを求めていました:多くのインストーラーのように動作するチェックリストボックス。これは、いくつかの機能が必要なオプションのリストを提供するため、両方がチェックされますおよび無効。
この投稿のおかげで( CheckItemListBoxでDrawItemイベントハンドラーを使用できますか? )どうにかして、CheckedListBoxコントロールをサブクラス化しました。
リンクされた投稿のOPの状態と同様に、CheckedListBoxコントロールでは、OnDrawItemイベントが発生しないため、サブクラス化が必要です。
非常に基本的ですが、機能します。これは次のようになります(上のチェックボックスは比較用です)。
[〜#〜]注[〜#〜]:無効化されたアイテムは本当に無効:クリックしても何も起こりません(私が知る限り)。そしてこれはコードです:
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);
これが誰かを助けることを願っています。
特定のアイテムを無効にするには、以下を使用します。
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
以下のコードを試してください:
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
はあなたにそのオプションを与えることができます:
これは私にとってはうまくいきます:
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);
}
}
ここでの考え方は、私のフォームでは、ボックスがアイテムのクリック/選択をチェックするように設定されているということです。このようにして、1石で2羽の鳥を殺すことができました。フォームの読み込み中にアイテムが最初にチェックおよび追加されるときに、このイベントが問題を引き起こさないようにすることができました。さらに、selectをチェックすることで、item checkedイベントの代わりにこのイベントを使用できます。結局のところ、アイデアは、ロード中に混乱しないようにすることです。
また、私のアプリでは特定のOUに存在するADからグループのリストを取得しているため、インデックス番号が何であるかは関係ありません。この変数は不明です。
これが良いアイデアかどうかは、状況次第です。無効にするアイテムが別の設定に依存している別のアプリがあります。このアプリでは、ヘルプグループがこのグループが必要であることを確認して、彼らがグループを削除しないようにします。