TextBox控件的一些事件
每一个控件都有许许多多的事件,有的是相同的,比如鼠标,键盘事件,这些事件每一个控件都有,而有的是不同的。
具体可以到MSDN去查看每个控件所拥有的事件。
这里我给出TextBox控件在MSDN里的事件一览表网址:
TextBox 类 (System.Windows.Forms) | Microsoft Learn
我们先来了解三个事件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枚举类型的定义参考网址:Keys 枚举 (System.Windows.Forms) | Microsoft Learn 在最下面
关于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]会出错