.Net Framework Standard/Component

[Devexpress] TreeListControl - Raise AfterCheckNode / BeforeCheckNode

달빛에취하다 2024. 5. 10. 09:28
  • 소스 코드에서 tree.FocuseNode.Check = true 등을 설정할 경우 BeforeCheckNode, AfterCheckNode가 동작하지 않음
  • End-User 용으로 키보드, 마우스 등의 프로그램 사용자가 행위에 대해서 이벤트 발생
  • 위와 같은 문제 처리를 위해서 Reflection을 사용하여 Event Method 를 찾아서 처리
  • Devexpress Winform TreeListControl - 20.1.6.0 에서 작업 되었음
private void RiaseBeforeAfterNodeChecked(TreeList tree, TreeListNode currentNode, bool toChecked)
{
    System.ComponentModel.EventHandlerList eventHandlerList = null;

    if (tree.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic) is PropertyInfo pBefore)
    { 
    	eventHandlerList = (System.ComponentModel.EventHandlerList)pBefore.GetValue(tree); 
    }

    if(eventHandlerList != null)
    {
        CheckState prevState = toChecked ? CheckState.Unchecked : CheckState.Checked;
        CheckState state = toChecked ? CheckState.Checked : CheckState.Unchecked;

        if (tree.GetType().GetField("beforeCheckNode", BindingFlags.Static | BindingFlags.NonPublic) is FieldInfo fBefore)
        {
            var beforeKey = fBefore.GetValue(null);

            var beforeNodeChecked = (DevExpress.XtraTreeList.CheckNodeEventHandler)eventHandlerList[beforeKey];

            beforeNodeChecked?.Invoke(tree, new CheckNodeEventArgs(currentNode, CheckState.Unchecked, CheckState.Checked));
        }

        currentNode.Checked = toChecked;

        if (tree.GetType().GetField("afterCheckNode", BindingFlags.Static | BindingFlags.NonPublic) is FieldInfo fAfter)
        {
            var afterKey = fAfter.GetValue(null);

            var afterNodeChecked = (DevExpress.XtraTreeList.NodeEventHandler)eventHandlerList[afterKey];

            afterNodeChecked?.Invoke(tree, new NodeEventArgs(currentNode));
        }
    }
    else
    {
    	currentNode.Checked = toChecked;
    }
     
}