Как отключить флажок в отмеченном списке?
У меня есть некоторые элементы в отмеченном списке, я хочу отключить флажок первого элемента в нем.
то есть я хочу отключить первый элемент в CheckedListBox, потому что хочу сказать пользователю визуально, что этот параметр недоступен.
Ответы
Ответ 1
Объединив 2 из приведенных выше частичных ответов, я работал отлично.
Добавьте свои элементы в список:
myCheckedListBox.Items.Add(myItem, myState);
Где myState - CheckState.Indeterminate для элементов, которые должны быть отключены.
Затем добавьте обработчик событий, чтобы эти элементы не менялись:
myCheckedListBox.ItemCheck += (s, e) => { if (e.CurrentValue == CheckState.Indeterminate) e.NewValue = CheckState.Indeterminate; };
Это не позволяет вам использовать "Неопределенный" в этом списке для своей обычной цели, но это очень похоже на то, что можно было бы ожидать для отключенного элемента, и он обеспечивает правильное поведение!
Ответ 2
Отключение элементов не является отличной идеей, у пользователя не будет хорошей обратной связи, чтобы щелкнуть этот флажок не будет. Вы не можете использовать пользовательский чертеж, чтобы сделать его очевидным. Лучше всего просто пропустить элемент.
Однако вы можете легко победить пользователя в событии ItemCheck:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
if (e.Index == 0) e.NewValue = e.CurrentValue;
}
Ответ 3
Чтобы отключить использование определенного элемента, выполните следующие действия:
checkedListBox1.SetItemCheckState(0, CheckState.Indeterminate);
SetItemCheckState
принимает индекс элемента и CheckState
Enum
Неопределенный используется для отображения затененного внешнего вида
Ответ 4
Я знаю, что прошло некоторое время, но я нашел это в своем поиске списка и подумал, что добавлю его в дискуссию.
Если у вас есть список и вы хотите отключить все флажки, чтобы их нельзя было щелкнуть, но не отключить элемент управления, чтобы пользователь мог прокручивать и т.д., вы можете сделать это:
listbox.SelectionMode = SelectionMode.None
Ответ 5
Хотя этот пост довольно старый, последний добавленный ответ был представлен в апреле этого года,
и я надеюсь, что это поможет кому-то.
Я был за чем-то похожим: ящик с проверенным списком, который ведет себя как
множество инсталляторов, которые предлагают список опций, в которых требуются некоторые функции, и
таким образом, оба проверены и отключены.
Благодаря этому сообщению (Могу ли я использовать обработчик событий DrawItem с CheckedListBox?)
Мне удалось это сделать, подклассифицировав элемент CheckedListBox.
Поскольку OP в связанных постах указывает, что в элементе CheckedListBox событие OnDrawItem никогда не запускается,
поэтому необходимо подклассирование.
Это очень простой, но он работает.
Вот как выглядит (CheckBox выше для сравнения):
![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);
Надеюсь, это поможет кому-то.
Ответ 6
CheckedListBox не будет работать таким образом. CheckedListBox.Items - это набор строк, поэтому они не могут быть "отключены" как таковые.
Вот некоторые обсуждения возможных решений, которые могут вам помочь: здесь и .
Ответ 7
Решение состоит в использовании события ItemChecking
:
_myCheckedListBox.ItemChecking += (s, e) => e.Cancel = true;
Это отменит все проверки для каждого элемента, но вы всегда можете сделать более четкое решение, но тестирование текущего .SelectedItem
Ответ 8
Вот как я это сделал в приложении справочной службы, которое я написал:
Во-первых, я сделал так, чтобы флажок был выделен серым цветом, когда я добавил его в список во время загрузки формы:
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);
}
}
Идея здесь заключается в том, что в моей форме она задана так, что поле проверяет на элемент click/select. Таким образом, я мог убить двух зайцев одним выстрелом. Я мог удержать это событие от проблем, когда элемент сначала проверяется и добавляется во время загрузки формы. Плюс, чтобы проверить флажок select, я могу использовать это событие вместо события, отмеченного элементом. В конечном итоге идея заключается в том, чтобы не допустить его во время загрузки.
Вы также заметите, что не имеет значения, что такое номер индекса, эта переменная неизвестна, потому что в моем приложении он захватывает список групп из AD, которые существуют в конкретном подразделении.
Относительно того, является ли это хорошей идеей или нет, это зависит от ситуации. У меня есть другое приложение, в котором элемент для отключения зависит от другого параметра. В этом приложении я просто хочу, чтобы служба поддержки увидела, что эта группа требуется, чтобы они не удаляли их из нее.
Ответ 9
Попробуйте код ниже:
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
Ответ 10
Я думаю, что альтернативное решение использует компоненты Telerik
.
A RadListControl
может предоставить вам эту опцию:
![enter image description here]()
Ответ 11
Это работает для меня:
checkedListBox1.SelectionMode = SelectionMode.None;
Это означает, что элементы не могут быть выбраны
Нет: элементы не могут быть выбраны.
Для получения дополнительной информации вы можете проверить его здесь: SelectionMode Enumeration.