輕松掌握Windows窗體間的數據交互(轉載)

輕松掌握Windows窗體間的數據交互
作者:鄭佐
日期:2004-04-05
Windows 窗體是用于 Microsoft Windows 應用程序開發的、基于 .NET Framework 的新平臺。此框架提供一個有條理的、面向對象的、可擴展的類集,它使您得以開發豐富的 Windows 應用程序。一個Windows窗體就代表了.NET架構里的System.Windows.Forms.Form類的一個實例。
筆者在CSDN技術論壇.NET板塊下的C#分類經常看到有人問起如何在兩個Form間傳遞數據,訪問修改對方窗體里面的值。對于有經驗的程序員來說不是什么高深的東西,而對于初學者來說這些基礎的東西往往是一個問題,并且存在這種現象,往往比較復雜的東西他們會,要用什么了就去學什么,實際上并沒有真正的去理解掌握它,基礎不扎實,所以就有了想通過自己對窗體編程積累的經驗來寫一些這方面的文章,以供學.NET的朋友參考,也借此機會同各位朋友進行交流,寫得不合理的地方請各位朋友提寶貴意見,下面我分了三個部分來講。
?
一.使用帶參數的構造函數
我們要做的準備工作就是新建兩個窗體,下面是兩個窗體的布局,很簡單:
form1form2
說明:Form1為主窗體,包含控件:文本框textBoxFrm1,多選框checkBoxFrm1和按鈕buttonEdit;
Form2為子窗體,包含控件:文本框textBoxFrm2,多選框checkBoxFrm2和按鈕buttonOKbuttonCancel。
當我們新建一個窗體的時候,設計器會生成默認的構造函數:
public Form2()
{
??? InitializeComponent();
}
它不帶參數,既然我們要把Form1中的一些數據傳到Form2中去,為什么不在Form2的構造函數里做文章呢?
假設我們要實現使Form2中的文本框顯示Form1里textBoxFrm1的值,修改子窗體的構造函數:
public Form2(string text)
{
??? InitializeComponent();
??? this.textBoxFrm2.Text = text;
}
增加Form1中的修改按鈕點擊事件,處理函數如下:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
??? Form2 formChild = new Form2(this.textBoxFrm1.Text);
??? formChild.Show();
}
我們把this.textBoxFrm1.Text作為參數傳到子窗體構造函數,以非模式方式打開,這樣打開的formChild的文本框就顯示了”主窗體”文本,是不是很簡單,接下來我們傳一個boolean數據給子窗體。
Public Form2(string text,bool checkedValue)
{
??? InitializeComponent();
??? this.textBoxFrm2.Text = text;
??? this.checkBoxFrm2.Checked = checkedValue;
}
在主窗體中的修改按鈕點擊處理,我采用了打開模式窗口的方式,其實在這個例子中看不出有什么分別,
private void buttonEdit_Click(object sender, System.EventArgs e)
{
??? Form2 formChild = new Form2(this.textBoxFrm1.Text,this.checkBoxFrm1.Checked);
??? formChild.ShowDialog();
}
結果在預料之中,但是這里明顯存在不足,在子窗體里的數據修改后不能傳給主窗體,也就是說主窗體不受子窗體的影響。而在實際的開發過程中我們經常使用子窗體來修改主窗體里面的數據,那怎么解決呢?
??? 在.NET中有兩種類型,值類型和引用類型。值類型是從ValueType繼承而來,而ValueType又是從Object繼承;對于引用類型它直接繼承Object類型。這下讓我們看看怎樣通過Form2來修改Form1里的數據。
還是讓我們來修改Form2的代碼。
Private TextBox textBoxFrm12;
private CheckBox checkBoxFrm12;
public Form2(TextBox heckbo,CheckBox heckbox)
{
??? InitializeComponent();
??? this.textBoxFrm2.Text = heckbo.Text;
??? this.checkBoxFrm2.Checked = heckbox.Checked;
??? this.textBoxFrm12 = heckbo;
??? this.checkBoxFrm12 = heckbox;
}
現在我們傳了兩個引用類型的數據:TextBox類型,和CheckBox;另外在Form2中增加了兩個類數據成員textBoxFrm12、checkBoxFrm12用來分別保存構造函數傳來的變量,不過他們并不屬于Form2的Controls容器。修改Form2的確定按鈕點擊事件函數:
private void buttonOK_Click(object sender, System.EventArgs e)
{
??? this.textBoxFrm12.Text = this.textBoxFrm2.Text;
??? this.checkBoxFrm12.Checked = this.checkBoxFrm2.Checked;
??? this.Close();
}
上面的代碼我們通過把textBoxFrm2的Text和checkBoxFrm2.Checked賦給textBoxFrm12和checkBoxFrm12完成了對主窗體中的textBoxFrm1和checkBoxFrm2的修改,因為textBoxFrm1和textBoxFrm12是同一個引用,而checkBoxFrm2和checkBoxFrm12也是。
到這里為止功能是實現了,但是總覺得不是很合理,讓兩個窗體控件傳來傳去,現在我舉一個恰當一點的例子。
修改了兩個窗體:
form11form22
說明:在這個例子中我們的兩個窗體都加了一個ListBox用來顯示ArrayList中的內容。
主窗體中控件:listBoxFrm1,buttonEdit;
子窗體中控件:listBoxFrm2,textBoxAdd,buttonAdd,buttonEdit,buttonOK。
這次我們用ArrayList來作為傳遞數據,在Form1中定義類數據成員:
private ArrayList listData1;
在構造函數中增加了對listData1進行內存分配,并生成數據最終綁定到listBoxFrm1,
public Form1()
{
??? InitializeComponent();
??? this.listData1 = new ArrayList();
??? this.listData1.Add("DotNet");
??? this.listData1.Add("C#");
??? this.listData1.Add("Asp.net");
??? this.listData1.Add("WebService");
??? this.listData1.Add("XML");
??? this.listBoxFrm1.DataSource = this.listData1;
}
另外,對修改按鈕點擊事件處理函數的修改如下:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
??? Form2 formChild = new Form2(this.listData1);
??? formChild.ShowDialog();
??? this.listBoxFrm1.DataSource = null;
??? this.listBoxFrm1.DataSource = this.listData1;
}
相對與主窗體,對子窗體作相應修改,也在Form2中增加了類數據成員:
private ArrayList listData2;
用來保存對主窗體中listData1的引用。
修改構造函數:
public Form2(ArrayList listData)
{
??? InitializeComponent();
??? this.listData2 = listData;
??? foreach(object o in this.listData2)
??? {
??????? this.listBoxFrm2.Items.Add(o);
??? }??????????
}
這里讓listData2同listData1指向同一個引用;另外沒有對listBoxFrm進行綁定,采用了填充。
好了,下面是對數據操作的時候了。
添加處理函數代碼如下:
private void buttonAdd_Click(object sender, System.EventArgs e)
{
??? if(this.textBoxAdd.Text.Trim().Length>0)
??? {
??????? this.listData2.Add(this.textBoxAdd.Text.Trim());
??????? this.listBoxFrm2.Items.Add(this.textBoxAdd.Text.Trim());
??? }
??? else
??????? MessageBox.Show("請輸入添加的內容!");
}
刪除處理代碼如下:
private void buttonDel_Click(object sender, System.EventArgs e)
{
??? int index = this.listBoxFrm2.SelectedIndex;
??? if(index!=-1)
??? {
??????? this.listData2.RemoveAt(index);
??????? this.listBoxFrm2.Items.RemoveAt(index);
??? }
??? else
??????? MessageBox.Show("請選擇刪除項或者沒有可刪除的項!");
}
退出Form2子窗體:
private void buttonOK_Click(object sender, System.EventArgs e)
{
??? this.Close();
}
編譯運行程序,在子窗體中對數據進行修改,關閉后,主窗體就會顯示更新后的數據。
這里有一點要提醒一下,比較兩個例子,我們都傳的是引用類型,一個是String,另一個是ArrayList,為什么string類型不能修改主窗體的數據呢?其實在.Net中對string類型的修改并不是修改原來的值,原來的值沒有變化,而是重新生成一個新的字符串,下面是一個很好的說明。
public class ZZConsole
{
??? [STAThread]
??? static void Main(string[] args)
??? {
??????? ??? string str1 = "abc";
??????????? string str2 = str1;
??????????? str1 = "123";
??????????? Console.WriteLine(str1);
??????????? Console.WriteLine("--------------");
??????????? Console.WriteLine(str2);
??????????? Console.WriteLine("--------------");
??????????? ArrayList al1 = new ArrayList();
??????????? al1.Add("abc");
??????????? ArrayList al2 = al1;
??????????? al2.Add("123");
??????????? foreach(object o in al1)
??????????????? Console.WriteLine((string)o);
??????????? Console.WriteLine("--------------");
??????????? foreach(object o in al2)
??????????????? Console.WriteLine((string)o);
??????????? Console.ReadLine();
??????? }
??? }
運行一下看看輸出結果就明白了,另外對值類型的數據操作要使用ref關鍵字。
??? 總結,我們通過帶參數的構造函數實現了窗體間的數據交互,代碼看上去也比較清楚,在實際開發過程中,可以把DataSet,DataTable,或者是DataView當作參數,當然如果只是想修改一行,可以傳個DataRow或者DataRowView。在下我們來看看怎樣使用另外兩種方法來實現數據的交互。
二.給窗體添加屬性或方法
1.使用Form類的Owner屬性
獲取或設置擁有此窗體的窗體。若要使某窗體歸另一個窗體所有,請為其 Owner 屬性分配一個對將成為所有者的窗體的引用。當一個窗體歸另一窗體所有時,它便隨著所有者窗體最小化和關閉。例如,如果 Form2 歸窗體 Form1 所有,則關閉或最小化 Form1 時,也會關閉或最小化 Form2。并且附屬窗體從不顯示在其所有者窗體后面。可以將附屬窗體用于查找和替換窗口之類的窗口,當選定所有者窗體時,這些窗口不應消失。若要確定某父窗體擁有的窗體,請使用OwnedForms屬性。
上面是SDK幫助文檔上講的,下面我們就來使用它。
首先還是使用第一篇文章中的第二個例子,窗體如下:
form11form22
說明:在這個例子中我們的兩個窗體都加了一個ListBox用來顯示ArrayList中的內容。
主窗體中控件:listBoxFrm1,buttonEdit;
子窗體中控件:listBoxFrm2,textBoxAdd,buttonAdd,buttonEdit,buttonOK。
主窗體中還是定義類數據成員,
private ArrayList listData1;
在構造函數里實例化它,填充數據,最后綁定到listBoxFrm1。
構造函數如下:
public Form1()
{
??? InitializeComponent();
??? this.listData1 = new ArrayList();
??? this.listData1.Add("DotNet");
??? this.listData1.Add("C#");
??? this.listData1.Add("Asp.net");
??? this.listData1.Add("WebService");
??? this.listData1.Add("XML");
??? this.listBoxFrm1.DataSource = this.listData1;
}
主窗體的修改按鈕處理函數:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
??? Form2 formChild = new Form2();
??? formChild.Owner = this;
??? formChild.ShowDialog();
??? this.listBoxFrm1.DataSource = null;
??? this.listBoxFrm1.DataSource = this.listData1;
}
我們設置了formChild.Owner為this,這樣,子窗體和主窗體就有聯系了,
當然我們也可以改成如下:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
??? Form2 formChild = new Form2();
??? formChild.ShowDialog(this);
??? this.listBoxFrm1.DataSource = null;
??? this.listBoxFrm1.DataSource = this.listData1;
}
不過這樣還不行,目前主窗體的listData1變量外部訪問不到,
private ArrayList listData1;
必須修改為public訪問修飾符,
public ArrayList listData1;
也可以通過屬性(property)來實現,
public ArrayList ListData1
{
??? get{return this.listData1;}
}
這里我采用屬性,感覺語法更靈活,清楚。
下面是對Form2的修改,
構造函數又恢復原貌了。
public Form2()
{
??? InitializeComponent();
}
另外又新增了一個窗體的Load事件,在它的事件處理函數中來獲取主窗體中的數據,
private void Form2_Load(object sender, System.EventArgs e)
{
??? Form1 pareForm = (Form1)this.Owner;
??? this.listData2 = pareForm.ListData1;
??? foreach(object o in this.listData2)
??????? this.listBoxFrm2.Items.Add(o);
}
有人會問,為什么不把上面的代碼放到構造函數里面去呢?如下不是更好,
public Form2()
{
??? InitializeComponent();
??? Form1 pareForm = (Form1)this.Owner;
??? this.listData2 = pareForm.ListData1;
??? foreach(object o in this.listData2)
??????? this.listBoxFrm2.Items.Add(o);
}
那我會對你說錯了,因為在主窗體修改按鈕被點擊后,開始執行
Form2 formChild = new Form2();
而在Form2的實例化過程中會在構造函數中執行
Form1 pareForm = (Form1)this.Owner;
而這時的this.Owner是沒有值的,為空引用,那么下面的代碼肯定也出問題,
this.listData2 = pareForm.ListData1;
foreach(object o in this.listData2)
??? this.listBoxFrm2.Items.Add(o);
當整個Form2實例化完成后,才會執行
formChild.Owner = this;
這條代碼,所以使用了Form2_Load事件。
那怎樣可以不使用Form2_Load事件呢?等下面我們來修改代碼實現它。
下面的子窗體代碼沒有變化,
private void buttonAdd_Click(object sender, System.EventArgs e)
{
??? if(this.textBoxAdd.Text.Trim().Length>0)
??? {
??????? this.listData2.Add(this.textBoxAdd.Text.Trim());
??????? this.listBoxFrm2.Items.Add(this.textBoxAdd.Text.Trim());
??? }
??? else
??????? MessageBox.Show("請輸入添加的內容!");
}
private void buttonDel_Click(object sender, System.EventArgs e)
{
??? int index = this.listBoxFrm2.SelectedIndex;
??? if(index!=-1)
??? {
??????? this.listData2.RemoveAt(index);
??????? this.listBoxFrm2.Items.RemoveAt(index);
??? }
??? else
??????? MessageBox.Show("請選擇刪除項!");
}
private void buttonOK_Click(object sender, System.EventArgs e)
{
??? this.Close();
}
好了,結果同第一篇中的一樣,子窗體能修改主窗體的值。
?
2.使用自定義屬性或方法
下面我們來講講怎樣使用自定義屬性或方法來完成數據修改功能而不使用Form2_Load事件。
主窗體的修改按鈕點擊處理函數如下:
private void buttonEdit_Click(object sender, System.EventArgs e)
{
??? Form2 formChild = new Form2();
??? formChild.ListData2 = this.listData1;
??? formChild.ShowDialog();
??? this.listBoxFrm1.DataSource = null;
??? this.listBoxFrm1.DataSource = this.listData1;
}
并且我們去掉了主窗體的ListData1屬性,
//public ArrayList ListData1
//{
//?get{return this.listData1;}
//}
而在子窗體中加上ListData2屬性,
public ArrayList ListData2
{
??? set
??? {
??????? this.listData2 = value;
??????? foreach(object o in this.listData2)
??????????? this.listBoxFrm2.Items.Add(o);
??? }
}
也可以把屬性改成方法,
public void SetListData(ArrayList listData)
{
??? this.listData2 = listData;
??? foreach(object o in this.listData2)
??????? this.listBoxFrm2.Items.Add(o);
}
而在主窗體的修改按鈕處理函數中也要相應改動:
formChild.ListData2 = this.listData1;
改為
formChild.SetListData(this.listData1);
??? 總結,我們通過Form類的Owner屬性來建立主從窗體間的橋梁,這個是不是類似于把主窗體作為子窗體的構造函數參數傳入實現的功能差不多;另外又采用了屬性和方法來完成數據的交互,我覺得這種實現方法很實用,特別是用在不需要實例化類或著已經有了實例的情況下傳遞數據。下一節我們來講如何使用靜態類來完成數據的交互。
三.使用靜態類
??? 在第一節和第二節中我們使用帶參數的構造函數、屬性以及方法實現了數據的交互,接下來要講的是使用靜態類來完成窗體間的數據交互。這個也是我們經常要用到的一種數據交互方法。
?
下面是定義的一個類:
using System;
using System.Collections;
namespace ZZ
{
??? public class AppDatas
??? {
??????? //靜態數據成員
??????? private static ArrayList listData;
??????? //靜態構造函數
??????? static AppDatas()
??????? {
??????????? listData = new ArrayList();
??????????? listData.Add("DotNet");
??????????? listData.Add("C#");
??????????? listData.Add("Asp.net");
??????????? listData.Add("WebService");
??????????? listData.Add("XML");
??????? }
??????? //靜態屬性
??????? public static ArrayList ListData
??????? {
??????????? get{return listData;}
??????? }
??????? //靜態方法
??????? public static ArrayList GetListData()
??????? {
??????????? return listData;
??????? }
??? }
}
上面包含了一個靜態類成員,listData,一個靜態構造函數static AppDatas(),用來初始化listData的數據。還有一個靜態屬性ListData和一個靜態GetListData()方法,他們實現了同樣的功能就是返回listData。
另外兩個窗體沒有改變布局可參看前兩篇文章還是如下:
form11form22
由于前面兩篇文章已經講了很多,這個不細說了,下面是完整的代碼:
Form1.cs文件
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
?namespace ZZ
{
??? public class Form1 : System.Windows.Forms.Form
??? {
??????? private System.Windows.Forms.Button buttonEdit;
??????? private System.Windows.Forms.ListBox listBoxFrm1;
??????? private System.ComponentModel.Container components = null;
??????? public Form1()
??????? {
??????????? InitializeComponent();
??????????? this.listBoxFrm1.DataSource = AppDatas.ListData;
???????????
??????? }
???????
??????? protected override void Dispose( bool disposing )
??????? {
??????????? if( disposing )
??????????? {
??????????????? if(components != null)
??????????????? {
??????????????????? components.Dispose();
??????????????? }
??????????? }
??????????? base.Dispose( disposing );
??????? }
??????? [STAThread]
??????? static void Main()
??????? {
??????????? Application.Run(new Form1());
??????? }
??????? #region Windows 窗體設計器生成的代碼
??????? private void InitializeComponent()
??????? {
??????????? this.buttonEdit = new System.Windows.Forms.Button();
??????????? this.listBoxFrm1 = new System.Windows.Forms.ListBox();
??????????? this.SuspendLayout();
??????????? //
??????????? // buttonEdit
??????????? //
??????????? this.buttonEdit.Location = new System.Drawing.Point(128, 108);
??????????? this.buttonEdit.Name = "buttonEdit";
??????????? this.buttonEdit.TabIndex = 1;
??????????? this.buttonEdit.Text = "修改";
??????????? this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click);
??????????? //
??????????? // listBoxFrm1
??????????? //
??????????? this.listBoxFrm1.ItemHeight = 12;
??????????? this.listBoxFrm1.Location = new System.Drawing.Point(12, 8);
??????????? this.listBoxFrm1.Name = "listBoxFrm1";
??????????? this.listBoxFrm1.Size = new System.Drawing.Size(108, 124);
??????????? this.listBoxFrm1.TabIndex = 2;
??????????? //
??????????? // Form1
??????????? //
??????????? this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
??????????? this.ClientSize = new System.Drawing.Size(208, 141);
??????????? this.Controls.Add(this.listBoxFrm1);
??????????? this.Controls.Add(this.buttonEdit);
??????????? this.Name = "Form1";
??????? ??? this.Text = "Form1";
??????????? this.ResumeLayout(false);
??????? }
??????? #endregion
??????? private void buttonEdit_Click(object sender, System.EventArgs e)
??????? {
??????????? Form2 formChild = new Form2();
??????????? formChild.ShowDialog();
??????????? this.listBoxFrm1.DataSource = null;
??????????? this.listBoxFrm1.DataSource = AppDatas.ListData;
??????? }
??? }
}
Form2.cs文件
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace ZZ
{
??? public class Form2 : System.Windows.Forms.Form
??? {
??????? private System.Windows.Forms.Button buttonOK;
??????? private System.ComponentModel.Container components = null;
??????? private System.Windows.Forms.ListBox listBoxFrm2;
??????? private System.Windows.Forms.Button buttonAdd;
??????? private System.Windows.Forms.Button buttonDel;
??????? private System.Windows.Forms.TextBox textBoxAdd;
??????? public Form2()
??????? {
??????????? InitializeComponent();
??????????? foreach(object o in AppDatas.ListData)
??????????????? this.listBoxFrm2.Items.Add(o);
??????? }
??????? protected override void Dispose( bool disposing )
??????? {
??????????? if( disposing )
??????????? {
??? ??????????? if(components != null)
??????????????? {
??????????????????? components.Dispose();
??????????????? }
??????????? }
??????????? base.Dispose( disposing );
??????? }
??????? #region Windows 窗體設計器生成的代碼
??????? private void InitializeComponent()
??????? {
??????????? this.buttonOK = new System.Windows.Forms.Button();
??????????? this.listBoxFrm2 = new System.Windows.Forms.ListBox();
??????????? this.buttonAdd = new System.Windows.Forms.Button();
??????????? this.buttonDel = new System.Windows.Forms.Button();
??????????? this.textBoxAdd = new System.Windows.Forms.TextBox();
??????????? this.SuspendLayout();
??????????? //
??????????? // buttonOK
??????????? //
??????? ??? this.buttonOK.Location = new System.Drawing.Point(188, 108);
??????????? this.buttonOK.Name = "buttonOK";
??????????? this.buttonOK.TabIndex = 0;
??????????? this.buttonOK.Text = "確定";
??????????? this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
??????????? //
??????????? // listBoxFrm2
??????????? //
??????????? this.listBoxFrm2.ItemHeight = 12;
??????????? this.listBoxFrm2.Location = new System.Drawing.Point(8, 8);
??????????? this.listBoxFrm2.Name = "listBoxFrm2";
??????????? this.listBoxFrm2.Size = new System.Drawing.Size(168, 124);
??????????? this.listBoxFrm2.TabIndex = 2;
??????????? //
??????????? // buttonAdd
??????????? //
??????????? this.buttonAdd.Location = new System.Drawing.Point(188, 44);
??????????? this.buttonAdd.Name = "buttonAdd";
??????????? this.buttonAdd.TabIndex = 3;
??????????? this.buttonAdd.Text = "增加";
??????????? this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);
??????????? //
??????????? // buttonDel
??????????? //
??????????? this.buttonDel.Location = new System.Drawing.Point(188, 76);
??????????? this.buttonDel.Name = "buttonDel";
??????????? this.buttonDel.TabIndex = 4;
??????????? this.buttonDel.Text = "刪除";
??????????? this.buttonDel.Click += new System.EventHandler(this.buttonDel_Click);
??????????? //
??????????? // textBoxAdd
??????????? //
??????????? this.textBoxAdd.Location = new System.Drawing.Point(188, 12);
??????????? this.textBoxAdd.Name = "textBoxAdd";
??????????? this.textBoxAdd.Size = new System.Drawing.Size(76, 21);
??????????? this.textBoxAdd.TabIndex = 5;
??????????? this.textBoxAdd.Text = "";
??????????? //
??????????? // Form2
??????????? //
??????????? this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
??????????? this.ClientSize = new System.Drawing.Size(272, 141);
??????????? this.Controls.Add(this.textBoxAdd);
??????????? this.Controls.Add(this.buttonDel);
??????????? this.Controls.Add(this.buttonAdd);
??????????? this.Controls.Add(this.listBoxFrm2);
??????????? this.Controls.Add(this.buttonOK);
??????????? this.Name = "Form2";
??????????? this.Text = "Form2";
??????????? this.ResumeLayout(false);
??????? }
??????? #endregion
??????? private void buttonOK_Click(object sender, System.EventArgs e)
??????? {
??????????? this.Close();
??????? }
??????? private void buttonAdd_Click(object sender, System.EventArgs e)
??????? {
???????????
??????????? if(this.textBoxAdd.Text.Trim().Length>0)
??????????? {
??????????????? ?AppDatas.ListData.Add(this.textBoxAdd.Text.Trim());
??????????????? this.listBoxFrm2.Items.Add(this.textBoxAdd.Text.Trim());
??????????? }
??????????? else
??????????????? MessageBox.Show("請輸入添加的內容!");
???????????
??????? }
??????? private void buttonDel_Click(object sender, System.EventArgs e)
??????? {
??????????? int index = this.listBoxFrm2.SelectedIndex;
??????????? if(index!=-1)
??????????? {
??????????????? ?AppDatas.ListData.RemoveAt(index);
??????????????? this.listBoxFrm2.Items.RemoveAt(index);
???????????????
??????????? }
??????????? else
??????????????? MessageBox.Show("請選擇刪除項!");
??????? }
??? }
}
調試可以看到實現了同樣的功能。
??? 總結,筆者認為使用靜態類比較多的地方就是把應用程序的配置文件裝載到一個靜態類里面,讓所有的窗體和其他實例都可以通過靜態屬性以及靜態方法使用這些數據,比如三層結構或多層結構都可以訪問它,而不是在多個實例間傳來傳去。在這里我們討論的是Windows窗體,其實在兩個不同的實例間交互數據,都可以采用文章中的方案實現,除非是這個類特有的屬性或著方法。

轉載于:https://www.cnblogs.com/wuyu8081/archive/2008/09/30/1302392.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379881.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MATLAB安裝問題解決方案大集錦

我的安裝后的兩個問題 第一個:“Microsoft Visual C Runtime LibraryRuntime Error!Program:C:\Matlab7\Rin\Win32\Matlab.exeThis application has requested the runtime to terminate it in an unusual way.Please contact the applications support team for mo…

python免殺技術---shellcode的加載與執行

0x01 生成shellcode 首先通過下列命令生成一個shellcode,使用msfvenom -p選項來指定paylaod,這里選用windows/x64、exec模塊接收的參數。使用calc.exe執行彈出計算器的操作。-f選項用來執行生成的shellcdoe的編譯語言。 msfvenom -p windows/x64/exec …

成對的歌曲,其總持續時間可被60整除

Problem statement: 問題陳述&#xff1a; In a list of songs, the i-th song has duration of time[i] seconds. Return the number of pairs of songs for which their total duration in seconds is divisible by 60. Formally, we want the number of indices i < j w…

Qt中QTableWidget用法總結

QTableWidget是QT程序中常用的顯示數據表格的空間&#xff0c;很類似于VC、C#中的DataGrid。說到QTableWidget&#xff0c;就必須講一下它跟QTabelView的區別了。QTableWidget是QTableView的子類&#xff0c;主要的區別是QTableView可以使用自定義的數據模型來顯示內容(也就是先…

[轉]軟件架構師書單

"其實中國程序員&#xff0c;現在最需要的是一張安靜的書桌。"&#xff0c;的確&#xff0c;中國架構師大多缺乏系統的基礎知識&#xff0c;與其自欺欺人的宣揚"讀書無用&#xff0c;重在實踐變通&#xff0c;修身立命哲學書更重要"&#xff0c;把大好時間…

Java——List集合特有的功能

* List也是一個接口&#xff0c;這說明List不能new&#xff0c;其中它有一個子類ArrayList&#xff0c;所以&#xff0c;就可以父類引用指向子類對象調用* List里面特有的方法&#xff1a;* * void add(int index,E element)在列表的指定位置插入指定元素&#xff08;可選操作&…

python免殺技術---復現+改進----1

0x01 復現 復現文章&#xff1a;https://mp.weixin.qq.com/s?__bizMzI3MzUwMTQwNg&mid2247484733&idx2&sn5b8f439c2998ce089eb44541d2da7a15&chksmeb231%E2%80%A6 首先用cobaltstruke生成一個python的payload腳本 然后復制里面的payload進行Base64編碼&…

python擲骰子_用于擲骰子的Python程序(2人骰子游戲)

python擲骰子Here, we will be going to design a very simple and easy game and implement it using abstract data class. The code consists of two different classes (The base of the whole program). The one will be the class for the player and others will be for…

ForeignKey和ManyToManyField的限制關系

authorsmodels.ManyToManyField(Author,limit_choice_to{name__endswith:Smith}這樣可以更方便的查詢。轉載于:https://www.cnblogs.com/chenjianhong/archive/2012/03/22/4145158.html

linux 目錄命令_Linux目錄命令能力問題和解答

linux 目錄命令This section contains Aptitude Questions and Answers on Linux Directory Commands. 本節包含有關Linux目錄命令的 Aptitude問答。 1) There are the following statements that are given which of them are correct about Linux commands? In the Linux o…

終于在HP2133上成功安裝xp

今天拿到一臺HP2133迷你筆記本&#xff0c;原裝vista home basic&#xff0c;由于本人是在不喜歡vista&#xff0c;于是決定將使用xp換之。 很久沒有研究裝系統了&#xff0c;HP2133沒有光驅&#xff0c;以前也沒啥這方面經驗&#xff0c;搞這個玩意安裝完軟件折騰了大半天&…

Java——GUI(圖形用戶界面設計)

事件處理&#xff1a;事件&#xff1a;用戶的一個操作(例如&#xff1a;點擊一下鼠標&#xff0c;或者敲擊一下鍵盤)事件源&#xff1a;被操作的組件(例如&#xff1a;在一個窗體中的一個按鈕&#xff0c;那個按鈕就屬于被操作的組件&#xff0c;按鈕就是事件源)監聽器&#xf…

python安全攻防---信息收集---IP查詢

IP查詢是通過當前所獲得的URL去查詢對應IP地址的過程&#xff0c;可應用Socket庫函數中的gethostbyname()獲取域名所對用的IP值 程序如下&#xff1a; # -*- coding:utf-8 -*- IP查詢import socket ip socket.gethostbyname(www.baidu.com) print(ip)運行結果&#xff1a; …

智能課程表Android版-學年學期星期的實現

上次我們實現了日期和時間的動態顯示&#xff0c;這次我們來實現學年&#xff0c;學期&#xff0c;周次的顯示&#xff0c;如圖: 首先是學年學期的顯示&#xff1a; Calendar cCalendar.getInstance(); int yearc.get(Calendar.YEAR); int monthc.get(Calendar.MONTH)1;//Calen…

感染linux腳本程序技術

前言 ---- 本文來源于29A病毒雜志,其上對linux shell病毒技術有了一個綜合的闡述,我不想翻譯它,我以它的那篇為模板 寫了這篇中文的文章,里面的代碼我都做了調試. 對于shell編程的程序員來說所謂的shell病毒技術其實根本就是小牛一毛,這點在大家看完本文后就會有所體會 但,簡單…

Java——設計模式(簡單工廠模式)

* A:簡單工廠模式概述* 簡單工廠模式又叫靜態工廠方法模式&#xff0c;它定義了一個具體的工廠類負責創建一些類的實例* B&#xff1a;優點* 客戶端不需要再負責對象的創建&#xff0c;從而明確了各個類的職責* 簡單來說&#xff0c;客戶端你只需要用就可以了&#xff0c;就…

Java ObjectOutputStream writeFloat()方法與示例

ObjectOutputStream類writeFloat()方法 (ObjectOutputStream Class writeFloat() method) writeFloat() method is available in java.io package. 在java.io包中提供了writeFloat()方法 。 writeFloat() method is used to write the given 4 bytes of a float value. writeFl…

python安全攻防---信息收集---whois查詢

whois是用來查詢域名的IP以及所有者信息的傳輸協議。簡單地說&#xff0c;whois就是一個數據庫&#xff0c;用來查詢域名是否以及被注冊&#xff0c;以及注冊域名的詳細信息&#xff08;如域名所有人、域名注冊商等&#xff09;。 使用whois查詢&#xff0c;首先通過pip安裝py…

百度面試題:從輸入url到顯示網頁,后臺發生了什么?

參考http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ http://www.cnblogs.com/wenanry/archive/2010/02/25/1673368.html 原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作為一個軟件開發者&#xff0c;你一定會…

VS2005無法啟動修復辦法

c:\Program Files\Microsoft Visual Studio 8\Common7\IDE>devenv /ResetSkipPkgs 轉載于:https://www.cnblogs.com/doc/archive/2008/10/10/1307887.html