我正试图从项目中的类中获取表单文本框控件的句柄,类似于这种方法:
How to access Winform textbox control from another class?
我无法让它发挥作用。在我的表格课程中,我有这个:
public Form1()
{
InitializeComponent();
id = new InputDevice(Handle, this);
id.KeyPressed += new InputDevice.DeviceEventHandler(m_KeyPressed);
}
public void UpdateScanCode(string scanCode)
{
txtScanCode.Text = scanCode;
}
然后在我的InputDevice类中我有这个:
Form mainForm;
public InputDevice( IntPtr hwnd, Form frmMain )
{
... stuff ...
mainForm = frmMain;
}
...最后,在我的一个功能中:
mainForm.Update???
Intellisense无法找到UpdateScanCode函数,尽管它找到了很多Form1的其他成员。当我尝试使用mainForm.UpdateScanCode()时,它将无法编译。
为什么这不起作用?
答案 0 :(得分:2)
您的InputDevice
课程引用了基础Form
课程,而不是您的Form1
课程。因此,您的代码会进行编译,并且您可以从Form
访问基础InputDevice
课程中提供的任何内容,但您无法访问Form1
特定的任何内容。
修改您的InputDevice
课程,以引用Form1
代替Form
。
Form1 mainForm;
public InputDevice( IntPtr hwnd, Form1 frmMain )
{
... stuff ...
mainForm = frmMain;
}
甚至可能不需要将Form1
的实例传递给InputDevice
。如果" ScanCode"是InputDevice
上的公共财产(至少有公共" getter"),您可以在Form1
中使用此代码:
id.KeyPressed += delegate { txtScanCode.Text = id.ScanCode; };
或者扫描代码可能是通过该委托的事件参数传回的?
id.KeyPressed += (s, e) => txtScanCode.Text = e.ScanCode;