[英]Winforms : How to bind the Checkbox item of a CheckedListBox with databinding
[英]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.