- 소스 코드에서 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;
}
}