WinForm窗體間如何傳值

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

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

           

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

           

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

          特點(diǎn):傳值是雙向的,實(shí)現(xià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í)候再通過讀取該變量的值來使用

          例子

          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);

          }

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

           

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

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

          例子

          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();

          }

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

           

          四、通過窗體的公有屬性值

          特點(diǎn):實(shí)現(xià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 ( );

           

          五、通過窗體的公有屬性值和Owner屬性

          特點(diǎn):實(shí)現(xià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;

           

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

          說明:Application.OpenForms屬性:獲取屬于應(yīng)用程序的打開窗體的集合。(此屬性在.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("來自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)都是無參數(shù)的,因此需要去修改構(gòu)造函數(shù)。

           

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

          特點(diǎn):傳值是單向的(不可以互相傳值),實(shí)現(xià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

           

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

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

          而這個(gè)方法,則可以用委托從父窗體傳遞過來。在父窗體中,聲明修改文本框的方法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í)行。:解決此問題。微軟引入了事件。

           

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

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

           

          實(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 )

          {

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

          Form2 f2 = (Form2) sender;

          //接收到Form2textBox1.Text

          this.textBox1.Text = f2.Form2Value;

          }

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

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 五峰| 泸州市| 山阳县| 甘洛县| 射阳县| 滦南县| 康平县| 潞城市| 海晏县| 镇原县| 宁河县| 宜兰市| 嵊泗县| 疏勒县| 桂平市| 怀仁县| 会泽县| 连云港市| 威宁| 昭通市| 宜川县| 鄂托克前旗| 同德县| 讷河市| 新蔡县| 武强县| 福安市| 南雄市| 台北市| 抚州市| 溧阳市| 洪江市| 马公市| 辛集市| 桐梓县| 临澧县| 宁化县| 鸡东县| 苗栗市| 文昌市| 宁海县|