我想在窗口类A中向窗口类B发送一个键盘按键事件,所以我在A中调用B的事件,但编译通不过,有什么办法可以激活类B的事件呢.具体如下:
A是B的子控件:
class A:Form
{   protected void onkeydown( object sender , KeyEventArgs e )
   {
      //Parent的类型为B
      Parent.KeyDown ( sender , e );//这样调用编译通不过,那我应该如何向父窗口通知这一事件呢???各位帮帮忙啊,想了一天了:(
   {
}

解决方案 »

  1.   

    http://blog.csdn.net/tjvictor/archive/2006/06/23/824617.aspx
      

  2.   

    Form2 f2 = new Form2();//首先第二个窗口必须实例化
    //将第二个窗口的KeyPress事件添加到第一个窗口中
    this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(f2.Form2_KeyPress);
      

  3.   

    两位仁兄对我意思的误解了。
    我实际是碰到这样一个问题:
    我采用了ComponentOne c1FlexGrid表格控件,然后使用了一个自定义的编辑框作为表格中单元格的编辑器。我想在表格的单元格编辑结束后,在编辑器中按回车键,然后将编辑器将这个按键消息发送到父窗口(也就是那个表格控件了),然后表格控件决定应该把编辑焦点移动到下一个单元格。
    我在.net程序库里面找了很长时间,居然没找到消息发送的办法(除了直接调用API),然后我想,一般某个类中定义了一个事件后,通常都是在本类中进行激活和调用的,有没办法在其他的类中进行调用呢,试验结果是编译器不支持这个,(也不知道是不是我的调用语法是错的)外部类只能把事件处理函数挂上去等待那个类去触发。c1FlexGrid是个产品,我不想去继承他,然后继承类中设计一个函数挂在编辑器的键盘事件上。因为这样做就要对c1FlexGrid进行包装,太费心了。
    我仅仅是想把编辑器的键盘事件转发到这个表格控件,以便适时激活下一个可编辑的单元格。
      

  4.   

    迫不得已,使用API解决了这个问题?但是我的目的仍没达到。
    一个类中的事件如何在另一个类中激活呢?如果做到这一点,我想就用不着API了.       const int WM_KEYDOWN = 0x100;
            private void baseTextBox_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    e.SuppressKeyPress = true;
                    PostMessage(Parent.Handle, WM_KEYDOWN, new IntPtr(0x0D) , new IntPtr(0) );                this.Hide();
                    this.Parent.Focus();                if ( Parent is C1FlexGrid )
                    {
                        C1FlexGrid c1FlexGrid1 = Parent as C1FlexGrid;
                        int rcount, ccount;
                        rcount = c1FlexGrid1.RowSel;
                        ccount = c1FlexGrid1.ColSel + 1;
                        try
                        {
                            for (; rcount < c1FlexGrid1.Rows.Count; rcount++)
                            {
                                for (; ccount < c1FlexGrid1.Cols.Count; ccount++)
                                {
                                    if (c1FlexGrid1.Cols[ccount].AllowEditing == true)
                                    {
                                        c1FlexGrid1.FinishEditing();
                                        c1FlexGrid1.Row = rcount;
                                        c1FlexGrid1.Col = ccount;                                    e.Handled = true;
                                        return;
                                    }
                                }
                                ccount = c1FlexGrid1.Cols.Fixed ;
                            }
                        }
                        catch (Exception ee)
                        {
                            MessageBox.Show(ee.Message);
                        }
                    }            }
            }        //引入消息发送API
            [DllImport("user32.dll", CharSet = CharSet.Unicode)]
            public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
      

  5.   

    可以试试用RemoteSeverice,
    或者最简单的,用TCP/IP通信解决,A触发事件了就B监听的某个端口发送一个消息(可以自己定义),B接受到之后做相应处理
      

  6.   

    新发现并测试了一个方法:你可以使用MessageQueue来达到你的目的
    A向消息队列发送消息,B从消息队列中接收消息,通信的内容和协议自己定就OK了
      

  7.   

    老兄,你的想法和我用API来解决问题的方式差不多,但还是API最简单,不需要了解太多的东西。使用队列还要在机器上配置队列服务吧,那出错的机率一定增加了。真奇怪,为什么在类中定义的事件只能在本类中触发,而不能在其它类中触发..............
      

  8.   

    a -〉b  b -〉a这是一个小循环,是不是可以用delegate解决呢
    将b的方法作为一个回调。
      

  9.   

    class A
        {        public A()
            {
                good = new ABC(me);
            }
            public delegate void ABC();
            public  ABC good;        public void me()
            {
                System.Console.WriteLine("A类被调用");
            }    }
        class Program
        {
            static void Main(string[] args)
            {
                A a = new A();
                a.good();
            }
        }
    仅使用委托,事件是可以在其它的类中触发的。但加了个event关键字后就不行了:
            public A()
            {
                good = new ABC(me);
            }
            public delegate void ABC();
            public  event ABC good;        public void me()
            {
                System.Console.WriteLine("A类被调用");
            }    }
        class Program
        {
            static void Main(string[] args)
            {
                A a = new A();
                a.good();//此代码编译不通过。
            }
        }
    看来event关键字就是为了防止事件从其它类中被激活。那现在就有问题了,因为C1FlexGrid类已经是写好的,并定义KeyDown为事件,我没办法把其它控件的按键事件传给它,也就是我没法直接去激活它。那我现在除了用windows API以外,是否还有其它的途径通知C1FlexGrid类发生按键事件呢?
      

  10.   

    估计要用反射才能解决问题,算了,直接使用API.