닷넷/WinForms
C# WinForms DevExpress CheckedListBoxControl에 바인딩 된 아이템들 중에서 특정 아이템만 체크/미체크 안 되게 비활성화 하는 방법
FreeBear
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의 특정 항목 사용 안 함
반응형