-
C# WinForms DevExpress CheckedListBoxControl에 바인딩 된 아이템들 중에서 특정 아이템만 체크/미체크 안 되게 비활성화 하는 방법닷넷/WinForms 2023. 2. 24. 18:07반응형
DevExpress의 CheckedListBoxControl에서 아이템들 전체가 선택이 안 되게 하는 방법은 CheckedListBoxControl를 비활성화 시키는 checkedListBoxControl1.Enabled = false; 를 한다.
전체 비활성화가 아닌, 일부 아이템만 선택이 안 되는 비활성화 시키는 방법은 CheckedListBoxControl의 GetItemEnabled 이벤트를 사용하면 된다.
CheckedListBoxControl의 아이템들 중에서 특정 항목들만 체크/미체크가 안 되게 비활성화 하는 방법
예제 코드
// CheckedListBoxControl를 사용하는 화면의 소스 코드 파일에서 // CheckedListBoxControl에 데이터소스 바인딩 및 // 이벤트를 통해 CheckedListBoxControl의 아이템들 중에서 특정 아이템을 비활성화 // item.Enabled = false; public Form1() { InitializeComponent(); SetCheckedListBox(GetModels<SettingList>(childUrl)); } private void SetCheckedListBox(List<SettingList> childLists) { foreach(var item in lists) { // ParentSettingLists에도 childLists 해당 Idx가 있는지 확인 var data = ParentSettingLists.FirstOrDefault(x => x.Idx == item.Idx); // data가 있고, Apply가 A이면 childLists에서 해당 아이템은 선택불가가 되어야 하므로 // Discontinued를 true로 정의 // A가 아니면 false if (data != null && data.Apply == "A") { item.Discontinued = true; } else { item.Discontinued = false; } } // checkedListBoxControl1에 childLists 바인딩 checkedListBoxControl1.DataSource = childLists; // childLists에서 CheckedListBoxControl 아이템들의 값이 되는 멤버 checkedListBoxControl1.ValueMember = "Idx"; // childLists에서 CheckedListBoxControl 아이템들이 보이는 명칭이 되는 멤버 checkedListBoxControl1.DisplayMember = "ItemDisplayMember"; // childLists에서 CheckedListBoxControl 아이템들의 체크박스와 연동이 되는 멤버 checkedListBoxControl1.CheckMember = "ItemCheckMember"; checkedListBoxControl1.GetItemEnabled += new GetItemEnabledEventHandler(checkedListBoxControl1_GetItemEnabled); } private void checkedListBoxControl1_GetItemEnabled(object sender, DevExpress.XtraEditors.Controls.GetItemEnabledEventArgs e) { CheckedListBoxControl control = sender as CheckedListBoxControl; var list = control.DataSource as List<SettingList>; bool isDiscontinued = list[e.Index].Discontinued; if (isDiscontinued) { e.Enabled = false; } }
// 프로그램의 세팅 정보 public class SettingList { /// <summary> /// 인덱스 /// </summary> public string Idx { get; set; } /// <summary> /// 이름 /// </summary> public string Name { get; set; } /// <summary> /// 사용여부 (Y:사용, N:사용안함) /// </summary> public string UseYn { get; set; } /// <summary> /// 전체 적용 여부 (A:전체, E:개별) /// ParentSettingLists에서만 확인되는 멤버 /// 해당 Idx가 전체 적용이면, 해당 Idx 하위 세팅 정보는 Parent를 따라야 한다. /// </summary> [JsonProperty("Apply")] public string Apply { get; set; } [JsonIgnore] public string ItemDisplayMember { get { return Name + " 표시 안 함"; } } private bool? checkMember = null; [JsonIgnore] public bool ItemCheckMember { get { if (checkMember == null) { if (UseYn == "Y") { checkMember = false; } else { checkMember = true; } } return (bool)checkMember; } set { checkMember = value; } } /// <summary> /// ParentSettingLists에서 해당 Idx의 Apply에 따라 변경되는 값으로 childLists에서 사용되는 멤버 /// Apply가 A이면, 해당 항목 비활성화 == true /// </summary> [JsonIgnore] public bool Discontinued { get; set; } } === // 참고로 ParentSettingLists는 상위 클래스에서 데이터를 세팅하고 전역으로 쓰이고 있음. public List<SettingList> ParentSettingLists; // GetModels는 API를 통해 Json 데이터를 가져와 해당 모델로 디시리얼라이즈 하는 메소드이며 // 이부분은 작성하지 않음. private void GetParentSettingLists() { ParentSettingLists = GetModels<SettingList>(parentUrl); }
DevExpress 문서 참고
How to: Disable Specific Items in CheckedListBoxControl via Event
방법: 이벤트를 통해 CheckedListBoxControl의 특정 항목 사용 안 함
반응형'닷넷 > WinForms' 카테고리의 다른 글
C# WinForms DevExpress AccordionControl 사용하기 (1) 2023.08.23 C# WinForms DataGridView 복사 후 워드에 저장하기 (3) 2023.03.21 C# Winforms 직접 만든 달력 (커스텀 달력) (0) 2023.01.13 C# WinForms DevExpress GridControl에 체크박스 칼럼 (헤더 포함) 추가하기 (0) 2022.12.12 C# DevExpress GridControl 열 전체 선택, 헤더에 체크박스 넣는 법 (0) 2022.08.25