父窗体调用子窗体内的一个方法,方法改变一个文本框的值(反射)
父窗体调用一个已打开的子窗体,用反射执行激活子窗体的一个方法,该方法改本一个文本框的值,我已能实现调用到子窗体内的方法,可是文本框的值就是改变不了,放一个MessageBox也能弹出来,代码如下:父窗体
private void dockPanel1_ActiveDocumentChanged(object sender, EventArgs e)
{
DockPanel aa = (WeifenLuo.WinFormsUI.Docking.DockPanel)(sender);
Form CC = (Form)aa.ActiveDocument;
Type type = CC.GetType();
object obj = type.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
//调用没有返回值的方法
//运行之后的结果[Hello World]
try
{
type.InvokeMember("button2_Click1", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, null);
}
catch (Exception EE)
{
MessageBox.Show(EE.Message, "系统提示!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
子窗体
public void button2_Click1()
{
this.textBox1.Text = "111";
MessageBox.Show("eee");
} --------------------编程问答-------------------- hi 此对象非彼对象。 --------------------编程问答-------------------- 能否说清楚一点 --------------------编程问答-------------------- 就这么点事为嘛要反射?不能弄得简单点么 --------------------编程问答-------------------- 就这么点事为嘛要反射?不能弄得简单点么 --------------------编程问答--------------------
私信不知怎么的发不过去。
这个原因是,你调用的方法与正在显示的窗体并不是同一个对象。
使用GetType确实能得到一个方法,也能够调用。
假如aa.Click1是你想调用的,使用Type.InvokeMember("Click1")只不过是说你要调用Click1的方法,这并不是aa.Click1.
想要调用Click1为什么不直接aa.click1, 还要用反射呢? --------------------编程问答-------------------- 把Form改成单例模式 --------------------编程问答-------------------- 不用反射,用委托时间:
主窗体:
private void ChangeTextBox(string test)
{
textBox1.Text = test;
}
.....
Form2 frm = new Form2();
frm.ChangeTextBoxHandlerEvent += new Form2.ChangeTextBoxHandler(ChangeTextBox);
子窗体:
public delegate void ChangeTextBoxHandler(string test);
public event ChangeTextBoxHandler ChangeTextBoxHandlerEvent;
//改变值的方法:
if(ChangeTextBoxHandlerEvent != null)
{
ChangeTextBoxHandlerEvent(value);
}
补充:.NET技术 , C#