WinForm窗體間如何傳值

          本文導(dǎo)讀:稍微復(fù)雜一點(diǎn)的程序一般都有兩個(gè)或者更多的窗體。有時(shí)在程序設(shè)計(jì)中,數(shù)據(jù)不僅要在同一個(gè)窗體中傳遞,還要在窗體間傳遞,尤其是用子窗體如何改變父窗體。WinForm多窗體間傳值的方法有很多,根據(jù)需要傳送的值的類型可以采用不同的方法

          窗體間傳遞數(shù)據(jù),無(wú)論是父窗體操作子窗體,還是子窗體操作符窗體,有以下幾種方式:

           

          1. 公共靜態(tài)變量;
          2. 使用共有屬性;
          3. 使用委托與事件;
          4. 通過(guò)構(gòu)造函數(shù)把主窗體傳遞到從窗體中;

           

          一、通過(guò)靜態(tài)變量

          特點(diǎn):傳值是雙向的,實(shí)現(xiàn)簡(jiǎn)單

           

          實(shí)現(xiàn)代碼如下:

          在一個(gè)app類中定義一個(gè)靜態(tài)成員value

          public class app

          {

          public static string value;

          }

          在窗體Form1中這樣調(diào)用

          app.value = "f2"; //給靜態(tài)成員賦值

          new Form2 ( ).Show ( ); //顯示Form2

          在窗體Form2

          this.Text = app.value; //取回app.value的值

          app.value = "Form2"; //app.value賦值,以便其他窗體調(diào)用

           

          二、公共變量傳值

          這種方法就是利用一個(gè)公共變量,先把需要的值存放到這個(gè)公共變量,然后需要的時(shí)候再通過(guò)讀取該變量的值來(lái)使用

          例子

          Form1:

          public static string Form1Value; // 注意,必須申明為static變量

          private void button1_Click(object sender, EventArgs e)

          {

          Form1Value = "來(lái)自Form1";

          new Form2().Show();

          }

          Form2:

          private void Form_Load(object sender, EventArgs e)

          {

          MessageBox.Show(Form1.Form1Value);

          }

          這種方式傳值,理解和使用上都相對(duì)的簡(jiǎn)單,但是容易讓變量串值,比如第一次修改為“a”,而第二次修改為“b”,則有可能本來(lái)需要“a”值的結(jié)果變成了“b”。

           

          三、靜態(tài)方法方式訪問(wèn)

          這種方法與傳值方法的第一種有些類似,就是將需要被其他窗體訪問(wèn)的方法用static定義,以便其他傳遞可以直接訪問(wèn)到

          例子

          Form1:

          private void button1_Click(object sender, EventArgs e)

          {

          new Form2().Show();

          }

          public static void FF()

          {

          MessageBox.Show("Form1方法");

          }

          Form2:

          private void Form_Load(object sender, EventArgs e)

          {

          Form1.FF();

          }

          使用這種方法訪問(wèn)其他窗體的方法,在跨窗體上實(shí)現(xiàn)方便,但是需要需要訪問(wèn)到控件值則不能直接訪問(wèn),需要將值先傳遞給其他窗體,再有窗體傳遞回來(lái),或者存儲(chǔ)在其他變量后對(duì)這變量進(jìn)行訪問(wèn)。

           

          四、通過(guò)窗體的公有屬性值

          特點(diǎn):實(shí)現(xiàn)簡(jiǎn)單

           

          實(shí)現(xiàn)代碼如下:

          在窗體Form2中定義一個(gè)公有屬性Form2Value,獲取和設(shè)置textBox1的文本值

          public string Form2Value

          {

          get

          {

          return this.textBox1.Text;

          }

          set

          {

          this.textBox1.Text = value;

          }

          }

          在窗體Form1中這樣調(diào)用

          Form2 f2 = new Form2 ( );

          f2.Form2Value = "Ok"; //Form2textBox1賦值Ok

          f2.ShowDialog ( );

           

          五、通過(guò)窗體的公有屬性值和Owner屬性

          特點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,靈活

           

          實(shí)現(xiàn)代碼如下

          在窗體Form1

          public int Form1Value = 1;

          Form2 f2 = new Form2 ( );

          f2.ShowDialog ( this ); //Form1作為Form2的所有者傳遞給Form2

          在窗體Form2

          //Form2的所有者是Form1

          Form1 f1 = ( Form1 ) this.Owner;

          //取到Form1的值是1

          MessageBox.Show ( f1.Form1Value .ToString ( ) );

          //Form1Form1Value賦值222

          f1.Form1Value = 222;

           

          六、通過(guò)窗體的公有屬性值和Application.OpenForms屬性

          說(shuō)明:Application.OpenForms屬性:獲取屬于應(yīng)用程序的打開(kāi)窗體的集合。(此屬性在.NET Framework2.0版中)

           

          實(shí)現(xiàn)代碼如下

          在窗體Form1

          public int Form1Value = 1;

          Form2 f2 = new Form2 ( );

          f2.Show ( );

          在窗體Form2

          string formName = "Form1";

          Form fr = Application.OpenForms [ formName ];

          if ( fr != null )

          {

          Form1 f1 = ( Form1 ) fr;

          //取到Form1的值是1

          MessageBox.Show ( f1.Form1Value.ToString ( ) );

          //Form1Form1Value賦值222

          f1.Form1Value = 222;

          }

           

          七、傳參式傳值

          此方法顧名思義就是將需要的值一參數(shù)形式傳遞給需要值的窗體

          例子

          Form1:

          private void button1_Click(object sender, EventArgs e)

          {

          new Form2("來(lái)自Form1").Show();

          }

          Form2:

          public Form2(string value)

          {

          InitializeComponent();

          MessageBox.Show(vaue);

          }

          此種窗體間傳值方法明顯優(yōu)與第一種的傳值參數(shù),也不會(huì)出現(xiàn)串?dāng)?shù)據(jù)現(xiàn)象,但是需要注意修改Form2的構(gòu)造函數(shù),每個(gè)窗體的默認(rèn)構(gòu)造函數(shù)默認(rèn)都是無(wú)參數(shù)的,因此需要去修改構(gòu)造函數(shù)。

           

          八、通過(guò)構(gòu)造函數(shù)

          特點(diǎn):傳值是單向的(不可以互相傳值),實(shí)現(xiàn)簡(jiǎn)單

           

          實(shí)現(xiàn)代碼如下:

          在窗體Form2

          int value1;

          string value2;

          public Form2 ( int value1 , string value2 )

          {

          InitializeComponent ( );

          this.value1 = value1;

          this.value2 = value2;

          }

          在窗體Form1中這樣調(diào)用

          new Form2 ( 111 , "222" ).Show ( ); //這樣就把111,"222",2個(gè)值傳送給了Form2

           

          九、用委托來(lái)實(shí)現(xiàn)。

          委托可以把一個(gè)方法作為參數(shù)帶入另一個(gè)方法,在窗體傳值中,子窗體需要執(zhí)行一個(gè)方法來(lái)改變父窗體的值,

          而這個(gè)方法,則可以用委托從父窗體傳遞過(guò)來(lái)。在父窗體中,聲明修改文本框的方法AfterChildChange,在new一個(gè)子窗體的時(shí)候,將這個(gè)方法傳遞給子窗體。那么當(dāng)子窗體點(diǎn)擊同步按鈕時(shí),會(huì)執(zhí)行父窗體的AfterChildChange方法,已達(dá)到修改文本框值的目的。

           

          例子

          1、在子窗體中設(shè)置一個(gè)委托類型的屬性:

          public Action<string> AfterChangeTextDel { get; set; }

          2、在子窗體同步按鈕中:

          if (AfterChangeTextDel != null)
          {
          AfterChangeTextDel(this.textBox1.Text);//執(zhí)行委托
          }

          3、在父窗體中添加方法:

          public void AfterChildChange(string text)
          {
          txtName.Text = text;
          }

          4、在父窗體啟動(dòng)子窗體按鈕:

          ChildFrm frm =new ChildFrm();

          frm.AfterChangeTextDel = new Action<string>(this.AfterChildChange);

          frm.Show();

          5、這樣也能實(shí)現(xiàn)窗體傳值,子窗體的委托可以在父窗體 其他地方可以進(jìn)行直接執(zhí)行。:解決此問(wèn)題。微軟引入了事件。

           

          十、用事件來(lái)實(shí)現(xiàn)

          事件是委托類型的對(duì)象。它內(nèi)部是用委托來(lái)實(shí)現(xiàn)的,對(duì)于事件來(lái)說(shuō),外部只能注冊(cè)自己+=,注銷自己-=,外界不可以注銷其他的注冊(cè)者,也不能主動(dòng)觸發(fā)事件。而委托則無(wú)法實(shí)現(xiàn)這些控制,因此誕生了事件這話總語(yǔ)法。

           

          實(shí)現(xiàn)代碼如下

          在窗體Form2中定義公有屬性Form2Value,獲取和設(shè)置textBox1的文本值

          并且還定義一個(gè)accept事件

          public string Form2Value

          {

          get

          {

          return this.textBox1.Text;

          }

          set

          {

          this.textBox1.Text = value;

          }

          }

          public event EventHandler accept;

           

          private void button1_Click ( object sender , EventArgs e )

          {

          if ( accept != null )

          {

          accept ( this , EventArgs.Empty ); //當(dāng)窗體觸發(fā)事件,傳遞自身引用

          }

          }

          在窗體Form1

          Form2 f2 = new Form2 ( );

          f2.accept += new EventHandler ( f2_accept );

          f2.Show ( );

          void f2_accept ( object sender , EventArgs e )

          {

          //事件的接收者通過(guò)一個(gè)簡(jiǎn)單的類型轉(zhuǎn)換得到Form2的引用

          Form2 f2 = (Form2) sender;

          //接收到Form2textBox1.Text

          this.textBox1.Text = f2.Form2Value;

          }

          posted on 2014-03-04 16:32 SkyDream 閱讀(618) 評(píng)論(0)  編輯  收藏 所屬分類: C# WinForm

          <2014年3月>
          2324252627281
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 七台河市| 克东县| 乌兰县| 海宁市| 安远县| 阿合奇县| 玉林市| 顺平县| 日照市| 宁河县| 旌德县| 饶平县| 东光县| 黄山市| 高安市| 神农架林区| 新宁县| 格尔木市| 汾阳市| 无极县| 大方县| 新余市| 莲花县| 麟游县| 永城市| 永嘉县| 博湖县| 济南市| 西贡区| 崇州市| 都江堰市| 平南县| 酉阳| 农安县| 会理县| 普兰县| 南宫市| 新巴尔虎左旗| 墨玉县| 涟水县| 尚志市|