ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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의 특정 항목 사용 안 함

    반응형

    댓글

Designed by Tistory.