直播中
文中軟件主要功能是用通過(guò)窗體上的二個(gè)按鈕來(lái)創(chuàng)建二個(gè)不同類型的WinForm組件--Button組件和TextBox組件,并在創(chuàng)建的同時(shí)為每一個(gè)組件的屬性賦值,給每一個(gè)創(chuàng)建的組件也創(chuàng)建了事件。
?。?).如何在窗體上創(chuàng)建Button組件:
其實(shí)用Visual C#創(chuàng)建一個(gè)組件是十分方便的,只用下列二行語(yǔ)句就可以完成了:
//創(chuàng)建一個(gè)新的Button組件
Button myButton = new Button ( ) ;
//在窗體中顯示此按鈕
this.Controls.Add ( myButton ) ;
但此時(shí)創(chuàng)建的這個(gè)Button組件沒(méi)有任何屬性,并且也沒(méi)有任何事件,在本文中介紹的程序中創(chuàng)建的Button組件,不僅有屬性也有事件,下列語(yǔ)句就是本文程序創(chuàng)建Button組件源代碼:
//按鈕數(shù)量計(jì)算器在每次按鈕按動(dòng)后加"1"
counter += 1 ;
//對(duì)要產(chǎn)生的按鈕的縱坐標(biāo)的相對(duì)位置是前一個(gè)產(chǎn)生按鈕的相對(duì)位置的縱坐標(biāo)加"3"
locY += this.btnAdd.Height + 3 ;
//創(chuàng)建一個(gè)新的Button組件
Button myButton = new Button ( ) ;
//設(shè)定他的名稱和Text屬性,以及產(chǎn)生的相對(duì)位置
myButton.Name = "Button " + counter ;
myButton.Text = "按鈕 " + counter ;
myButton.Location = new Point ( btnAdd.Location.X , locY ) ;
//為產(chǎn)生的新的Button組件設(shè)定事件,本文中為產(chǎn)生的按鈕設(shè)定了三個(gè)事件
myButton.MouseEnter += new System.EventHandler ( this.btn_MouseEnter ) ;
myButton.MouseLeave += new System.EventHandler ( this.btn_MouseLeave ) ;
myButton.Click += new System.EventHandler ( this.btn_Click ) ;
//在窗體中顯示此按鈕
this.Controls.Add ( myButton ) ;
程序不僅為每一個(gè)組件的屬性都賦值,而且為每一個(gè)組件都創(chuàng)建了三個(gè)事件。細(xì)心的讀者可能已經(jīng)注意到,程序?yàn)槊恳粋€(gè)組件創(chuàng)建的事件的名稱都是一樣的。這樣就有一個(gè)問(wèn)題,如何在這一樣的事件中,識(shí)別到底是哪個(gè)Button組件觸發(fā)了事件。
(2).確定是哪個(gè)組件觸發(fā)了事件:
由于程序中為每一個(gè)創(chuàng)建的Button組件的事件都是一樣的,要想正確處理這些組件的事件,就需要在事件觸發(fā)的程序中判斷到底是哪個(gè)組件觸發(fā)了這個(gè)事件。這就需要用到上面所提出的裝箱和出箱。我們知道Sender對(duì)象是一個(gè)參考類型變量,他存放的是指向觸發(fā)當(dāng)前事件實(shí)體對(duì)象的指針。要把他給轉(zhuǎn)換成實(shí)值對(duì)象類型,通過(guò)下列語(yǔ)句就可以確定是哪個(gè)組件觸發(fā)了當(dāng)前事件:
private void btn_MouseEnter ( object sender , System.EventArgs e )
{
//出箱
Button currentButton = ( Button ) sender ;
//設(shè)定按鈕的背景色
currentButton.BackColor = Color.Red ;
}
其他事件可以仿照此事件的處理過(guò)程來(lái)處理。
(3). 如何在窗體上創(chuàng)建TextBox組件:
創(chuàng)建TextBox組件的過(guò)程和創(chuàng)建Button組件過(guò)程相類似,只是在創(chuàng)建的組件類型上面有一點(diǎn)區(qū)別,具體實(shí)現(xiàn)語(yǔ)句如下:
//文本框數(shù)量計(jì)算器在每次按鈕按動(dòng)后加"1"
counter01 += 1 ;
//對(duì)要產(chǎn)生的文本框的縱坐標(biāo)的相對(duì)位置是前一個(gè)產(chǎn)生按鈕的相對(duì)位置的縱坐標(biāo)加"3
locY1 += this.txtAdd.Height + 3 ;
//創(chuàng)建一個(gè)新的TextBox組件
TextBox myBox = new TextBox ( ) ;
//設(shè)定他的名稱和Text屬性,以及產(chǎn)生的位置
myBox.Name = "TextBox " + counter01 ;
myBox.Text = "文本框 " + counter01 ;
myBox.Location = new Point ( txtAdd.Location.X , locY1 ) ;
//為產(chǎn)生的新的TextBox組件設(shè)定事件,本文中為產(chǎn)生的文本框設(shè)定了一個(gè)事件
myBox.Click += new System.EventHandler ( this.btn_Click ) ;
//在窗體中顯示此文本框
this.Controls.Add ( myBox ) ;
此時(shí)細(xì)心的讀者又會(huì)發(fā)現(xiàn),為每一個(gè)TextBox組件創(chuàng)建Click事件和為Button組件創(chuàng)建的Click事件也是一樣的,這樣在Click事件中不僅要判斷是哪個(gè)組件觸發(fā)了事件,還要判斷是那種類型的組件觸發(fā)了事件,下面語(yǔ)句是實(shí)現(xiàn)這些判斷地具體方法:
private void btn_Click ( object sender , System.EventArgs e )
{
if ( sender.GetType ( ) == typeof ( Button ) )
{
Button control = ( Button ) sender ;
MessageBox.Show ( control.Text + "被按動(dòng)了!");
}
else
{
TextBox control = ( TextBox ) sender ;
MessageBox.Show ( control.Text + "被按動(dòng)了!" ) ;
}
}
當(dāng)然如果你也可以單獨(dú)為TextBox組件創(chuàng)建Click事件。此時(shí)創(chuàng)建的事件語(yǔ)句可改為:
myBox.Click += new System.EventHandler ( this.txt _Click ) ;
下面是實(shí)現(xiàn)txt _Click ( )事件的程序代碼:
private void txt_Click ( object sender , System.EventArgs e )
{
TextBox currentButton = ( TextBox ) sender ;
MessageBox.Show ( currentButton.Text + "被按動(dòng)了!");
}