日期:2014-05-17  浏览次数:21210 次

Form2里如何调用定义在Form1里的类
Form1里定义的类

void ShowMsg(string str)
        {
            TextBox1.AppendText(str + "\r\n");
        }

现在想要在Form2里调用ShowMsg,有什么办法可以实现。

还有个问题,担心TextBox1会无法被Form2窗体调用,如何避免?

------解决方案--------------------
只要在一个命名空间下,或正确的引用命名空间,并且是public的类就可以调用。

至于textbox,如果是public的就没有问题,想避免就设置成public,而不是private or protected。


------解决方案--------------------
这不是类,而是方法,你可以将它定义成public
但是如我给你的链接,最好不要直接去调用,而是应该使用属性和委托。

道理很简单,一旦你决意直接在窗体间互相调用,那么这些窗体中的某一个就没有办法单独拿到另一个项目中重用了。
------解决方案--------------------
想要form2里调用form1里的方法,form2里必须能得到form1的引用才行。
form2得到form1的引用有很多种办法,可以Application.OpenForm["form1的名字"],或者直接把form1的引用传给form2

另外担心TextBox1会无法被Form2窗体调用,把TextBox1声明为public即可
------解决方案--------------------
如果你能拿到form1对象的引用,那就把 ShowMsg定义为public最简单;
如果拿不到form1对象的引用,还是在form2里面定义个事件吧,在你想要调用 ShowMsg时执行事件即可,前提是你在form1中给form2的事件绑定了 ShowMsg方法。
form2:
        public delegate void InvokeHandler(string msg);
       public static InvokeHandler InvokeEvent;
       在你想调用时执行if (InvokeEvent!=null)
            {
                InvokeEvent.Invoke();
            }
form1:
        在load中绑定form2的事件form2.InvokeEvent += ShowMsg;
       formclosing中注销事件form2.InvokeEvent -= ShowMsg;

但是不知道你为什么要调用form1的方法?如果知道原因,可能会有好的办法应对。