TextBox控制項的一些事件
每一個控制項都有許許多多的事件,有的是相同的,比如滑鼠,鍵盤事件,這些事件每一個控制項都有,而有的是不同的。
具體可以到MSDN去查看每個控制項所擁有的事件。
這裡我給出TextBox控制項在MSDN裡的事件一覽表網址:
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.textbox_events(v=vs.80).aspx
我們先來瞭解三個事件KeyDown,KeyPress,和KeyUp。
不同類型的事件,它的事件處理函數第二個參數也是不同的,
像KeyDown和KeyuUp事件處理函數第二個參數類型是KeyEventArgs,而KeyPress是KeyPressEventArgs。
那麼它們所對應的委託也不同,像單擊事件Click它對應的委託是EventHandler,Click是一個EventHandler類型定義的委託。
KeyDown和KeyUp對應的委託是KeyEventHandler,KeyPress是KeyPressEventHandler。
事件的發生也是有個先後順序的,上面的三個事件發的順序是(從先到後)KeyDown、KeyPress、KeyUp。
KeyDown事件是按一下鍵時產生,KeyPress也是按下一個鍵時產生,但它只限字元鍵按下,系統鍵按下,沒反應。
而KeyUp事件是當一個鍵彈起時產生,也就是按下一個鍵後,鬆開。
關於KeyDown和KeyUp事件處理函數第二個參數的解釋:
KeyEventArgs是一個類,它裡面有一個屬性成員KeyCode,這是一個Keys枚舉類型變數,KeyCode儲存有當前所按下的鍵。
Keys枚舉類型的定義參考網址:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.keys
在最下面
關於KeyPressEventArgs類的解釋:
KeyPressEventArgs類裡的KeyChar儲存有按下鍵的ASCII碼值。這個類裡面的Handled成員,指明事件是否被處理,也就是它可以決定是否由系統來預設處理KeyPress事件,可以屏蔽按鍵,取值為true表示已經處理過了(不需要系統預設處理)。
例子:讓TextBox只接收數字鍵。
這個例子很好做,只需要添加KeyPress事件處理函數,然後在裡面判斷KeyChar是否為數字,不是的話,給Handled取值為true,就可以了。
添加KeyPress事件處理函數:this.textBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
KeyPress事件處理函數代碼如下:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar >= '0' && e.KeyChar <= '9'))
e.Handled = true;
}
這樣TextBox控制項只能接收數字輸入了。
ListBox控制項
跟組合框ComboBox類一樣,ListBox類裡也有個Items屬性成員,ObjectCollection類型,其實可以把這個看做成類似於ArrayList的數組。
如ObjectCollection類裡有個RemoveAt方法,可以刪除指定索引的項(元素)
ObjectCollection儲存的是object類對象,它把傳進去的值都轉換為object類型對待了。
那同組合框一樣,Items.Add();就是添加項了,它的參數是項常值內容。
要擷取選中的項常值內容就是listBox1.SelectedItem.ToString();
也可以用GetItemText函數擷取,如listBox1.GetItemText(listBox1.SelectedItem)
listBox1.SelectedItem是一個object類型的對象,面GetItemText函數的參數類型是object,這樣當傳進一個object類型的對象後,
它就會到Items裡的“數組”中去尋找。
設定ListBox控制項的字型和背景顏色。
ListBox類有個Font屬性成員,這個指定字型樣式,它的類型是System.Drawing.Font,這個Font類有七八個
重載建構函式,平常我們設定字型,只設定它字型名稱,和大小就可以了。
這樣我們在這裡只要瞭解一個建構函式Font(String, Single);第二個參數表示字型名稱,如"宋體",第二個
是字型大小,如10.5f。
那麼設定ListBox控制項的字型的代碼就是:
this.listBox1.Font = new System.Drawing.Font("Comic Sans MS", 13f);//給Font賦值
而改變ListBox控制項背景色跟C#視窗編程一裡的改變視窗背景色是類似的。程式碼範例:
this.listBox1.BackColor= System.Drawing.Color.FromArgb(221, 221, 221);
相應的,有BackColor就有ForeColor,這個ForeColor指定字型顏色,如:
this.listBox1.ForeColor= System.Drawing.Color.FromArgb(80,80,80);
把上面三句代碼寫到程式裡去,就可以獲得這樣一個列表框:
ListView列表視圖控制項
ListView控制項有五種樣式,分別是LargeIcon、SmallIcon、List、Detial、Title。
控制項的樣式由ListView類裡的成員屬性View來指定,View是一個枚舉類型。ListView控制項預設樣式是LargeIcon。
我們先來瞭解一下LargeIcon樣式。
LargeIcon按英語翻譯過來就是大表徵圖,那可以看得出,ListView可以顯示表徵圖,其實直接添加項文本也可以。不關聯圖片的話。
比如這樣:
listView1.Items.Add("1111");
listView1.Items.Add("2222");
這樣列表視圖控制項顯示的只是文本,那要如何顯示圖片呢,要顯示圖片,得先給控制項關聯圖片。
ListView類裡的LargeImageList屬性成員儲存項對應的圖片(SmallIcon樣式對應的是SmallImageList),它是一個ImageList類對象,這個類的作用跟C++的CImageList類似。
而它們的模式也是一樣的。我是說,添加一組圖片到ImageList裡後。項要關聯圖片,是以索引來標識的,這一點跟MFC一樣。
ListViewItemCollection類(Items的類型)裡的Add函數,有這樣一個重載:public virtual ListViewItem Add(string text, int imageIndex);
後面那個參數imageIndex它的英語意思已經說明了,它指定映像索引。按ImageList添加順序,第一個添加的就是1,第二個是2。
看下例代碼:
//建立一個ImageList
System.Windows.Forms.ImageList imageListLarge = new System.Windows.Forms.ImageList();
//設定表徵圖大小為32*32
imageListLarge.ImageSize = new System.Drawing.Size(32, 32);
//設定表徵圖顏色32位
imageListLarge.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
//添加表徵圖到ImageList集裡
imageListLarge.Images.Add(new System.Drawing.Icon("d:\\Image\\KuGou.ico"));
imageListLarge.Images.Add(new System.Drawing.Icon("d:\\Image\\WebQQ.ico"));
imageListLarge.Images.Add(new System.Drawing.Icon("d:\\Image\\Recycle.ico"));
imageListLarge.Images.Add(new System.Drawing.Icon("d:\\Image\\432.ico"));
imageListLarge.Images.Add(new System.Drawing.Icon("d:\\Image\\3000soft.ico"));
//Images對應的類裡有很多個Add方法,用於載入不同類型的圖片,其中有一個參數類型就是Image類
this.listView1.LargeImageList = imageListLarge;
//添加項文本,後面數字表示其對應的圖片索引。
this.listView1.Items.Add("KuGou",0);
this.listView1.Items.Add("WebQQ",1);
this.listView1.Items.Add("Recycle",2);
this.listView1.Items.Add("432",3);
this.listView1.Items.Add("3000soft",4);
imageListLarge.Images是ImageList類裡的一個ImageCollection類對象,這個ImageCollection類與ImageList類的關係頗有點像
ListViewItemCollection類與ListView類的關係。這些關係是有點繞,不過只要會用就行了,也就是知道imageListLarge.Images.Add這個是添加圖片的,至於為什麼不是imageListLarge.Add,那就是系統的事了,它就是這樣用的。
擷取選中的項文本
ListView類裡的SelectedItems數組儲存選中的項,為什麼是數組儲存的,因為ListView控制項預設是多選的,
(按CTRL鍵可多選),也就是MultiSelect值為true。所以用數組來儲存多個項,每一個元素對應著一個選中的項。
那麼不管是多選屬性還是單選,如果只選中一個的話,
SelectedItems[0]就是選中的項了,也就是數組第一個元素儲存。
禁止多選可把MultiSelect設為false。
來看一個按鈕單擊事件處理函數的代碼:擷取項選中文本(僅單選)
String str=listView1.SelectedItems[0].Text;
MessageBox.Show(str);
後面才發現,SelectedItems並不是一個數組,它只是使用了索引器,不過上面的解釋也不會有什麼影響,知道就可以了。我指的是並不影響最終選中項文本的擷取。
那麼如何確定SelectedItems它選中項的數量呢,它又不是數組,不能用SelectedItems.Length。
SelectedItems是SelectedListViewItemCollection類對象,而SelectedListViewItemCollection類裡有個
Count屬性成員,它用於記錄選中項的數量。
結合上述,可以做一個ListView控制項基本應用,效果如:
SmallIcon樣式,跟LargeIcon樣式差不到哪去,只不過SmallIcon樣式,它的項文本是顯示在表徵圖右邊的,SmallIcon樣式對應的表徵圖集是
SmallImageList
Details樣式
Details樣式跟MFC清單控制項裡的“報告”樣式是一樣的,有列行。
先來添加列
//設定樣式為Details
this.listView1.View = System.Windows.Forms.View.Details;
//設定各例,添加列項
listView1.Columns.Add("歌曲名稱", 150);
listView1.Columns.Add("歌手", 80, System.Windows.Forms.HorizontalAlignment.Center);
listView1.Columns.Add("大小", 50, System.Windows.Forms.HorizontalAlignment.Center);
listView1.Columns.Add("類型", -2, System.Windows.Forms.HorizontalAlignment.Center);
Columns是一個對應著列各項資訊的屬性成員,它是一個ColumnHeaderCollection類對象,上面用到ColumnHeaderCollection類裡的兩個重載Add函數,分別是:
Add(String, Int32)
Add(String, Int32, HorizontalAlignment)
String表示列項文本,Int32第二個參數表示列寬度,-2表示自適應寬度,依據文本長度自動調整,
HorizontalAlignment是一個枚舉類型,它指明列項文本如何排列,置中(Center),靠左對齊(Left),
還是靠右對齊(Right)。
而第一列,項文本是無法排列的,始終是靠左對齊。
添加一個項,設定子項內容。
設定好了列各項資訊,接下我們就來添加實際內容吧。
//建立一個項,也就是一行
System.Windows.Forms.ListViewItem item1 = new System.Windows.Forms.ListViewItem("一起走過的日子");
//設定子項內容
item1.SubItems.Add("劉德華");
item1.SubItems.Add("4.5M");
item1.SubItems.Add("經典老歌");
listView1.Items.Add(item1);//把項添加到ListView控制項裡
//再建立一個
System.Windows.Forms.ListViewItem item2 = new System.Windows.Forms.ListViewItem("偏偏喜歡你");
item2.SubItems.Add("陳百強");
item2.SubItems.Add("3.5M");
item2.SubItems.Add("經典老歌");
//第三個
System.Windows.Forms.ListViewItem item3 = new System.Windows.Forms.ListViewItem("十一年");
item3.SubItems.Add("邱永傳");
item3.SubItems.Add("4.6M");
item3.SubItems.Add("傷感流行");
//AddRange可以添加多個,ListViewItem類型數組作參數
listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {item2,item3});
//允許整行選中
listView1.FullRowSelect = true;
//顯示網格線,看著條理清楚一些
listView1.GridLines = true;
獲得選中項常值內容,以及各個子項內容
擷取選中項文本的方法跟LargeIcon樣式一樣,如listView1.SelectedItems[0].Text,就是選中項的常值內容了,
也就是擷取一行的第一列常值內容,而如果要擷取子項內容,也就是一行2、3...等列內容。
就是:listView1.SelectedItems[0].SubItems[0].Text,就是選中項的第一列。
其實SelectedItems[0].SubItems[0].Text跟SelectedItem[0].Text的內容是一樣的。那麼擷取第二列,就從1開始。
這一點跟C++的二維數組有點類似,a,a[0]和&a[0][0]都是數組的首地址。
例子:(一個按鈕單擊事件裡的代碼),只限於單選一行
private void button1_Click(object sender, EventArgs e)
{
String str = "歌曲:";
str+=listView1.SelectedItems[0].Text;
//子項文本
str += "\n歌手:";
str += listView1.SelectedItems[0].SubItems[1].Text;
str += "\n大小:";
str += listView1.SelectedItems[0].SubItems[2].Text;
str += "\n類型:";
str += listView1.SelectedItems[0].SubItems[3].Text;
MessageBox.Show(str);
}
運行效果如:
記得,要選中一個項,不然訪問SelectedItems[0]會出錯