C# DevExpress TextEdit组件EditValueChanged事件判断触发事件来源


版本1

通过设置断点,找到 EventArgs 参数是ChangingEventArgs类型:

DevExpress TextEdit组件EditValueChanged事件判断触发事件来源

 

ChangingEventArgs 类有两个重要的属性:

  • IsTextChanging:用户输入文本内容触发的EditValueChanged事件  
  • IsBoundUpdatingEditValue:给TextEdit绑定数据源时触发的EditValueChanged事件

但是很可惜,这两个属性是内部方法,我们要通过.NET反射获取属性的值,参考下面代码:

 

C# 全选
        private void txtOrg1_EditValueChanged(object sender, EventArgs e)
        {
            if (this.IsAddOrEditMode && e is DevExpress.XtraEditors.Controls.ChangingEventArgs ev)
            {
                //IsTextChanging:输入文本内容触发
                //IsBoundUpdatingEditValue:绑定数据源时触发的EditValueChanged事件                
                var value = (Boolean)ObjectHelper.GetPropertyValue(ev, "IsBoundUpdatingEditValue");

                //IsBoundUpdatingEditValue=false,输入文本内容触发
                if (value == false && !txtOrg2.EditValue.IsEmpty())
                {
                    this.SetEditorBindingValue(txtOrg1, txtOrg1.EditValue);
                    this.SetEditorBindingValue(txtOrg2, "", true);
                }
            }
        }

 

版本2

因为有多个地方需要判断,我们把判断逻辑封装起来,重构后代码:

 

C# 全选
  private void txtOrg1_EditValueChanged(object sender, EventArgs e)
  {
      if (this.IsAddOrEditMode && e.IsUserChangingValue())
      {
          if (!txtOrg2.EditValue.IsEmpty())
          {
              this.SetEditorBindingValue(txtOrg1, txtOrg1.EditValue);
              this.SetEditorBindingValue(txtOrg2, "", true);
          }
      }
  }

 

EventExtensions.cs

 

C# 全选
   /// <summary>
   /// 事件扩展类
   /// </summary>
   public static partial class EventExtensions
   {
       /// <summary>
       /// 判断TextEdit.EditValueChanged事件是否用户修改值触发
       /// </summary>
       /// <param name="e"></param>
       /// <returns></returns>
       public static bool IsUserChangingValue(this EventArgs e)
       {
           var type = e.GetType();

           if (type.FullName == "DevExpress.XtraEditors.Controls.ChangingEventArgs")
           {
               //IsTextChanging:输入文本内容触发
               //IsBoundUpdatingEditValue:绑定数据源时触发的EditValueChanged事件         
               var p1 = type.GetProperty("IsTextChanging", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
               var p2 = type.GetProperty("IsBoundUpdatingEditValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

               var IsTextChanging = (bool)p1.GetValue(e, null);
               var IsBoundUpdatingEditValue = (bool)p2.GetValue(e, null);

               return IsTextChanging || IsBoundUpdatingEditValue == false;
           }
           else
           {
               return false;
           }
       }

   }
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
评论列表

发表评论

评论内容
昵称:
关联文章

C# DevExpress TextEditEditValueChanged事件判断触发事件来源
关于LookupEdit选择一条纪录不触发EditValueChanged事件
C# 跟踪对象的所有事件触发
修改单元格关联更新其它列的值,Dev GridViewOnCellValueChanged事件实现
LookupEdit.EditValueChanged事件内给其它文本框赋值无效或变回原来的值
EditValueChanged事件,给另外文本框赋值,为什么事件本身的值赋不值
C# DevExpress高级篇 - GridLookUpEdit使用
ButtonStateChanged事件详解 - 当按钮状态改变时触发事件
C# DevExpress教学 GridLookUpEdit表格下拉组件使用
DevExpress GridControl的EmbeddedNavigator属性添加用户自定义按钮
DevExpress RibbonControl实现右键弹出菜单(PopupMenu)
DevExpress GridView表格CustomUnboundColumnData事件异步加载图片
DevExpress GridView单元格CellValueChanged事件详解
DevExpress版本下载、安装与VS开发环境 - Winform C/S框架
[原创]老鼠->猫->人 事件触发
C# DevExpress CheckEdit设置数据源类型(Y/N字符串或Boolean布尔)
DevExpress XtraTabControl 添加一个TabPage并设置图标
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit
C# Combox动态下拉数据
DevExpress DateEdit是空日期,传入SQL参数报错解决方法