我想在窗口类A中向窗口类B发送一个键盘按键事件,所以我在A中调用B的事件,但编译通不过,有什么办法可以激活类B的事件呢.具体如下:
A是B的子控件:
class A:Form
{ protected void onkeydown( object sender , KeyEventArgs e )
{
//Parent的类型为B
Parent.KeyDown ( sender , e );//这样调用编译通不过,那我应该如何向父窗口通知这一事件呢???各位帮帮忙啊,想了一天了:(
{
}
A是B的子控件:
class A:Form
{ protected void onkeydown( object sender , KeyEventArgs e )
{
//Parent的类型为B
Parent.KeyDown ( sender , e );//这样调用编译通不过,那我应该如何向父窗口通知这一事件呢???各位帮帮忙啊,想了一天了:(
{
}
解决方案 »
- 内存分配访问无效 (exception from HRESULT 0x800703E6)
- 如何判断点击的点pot在已知的圆内,高结贴率,解决马上结贴
- c#怎么连接PLC
- mssql中 windows登入的连接字符串 怎么写?
- VS2005 水晶報表 您请求的报表需要更多信息.
- 两个类相同结构如何进行赋值(=)
- C#连informix 出现乱码的问题
- 如何在文章里面搜索并提取字符串属性
- 怎样设置打印报表时运用自己的纸张格式
- 哪儿有vs.net下载啊?谢谢
- 怎样验证DSA加密后的数据,在线等。。。
- 数据库中的记录数不确定(因为可能随时都在增加),现拟开启10个线程处理新增加的记录,每线程最多处理10个记录。请问应该怎么设计?
//将第二个窗口的KeyPress事件添加到第一个窗口中
this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(f2.Form2_KeyPress);
我实际是碰到这样一个问题:
我采用了ComponentOne c1FlexGrid表格控件,然后使用了一个自定义的编辑框作为表格中单元格的编辑器。我想在表格的单元格编辑结束后,在编辑器中按回车键,然后将编辑器将这个按键消息发送到父窗口(也就是那个表格控件了),然后表格控件决定应该把编辑焦点移动到下一个单元格。
我在.net程序库里面找了很长时间,居然没找到消息发送的办法(除了直接调用API),然后我想,一般某个类中定义了一个事件后,通常都是在本类中进行激活和调用的,有没办法在其他的类中进行调用呢,试验结果是编译器不支持这个,(也不知道是不是我的调用语法是错的)外部类只能把事件处理函数挂上去等待那个类去触发。c1FlexGrid是个产品,我不想去继承他,然后继承类中设计一个函数挂在编辑器的键盘事件上。因为这样做就要对c1FlexGrid进行包装,太费心了。
我仅仅是想把编辑器的键盘事件转发到这个表格控件,以便适时激活下一个可编辑的单元格。
一个类中的事件如何在另一个类中激活呢?如果做到这一点,我想就用不着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);
或者最简单的,用TCP/IP通信解决,A触发事件了就B监听的某个端口发送一个消息(可以自己定义),B接受到之后做相应处理
A向消息队列发送消息,B从消息队列中接收消息,通信的内容和协议自己定就OK了
将b的方法作为一个回调。
{ 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类发生按键事件呢?