如何在父类中为子类添加事件

原创 2007年09月30日 15:55:00
//以下代码实现的是在父类窗体中为子类窗体中的datagrid控件添加mousedown mouseup事件。

//父类窗体中的方法
private void Form_SearchBase_Load(object sender, System.EventArgs e)
  ...
...{
   
    Auto AddEvent MouseDown MouseUp
Auto AddEvent MouseDown MouseUp#region Auto AddEvent MouseDown MouseUp

   
foreach ( object obj in panel2.Controls )
   ...
...{
    
    
if (obj.GetType().ToString() == "System.Windows.Forms.DataGrid")
    ...
...{
    
     Type   t   
=  typeof(System.Windows.Forms.DataGrid); 
 
     PropertyInfo   pi   
=   t.GetProperty("Events",   BindingFlags.NonPublic|   BindingFlags.Instance);  
     EventHandlerList   el   
=   (EventHandlerList)pi.GetValue(obj,null);  
     FieldInfo   fiA   
=   t.GetField("MouseDown",   BindingFlags.NonPublic   |   BindingFlags.Static);  
     FieldInfo   fiB 
=   t.GetField("MouseUp",   BindingFlags.NonPublic   |   BindingFlags.Static);  

     
if (( fiA == null|| (fiB == null))
     ...
...{
      ((System.Windows.Forms.DataGrid)obj).MouseDown 
+= new MouseEventHandler(this.dataGrid_PlanCase_Mouse);
      ((System.Windows.Forms.DataGrid)obj).MouseUp 
+= new MouseEventHandler(this.dataGrid_PlanCase_Mouse);
    
     }

     
else
     ...
...{
      Delegate   dA   
=   el[fiA.GetValue(obj)];
      Delegate  dB
= el[fiB.GetValue(obj)] ;  


      
if ( (   dA   ==   null   )  && ( dB  == null))
      ...
...{
       ((System.Windows.Forms.DataGrid)obj).MouseDown 
+= new MouseEventHandler(this.dataGrid_PlanCase_Mouse);
       ((System.Windows.Forms.DataGrid)obj).MouseUp 
+= new MouseEventHandler(this.dataGrid_PlanCase_Mouse);
      }

     }

    }

   }


   
#endregion

  }


//父类中的方法

MouseAbout
MouseAbout#region  MouseAbout

  
public void dataGrid_PlanCase_Mouse(object sender, System.Windows.Forms.MouseEventArgs e)
  ...
...{
   
foreach ( object obj in panel2.Controls )
   ...
...{
    
if (obj.GetType().ToString() == "System.Windows.Forms.DataGrid")
    ...
...{
     System.Windows.Forms.DataGrid.HitTestInfo hti
=((System.Windows.Forms.DataGrid)obj) .HitTest (e.X ,e.Y );

     
if(e.Button == System.Windows .Forms .MouseButtons .Left )
     ...
...{
      
if(hti.Type == System.Windows.Forms.DataGrid.HitTestType.Cell)
      ...
...{
       HighlightRow(((System.Windows.Forms.DataGrid)obj), hti.Row,hti.Column );

      }

     }

    }

   }

  }


        HighlightRow DateGrid
HighlightRow DateGrid#region HighlightRow DateGrid

        
public    void    HighlightRow(System.Windows.Forms.DataGrid  _Grid,int _row,int _col)
        ...
...{
             
            
int CurrentRow  = _Grid.CurrentCell.RowNumber;

            
if  (ModifierKeys   ==   Keys.Shift)            
            
...{        
             
                
                
int _i=0,_j=0, _Top =0,  _Bottom=0;
                _i 
=CurrentRow;
                
//获得最后一次点击的行
                _j = _LastSelectRow;
             
                
if ( (_i != _j ))
                
...{
                    _Top 
= _i;
                    _Bottom 
=_j;
                    GetSelectRows(_Grid);
                    UnSelectRows(_Grid);
                     
                }
 

                
//判断应该正序还是倒序
                _i = System.Math.Min(_Top,_Bottom);
                _j 
= System.Math.Max(_Top,_Bottom);

                
int i=_i ;
                
while (i<=_j)
                
...{
                    _Grid .Select(    i    );
                    i
++;
                }
 

                _Grid .CurrentCell   
=   new   DataGridCell(    _Bottom,   _col );
              
            
            }

            
else if( Control.ModifierKeys == Keys.Control)
            
...{  

                
int _i=0,_j=0;
                 
                _i 
= Convert.ToInt32(    System.Math.Min (CurrentRow,_LastSelectRow)    );
                _j 
=  Convert.ToInt32(    System.Math.Max(CurrentRow,_LastSelectRow)    );

                
//将所有选择过的行全部保存
                if ( _i != _j )                
                
...{
                    GetSelectRows(_Grid);
                    UnSelectRows(_Grid);
                }

                

                
foreach(object obj in _SelectRows)
                
...{
                    _Grid .Select(    Convert.ToInt32( obj )    );
                }

                _Grid .Select(    _j    );
                _Grid .CurrentCell   
=   new   DataGridCell(    _j,   _col );
            }

            
else
            
...{
                _Grid.UnSelect(CurrentRow);

                _Grid .CurrentCell   
=   new   DataGridCell(    _row,   _col );  
                _Grid .Select (    _row    );
                _LastSelectRow 
= _row;

                ClearSaveValue();
            }


          
        }


        
private void    ClearSaveValue()
        ...
...{
            _Top 
=0;
            _Bottom
=0;
            _SelectRows.Clear();
        }


        
/**//**//**//// <summary>
        
/// 得到所有被选中的行
        
/// </summary>
        
/// <param name="_Grid"></param>

        private void GetSelectRows(System.Windows.Forms.DataGrid  _Grid)
        ...
...{
            System.Data.DataTable _Table;
            
// Assumes the DataGrid is bound to a DataTable.
           

            
if     (_Grid.DataSource    ==    null)
            ...
...{
                
return    ;
            }

            
else
            ...
...{
                _Table 
= (System.Data.DataTable) _Grid.DataSource;
                
int RowCount    =    _Table.Rows.Count;
                
if    (RowCount    ==    0)
                ...
...{
                    
return    ;
                }


                
int i =0;

                
do
                ...
...{
                    
if    (_Grid.IsSelected(i) )
                    ...
...{                
                        _SelectRows.Add(i);

                        
//MessageBox.Show(i.ToString());
                    }

                    i
++;
                }

                
while(i<RowCount);
            }


        }

        
//取消所有被选择的行
        private void UnSelectRows(System.Windows.Forms.DataGrid  _Grid)
        ...
...{
            System.Data.DataTable _Table;
            
// Assumes the DataGrid is bound to a DataTable.
           

            
if     (_Grid.DataSource    ==    null)
            ...
...{
                
return    ;
            }

            
else
            ...
...{
                _Table 
= (System.Data.DataTable) _Grid.DataSource;
                
int RowCount    =    _Table.Rows.Count;
                
if    (RowCount    ==    0)
                ...
...{
                    
return    ;
                }


                
int i =0;

                
do
                ...
...{
                    
if    (_Grid.IsSelected(i) )
                    ...
...{                
                        _Grid.UnSelect(i);

                        
//MessageBox.Show(i.ToString());
                    }

                    i
++;
                }

                
while(i<RowCount);
            }

        }


        
#endregion


  
#endregion

 

JAVA面试题之基础篇

title: JAVA面试题之基础篇date: 2017-03-01tags: 面试题 九种基本数据类型的大小,以及他们的封装类。各自占多少字节 boolean, byte, char, shor...
  • u011410529
  • u011410529
  • 2017年03月01日 11:48
  • 1067

java基础类-第一章

JAVA  基础 1.  JAVA 中的几种基本数据类型是什么,各自占用多少字节。 2.  String 类能被继承吗,为什么。 3.  String,Stringbuffer,StringBuild...
  • hudalin969462593
  • hudalin969462593
  • 2017年08月02日 12:01
  • 149

JAVA面试题汇总

陆续更新…JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。 String,Stringbuffer,StringBuilder的区别。 A...
  • u013815546
  • u013815546
  • 2017年03月01日 17:39
  • 944

c++子类中初始化父类成员变量

今天在看源码遇到一个问题,刚开始没看明白,后简化为如下代码: #include typedef void (*func_type)(void); class A{ public: ...
  • u014355725
  • u014355725
  • 2015年09月30日 17:03
  • 2201

jquery实现点击父类中的子类下的子类a,控制父类下的子类b的变换

$(document).ready(function(){ $(".b").hide(); //给所有的父类ul添加事件 $(".a").click(function(){ $(">.b",$...
  • hunannanhu
  • hunannanhu
  • 2015年06月10日 10:18
  • 1054

【java】Java 中父类怎么调用子类的方法?

原文地址:http://blog.csdn.net/qq_25827845/article/details/52916513 父类能调用子类的方法吗? 答:能。   怎么做...
  • lzm18064126848
  • lzm18064126848
  • 2016年12月21日 22:34
  • 2075

父类和子类都存在click事件,如何让子类事件高于父类事件

Examples
  • u010957293
  • u010957293
  • 2016年08月21日 09:36
  • 1160

Unity3d中如何让子类继承父类的Inspector显示效果

有时候为了让脚本在监视面板的显示更加简洁美观,我们会使用CustomEditor来定制化Inspector。 只需要将CustomEditor的第二个参数设置为true,子类就可以继承我们为父类定制的...
  • zhaocg00
  • zhaocg00
  • 2017年10月21日 15:36
  • 156

在子类中调用父类的带参数的构造函数

animal类的构造函数,增加两个参数height和weight,分别表示动物的高度和重量。代码如例2-13所示。   例2-13 双击代码全选 1 ...
  • otuhacker
  • otuhacker
  • 2013年08月24日 11:37
  • 2207

JS实现子类调用父类的同名函数函数

图像的实现 代码实现 function parent() { this.initialize = function() { this.x = 1; this.y = 1; }, th...
  • sakawa_x
  • sakawa_x
  • 2016年10月12日 19:57
  • 1794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在父类中为子类添加事件
举报原因:
原因补充:

(最多只允许输入30个字)