一个窗体(类)调用另一个窗体(类)参数(窗体参数传递--包括控件)方法总结

大致分4种情况:

1.声明Static静态,有静态类、静态变量、内部静态属性等,通过声明static,我们可以直接用类名来访问;

例如:public static string abc;//form1中声明

在form2中则:Form1.abc

2.使用构造函数,通过窗体在另一个窗体中实例化时传递参数,然后赋予引用取得变量值,这种方式比较常见;

eg:在Form1中:private string a; public Form1(string b){a=b;}

在Form2中:private string c;Form1 f1 = new Form1(c);

3.用公共属性或方法,实际上这也可以算是构造式,只有在不是static情况下,也要在窗体实例化后来引用;

eg:在Form1中:private string a;

public string A{ get{return a;} set{a=value;} }

在Form2中:Form1 f1 = new Form1();                  f1.A;//引用

4.通过Application.OpenForms[index].Controls[index]遍历索引获取另一个窗体的控件,在一个窗体操纵另一个窗体控件中比较常用,下面以2个不同窗体操纵TreeView来说明:

eg:在Form1中加入TreeView控件;

在Form2中:

Form myform = Application.OpenForms["Form1"].FindForm();

TreeView tv = (TreeView)myform.Controls["treeView1"];//这样我们就获取到了Form1中的控件体

接着添加节点:

注意2个问题:1)操纵主窗体的进程会引起进程同步,所以我们要改成异步进程(Thread/委托事件);

2)调用Invoke/BeginInvoke,注意窗口句柄和参数是否合适;

//下面使我们增加节点的操作代码

if (tv.IsHandleCreated)
            {
                object[] mytv = new object[2];
                mytv[0] = new TreeView();
                mytv[1] = kml.Name.ToString();
                tv.BeginInvoke(new addNodes(addNode), mytv);
            }

//增加节点委托
        public delegate void addNodes(TreeView treeview,string node);
        public void addNode(TreeView treeview,string node)
        {
            tv.Nodes.Add(node);
        }

总之,窗体间引用会增加额外的线程(方式4),不必要的时候用构造函数是最比较好,方式选择依系统性能和个人爱好所定!

综合下,改用方式:

private delevate void 委托(参数);

private void 方法(参数)

{

    if(控件.InvokeRequired)

{

    委托 abc = new 委托(方法);

    Invoke(abc,new object[]{参数});

}

else

{

    控件:执行普通控件操作。

}

}

posted on 2012-06-12 19:41  jin_qi_er  阅读(740)  评论(0编辑  收藏  举报