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

大致分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

{

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

}

}

转载于:https://www.cnblogs.com/jinqier/archive/2012/06/12/2546775.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值