我在一个CheckedListBox
中有一些项目,我想要禁用它里面的第一个项目的CheckBox
。
即我想要禁用CheckedListBox
中的第一项,因为我想要通过视觉告诉用户该选项不可用。
我在一个CheckedListBox
中有一些项目,我想要禁用它里面的第一个项目的CheckBox
。
即我想要禁用CheckedListBox
中的第一项,因为我想要通过视觉告诉用户该选项不可用。
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);
希望这能帮助到某些人。
以上两个部分回答的结合对我非常有效。 使用以下方法将您的项目添加到列表中:
myCheckedListBox.Items.Add(myItem, myState);
对于应该被禁用的项目,myState为CheckState.Indeterminate。然后添加事件处理程序以防止更改这些项目:
myCheckedListBox.ItemCheck += (s, e) => { if (e.CurrentValue == CheckState.Indeterminate) e.NewValue = CheckState.Indeterminate; };
这并不允许你像正常情况下一样在此列表中使用“未定”(Indeterminate),但它确实提供了一个非常类似于禁用项目的外观,并且它提供了正确的行为!
禁用项目并不是一个好主意,因为用户没有良好的反馈来告知点击复选框没有任何效果。您不能使用自定义绘图来使其明显。最好的做法是简单地省略该项目。
不过,您可以轻松地通过ItemCheck事件打败用户:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
if (e.Index == 0) e.NewValue = e.CurrentValue;
}
要禁用任何特定项目,请使用以下内容:
checkedListBox1.SetItemCheckState(0, CheckState.Indeterminate);
SetItemCheckState
接受项目的索引和CheckState
枚举类型,Indeterminate用于显示阴影外观。
虽然已经过了一段时间,但我在寻找列表框时发现了这个问题,并想将其添加到讨论中。
如果您有一个列表框,并希望禁用所有复选框以使其无法点击,但不禁用控件,以便用户仍然可以滚动等操作,则可以执行以下操作:
listbox.SelectionMode = SelectionMode.None
checkedListBox1.SelectionMode = SelectionMode.None;
这意味着没有任何项目可以被选择。
无:无法选择任何项目。
更多信息,请查看此处:SelectionMode 枚举。
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
可以提供这个选项:
if (Items.Count < e.Index + 1) { return; }
- Alessandro Martinelli