C#窗体传值方法总结

窗体传值是在学习窗体应用程序时碰到的一类比较常见的问题,现将窗体传值方法做了一点总结,方法如下:

<1>声明全局变量传值:

在Form1中声明全局变量,如下所示:

    public static string str = "窗体1的值";

通过Form1的button1_Click事件即可将此全局变量传递给Form2,Form1的全局变量str在Form2中可以直接访问,代码如下所示:

    private void button1_Click(object sender, EventArgs e)
    {            
          Form2 frm2 = new Form2();
          frm2.Show();
    }
    private void Form2_Load(object sender, EventArgs e)
    {   
          this.label1.Text = Form1.str;               
    }

<2>通过构造函数传值:

重载Form2的构造函数,使其能够接受一个来自Form1的参数,重载代码如下所示:

    private string str;
    public Form2(string s)
    {
        InitializeComponent();
        this.str = s;        
    }

上面代码中定义的string变量str用来存储从Form1传递进来的参数。
在Form1的button1_Click事件中实例化Form2并给其传递Form1的一个参数,代码如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        string s = this.textBox1.Text;
        Form2 frm2 = new Form2(s);
        frm2.Show();
    }

在Form2的Form2_Load中即可接受这个参数,接受这个参数值的代码如下所示:

    private void Form2_Load(object sender, EventArgs e)
    {
        this.label1.Text = str;                   
    }

这样,在单击Form1的button1之后,Form2便会蹦出来,Form2的label1便会显示这个从Form1传进来的值。

<3>在窗体中声明公共属性进行传值:

在Form2中声明公共属性,代码如下所示:
private string username;

    public string Username
    {
        get { return username; }
        set { username = value; }
    }
    private string password;

    public string Password
    {
        get { return password; }
        set { password = value; }
    }

这样,在Form1中即可访问这些属性,也就可以将Form2中这些公共属性的值传递给Form1了,并且也可以从Form1中向Form2的这些公共属性传值。代码如下所示:

(1)Form1向Form2传值:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Username = "Jack";  //Form1向Form2传值
        frm2.Password = "J1234";
    frm2.Show(); 
    }
    private void Form2_Load(object sender, EventArgs e)
    {
        textBox1.Text = username;
        textBox2.Text = password;
    }

(2)Form2向Form1传值:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        this.Username = textBox1.Text;
    }

    private void textBox2_TextChanged(object sender, EventArgs e)
    {
        this.Password = textBox1.Text;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Username = "Jack";  //Form1向Form2传值
        frm2.Password = "J1234";            
        comboBox1.Items.Add(frm2.Username);  //Form2向Form1传值
        comboBox1.Items.Add(frm2.Password);
        frm2.Show();
    }   

声明公共属性传值比较灵活,受限较少,因此比较好用。但是或许这会影响数据的安全性哦。

<4>传递整个窗体进行传值。

类似于构造函数传值,将窗体作为构造函数的参数即可传递整个窗体了。代码如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2(this);
        f2.Show();
    }   
    Form1 frm1;
    public Form2(Form1 f1)
    {
        InitializeComponent();
        this.frm1 = f1;            
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        this.textBox1.Text = frm1.ActiveControl.ToString();
    }

这样能把Form1整个窗体传递给Form2,在Form2里即可操作Form1的数据及其控件了。

<5>更改系统文件:

更改Form1.Designer.cs,譬如要使其控件变为公共可访问的,即找到在此文件中声明的控件,将你需要在Form2里访问的控件的访问修饰符修改为public,如下所示:

    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.ComboBox comboBox1;

将上面的代码里需要更改的控件的访问修饰符更改后保存即可。这种方法我个人感觉不好,有违C#语言的封装性和数据的安全性,个人建议不提倡使用。

<6>利用委托进行窗体传值:

这种方法是我在网上看到的,对原代码做了一点点改进,利用定义委托和事件以及构造函数的方法,实现了Form1和Form2互相传值。废话不多说,请看代码:
Form1部分的代码:

public partial class Form1 : Form
{        
     public Form1()
     {
         InitializeComponent();
     }

     private void button1_Click(object sender, EventArgs e)
     {
         string str = textBox1.Text;
         Form2 f2 = new Form2(str);
         f2.Translate += new TranslateEventHandler(f2_Translate);            
         f2.ShowDialog();
     }

     void f2_Translate(string value)
     {
         textBox1.Text = value;
         //throw new NotImplementedException();
     }               
}

Form2部分的代码:

 public delegate void TranslateEventHandler(string value);
 public partial class Form2 : Form
 {
     string str;
     public Form2(string s)
     {
         InitializeComponent();
         this.str = s;
     }
 
     public event TranslateEventHandler Translate;
     
     private void button1_Click(object sender, EventArgs e)
     {
         Translate(textBox1.Text);
         this.Close();
     }
 
     private void Form2_Load(object sender, EventArgs e)
     {
         this.textBox1.Text = str;
     }            
 }

Form设计如下图所示:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容