A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© .net_交流 中级黑马   /  2014-7-30 21:25  /  1165 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 .net_交流 于 2014-7-31 22:22 编辑

写一个窗体,有一个按钮,点击打开另一个窗体,在另一个窗体中也有一个按钮点击来改变原来窗体的背景,要用到委托,不知道怎么写,怎么传值到其他窗体?

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

10 个回复

倒序浏览
通过窗体的公有属性值
举个例子
在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值
public string Form2Value
{
get
{
return this.textBox1.Text;
}
set
{
this.textBox1.Text = value;
}
}
在窗体Form1中这样调用
Form2 f2 = new Form2 ( );
f2.Form2Value = "Ok"; //给Form2的textBox1赋值Ok
f2.ShowDialog ( );

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
从Form1窗体单击打开Form2窗体,Form1窗体中控件的单击事件:

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.Show();
        }

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1 楼主问的是窗体传值哦,不过破例鼓励下.

查看全部评分

回复 使用道具 举报
本帖最后由 流失的温度0 于 2014-8-1 14:22 编辑

不知道楼主发没发现窗体的扩展名也是.cs
所以窗体也是一个类,
所以楼主可以在目标窗体定义一个public类型的变量
然后在需要的时候给该变量赋值,
然后就可以在该窗体中使用了。
比如窗体1和窗体2
在窗体2的后台代码里定义public int a;
需要的时候写
Form2 fr=new Form2();
fr.a=10;
fr.show();


评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
路过 学习
回复 使用道具 举报
本帖最后由 许庭洲 于 2014-8-1 05:57 编辑

1.公共静态变量:
Form1:
public static string Form1Value; // 注意,必须申明为static变量
private void button1_Click(object sender, EventArgs e)
{
        Form1Value = "来自Form1";
        new Form2().Show();
}
Form2:
private void Form_Load(object sender, EventArgs e)
{
        MessageBox.Show(Form1.Form1Value);
}
2.使用共有属性:
在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值
public string Form2Value
{
      get
     {
            return this.textBox1.Text;
     }
     set
    {
           this.textBox1.Text = value;
     }
}
在窗体Form1中这样调用
Form2 f2 = new Form2 ( );
f2.Form2Value = "Ok"; //给Form2的textBox1赋值Ok
f2.ShowDialog ( );
3.使用委托与事件:
在子窗体中设置一个委托类型的属性:
public Action<string> AfterChangeTextDel { get; set; }
在子窗体同步按钮中:
if (AfterChangeTextDel != null)
{
        AfterChangeTextDel(this.textBox1.Text);//执行委托
}

在父窗体中添加方法:
public void AfterChildChange(string text)
{
        txtName.Text = text;
}

在父窗体启动子窗体按钮:
ChildFrm frm =new ChildFrm();
frm.AfterChangeTextDel = new Action<string>(this.AfterChildChange);
frm.Show();
4.通过构造函数把主窗体传递到从窗体中:
在窗体Form2中
int value1;
string value2;
public Form2 ( int value1 , string value2 )
{
       InitializeComponent ( );
       this.value1 = value1;
       this.value2 = value2;
}
在窗体Form1中这样调用
new Form2 ( 999 , "777" ).Show ( ); //这样就把999,"777",这2个值传送给了Form2

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报 1 0
除了使用公共属性意外,还可以使用事件与委托那个方法传递http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
窗体之间通信,可以把一些需要的东西设为public,比如窗体2的按钮点击,改变窗体1的某个按钮的背景颜色,这时候可以把窗体1的按钮的访问修饰符设为public的,但是这样给窗体2的权限就太大了,他不仅可以更改颜色,还可以更改其他很多的东西,处于安全,而且考虑到面向对象开放封闭的设计理念,这样就是不合理的
一般来说这种时候都是用事件,,首先要有一个参数为颜色的委托类型,然后在窗体2中声明一个对应参数的事件A.窗体1要写一个更改自己对应按钮颜色的方法,参数自然是颜色,然后把这个方法注册给窗体2的A事件,在窗体2点击事件绑定的方法内部,去调用这个事件A.就实现了需求

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报 1 0
许庭洲 发表于 2014-7-31 08:33
1.公共静态变量:
Form1:
public static string Form1Value; // 注意,必须申明为static变量

很全面 谢谢回答
回复 使用道具 举报
兄弟,顶起,共同努力共同进步
回复 使用道具 举报
路过 学习~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马