【问题标题】:calling an child form event replacing or avoiding the mdi parent form event调用子表单事件替换或避免 mdi 父表单事件
【发布时间】:2013-08-06 06:47:29
【问题描述】:

mdimain_MdiChildActivate 中,为所有子表单定义了应用程序逻辑 与 GridControl mouseDoubleClick 事件有关。 它适用于所有包含子表单的网格,但在某些情况下,网格mouseDoubleClick 是在内部为子表单定义的。 因此,该事件从MdiParent 和内部部分触发两次。 有没有什么方法可以使MdiParent 父控件事件不会触发此mouseDoubleClick 案例比较/验证子表单的ifexist 案例而不更改MDI 表单中的代码。

示例:

private void MDIMain_MdiChildActivate(object sender, EventArgs e)
{
    // code should not work
}      

private void MainGridControl_MouseDoubleClick(object sender, MouseEventArgs e)
{
  ///  Child Form : code should work
}

【问题讨论】:

  • 什么是GridControl?某种DataGridView?
  • 是的! DevExpress XtraGrid 控件

标签: c# winforms gridcontrol


【解决方案1】:

这种方法在MdiChildActivate 被触发之前检测到WM_NCHITTEST 发送到您的MainGridControl 的消息。这只能检测您的鼠标是否在MainGridControl 上使用(单击、双击),但我认为它适合您的情况。

public class Form1 : Form {
   public Form1(){
      InitializeComponent();
      Load += (s,e) => {
         gridProc.AssignHandle(MainGridControl.Handle);
      };
   }
   MainGridProc gridProc = new MainGridProc();
   private void MDIMain_MdiChildActivate(object sender, EventArgs e)
   {
       if(gridProc.HitTestOn) { gridProc.HitTestOn = false; return; }
       //code is still run if HitTestOn = false
       //.......
   }   
   public class MainGridProc : NativeWindow {
      protected override void WndProc(ref Message m){
         if(m.Msg == 0x84)//WM_NCHITTEST
         {
            HitTestOn = true;
         }
         base.WndProc(ref m);
      }
      public bool HitTestOn {get;set;}
   }
}

【讨论】:

  • 我尝试了使用标志、接口访问的代码,但需要避免或用子代码替换 MdiChildActivation 代码(在某些情况下)。代码应该独立于父窗体并且不类似于(自动调用)MdiParent 激活控件。
  • 更多说明:从父表单 MDI 中删除子表单访问权限
  • @user1069940 试试我更新的答案,如果它不起作用,我没有任何其他解决方案,你的问题不是微不足道的,因为Control events system design,关键是我们有在MdiChildActivate之前知道MouseDoubleClick
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多