c#学习笔记-----Listview、dataGridView控件
1 概述
fhbds!
2 ListView
先看⼀下我实现的效果吧!
2.1 listView视图
listView视图⼀共有5种视图,包括Details、LargeIcon、List、SmallIcon、Tile(默认为 LargeIcon),因为默认是LargeIcon视图,所以⼀般刚开始的新⼿很难做到上⾯这种列表的显⽰⽅式。此处也只介绍Details(上⾯实现的⽅式),其它视图不太适合显⽰数据,倒是适合显⽰图⽚,此时并不感兴趣!接下来讲⼀下我实现的路线,如果⾃⼰没有路线的可以跟着⼀起做,只附上主要代码,需要全部的请留下QQ邮箱!
为了避免listView在更新数据的时候有闪烁现象,不使⽤System.Windows.Forms.ListView ⽽是⾃定义⼀个⼦类去继承它。
1class ListViewNF : System.Windows.Forms.ListView
2 {
3public ListViewNF()//避免闪烁
4 {
5
6this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
7
8
9this.SetStyle(ControlStyles.EnableNotifyMessage, true);
10 }
11
12protected override void OnNotifyMessage(Message m)
13 {
14
15if (m.Msg != 0x14)
16 {
17base.OnNotifyMessage(m);
18 }
19 }
20 }
接下来创建⼀个listView1,此时需要到Form1.designer.cs做以下修改:this.listView1 = new show.ListViewNF();
private ListViewNF listView1;
原本这两句是this.listView1=new System.Windows.Forms.ListView1();建好之后,可以按照上⾯把页⾯的⼀些button和textBox建好,接下来就⼀⼀实现即可。
⾸先需要实现窗体加载事件,⼀开始就把listView的⼀些属性确⽴下来,各属性已在注释中说明。
1private void Form1_Load(object sender, EventArgs e)
2 {
3 listView1.View = View.Details;//设置视图获取或设置项在控件中的显⽰⽅式
4 listView1.FullRowSelect = true;//设置是否⾏选择模式
5 listView1.GridLines = true;//设置⽹格线
6 listView1.AllowColumnReorder = true;//设置是否可拖动列标头来对改变列的顺序。
7 listView1.MultiSelect = true;//设置是否可以选择多个项
8 listView1.LabelEdit = true;//设置⽤户是否可以编辑控件中项的标签,对于Detail视图,只能编辑⾏第⼀列的内容
9 listView1.CheckBoxes = true;//设置控件中各项的旁边是否显⽰复选框
10
11
12 listView1.SmallImageList = imageList1;//设置图标
13
14//添加列
15 listView1.Columns.Add("序号", 100, HorizontalAlignment.Left);
16 listView1.Columns.Add("商品名称", 150, HorizontalAlignment.Left);
17 listView1.Columns.Add("商品数量", 150, HorizontalAlignment.Left);
18 listView1.Columns.Add("商品单价", 80, HorizontalAlignment.Left);
19 listView1.Columns.Add("商品产地", 80, HorizontalAlignment.Left);
20
29
30 listView1.BeginUpdate();
33 listView1.EndUpdate();
34 }
Details视图可以在第⼀列显⽰图标,想要加⼊图标的可以创建⼀个imageList控件,加⼊图⽚⽅式如下:
listView通过index和图⽚绑定,需要预先设置⼏个全局变量,后⾯要⽤到连接数据库,所以⼀并全部加上。
1public int count = 0;
2public int pictureCount = 0;
3
4public static string dataSource = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=2013-20130829TH)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=oracle)));"; 5public static string persistSecurityInfo = "Persist Security Info=True;";
6public static string userID = "User ID=SYSTEM;";
7public static string password = "Password=admin;";
8public static string connectionString = dataSource + persistSecurityInfo + userID + password;
实现添加记录:
1private void button1_Click(object sender, EventArgs e)
2 {
3// ListViewItem Item = new ListViewItem();
4//Item.SubItems.Clear();
5
6//添加⾏
7var item = new ListViewItem();
8 item.SubItems.Clear();
9if (pictureCount>=imageList1.Images.Count-1) {
10 pictureCount = 0;
11 }
12 pictureCount++;
13 item.ImageIndex = pictureCount;
14 count++;
15 item.Text = count.ToString(); //序号
16
17if (count % 3 == 0)
18 {
19 item.SubItems.Add("西⽠"); //商品名称
20 item.SubItems.Add("23"); //商品数量
21 item.SubItems.Add("1129"); //商品单价
22 item.SubItems.Add("巴西"); //商品产地
23 }
24else if (count % 3 == 1)
25 {
26 item.SubItems.Add("苹果"); //商品名称
27 item.SubItems.Add("56"); //商品数量
28 item.SubItems.Add("9"); //商品单价
29 item.SubItems.Add("美国");
30 }
31else {
32 item.SubItems.Add("⽟⽶"); //商品名称
33 item.SubItems.Add("6"); //商品数量
34 item.SubItems.Add("9999"); //商品单价
35 item.SubItems.Add("中国");
36 }
37
38
39
40 listView1.BeginUpdate();
41 listView1.Items.Add(item);
42 listView1.Items[listView1.Items.Count - 1].EnsureVisible();//滚动到最后
43 listView1.EndUpdate();
44 item.EnsureVisible(); //关键的实现函数
45 }
清空:
1private void button2_Click(object sender, EventArgs e)
2 {
3// this.listView1.Clear(); //从控件中移除所有项和列(包括列表头)。
4 count = 0;
5this.listView1.Items.Clear(); //只移除所有的项。
6 }
定位到第n⾏:
1private void button3_Click(object sender, EventArgs e)
2 {
3int i = 1;
4if(textBox1.Text.Trim()==string.Empty ){
5 i = 1;
6 }
7try{
8 i= Convert.ToInt32(textBox1.Text.Trim());
9 }catch(Exception ex){
10 i = 1;
11 MessageBox.Show(ex.Message);
12 }
13
14if(i<=0 || i>=count){
15 i = count;
16 }
17
18 listView1.EnsureVisible(i - 1);
19 }
查:
1private void button4_Click(object sender, EventArgs e)
2 {
3 ListViewItem foundItem = this.listView1.Box2.Text.Trim(), true, 0); //参数1:要查的⽂本;参数2:是否⼦项也要查;参数3:开始查位置 4
5if (foundItem != null)
6 {
7
8this.listView1.TopItem = foundItem; //定位到该项
9
10//foundItem.ForeColor = Color.Red;
11 foundItem.BackColor = Color.Lime;//背景⾊
12 }
13 }
选中移除:
1private void button7_Click(object sender, EventArgs e)
2 {
3
4foreach (ListViewItem lvi in listView1.SelectedItems) //选中项遍历
5 {
6//listView1.Items.RemoveAt(lvi.Index); // 按索引移除
7 listView1.Items.Remove(lvi); //按项移除
8 }
9 }
获取勾选中的:
1private void button6_Click(object sender, EventArgs e)
2 {
3int k = 0;
4int m = listView1.CheckedItems.Count;
5string[] a = new string[m];
6 Queue<string> Q = new Queue<string>();
7
8for (int i = 0; i < m; i++)
9 {
listview控件在哪里10if (listView1.CheckedItems[i].Checked)
11 {
12 Q.Enqueue(listView1.CheckedItems[i].SubItems[1].Text);//获取勾选的第⼆个栏位
13 }
14 }
15while (Q.Count > 0)
16 {
17 a[k] = Q.Dequeue();
18 k++;
19 }
20
21foreach (var i in a)
22 {
23 textBox3.Text += i.ToString();
24 }
25 }
获取点击选中的:
1private void button8_Click(object sender, EventArgs e)
2 {
3 ListView.SelectedListViewItemCollection svc =this.listView1.SelectedItems;
4
5
6foreach (ListViewItem item in svc)
7 {
8 textBox3.Text = item.SubItems[1].Text;//获取选中的第⼆个栏位
9
10 }
11 }
实现点击表头可以排序,⾸先需要⾃⼰构造⼀个排序器,其次要实现⼀个点击表头事件:
1class ListViewSort : IComparer
2 {
3private readonly int _col;
4private readonly bool _descK;
5
6public ListViewSort()
7 {
8 _col = 0;
9 }
10
11public ListViewSort(int column, object desc)
12 {
13 _descK = (bool)desc;
14 _col = column; //当前列,0,,参数由ListView控件的ColumnClick事件传递
15 }
16
17public int Compare(object x, object y)
18 {
19int tempInt = String.CompareOrdinal(((ListViewItem)x).SubItems[_col].Text,((ListViewItem)y).SubItems[_col].Text); 20if (_descK)
21 {
22return -tempInt;
23 }
24return tempInt;
25 }
26
27 }
1private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
2 {
3if (listView1.Columns[e.Column].Tag == null)
4 {
5 listView1.Columns[e.Column].Tag = true;
6 }
7var tabK = (bool)listView1.Columns[e.Column].Tag;
8 listView1.Columns[e.Column].Tag = !tabK;
9 listView1.ListViewItemSorter = new ListViewSort(e.Column, listView1.Columns[e.Column].Tag);
10//指定排序器并传送列索引与升序降序关键字
11 listView1.Sort();//对列表进⾏⾃定义排序
12 }
从数据库获取数据需要有⼀些执⾏sql的⽅法,可以参考我另外⼀篇笔记,此处的⽅法直接拿来⽤:
1public static OracleDataReader ExecuteReader(string connectionString, string strsql)
2 {
3 OracleConnection conn = new OracleConnection(connectionString);
4 conn.Open();
5 OracleCommand cmd = new OracleCommand(strsql, conn);
6try
7 {
8//CommandBehavior是⼀个枚举类型
9 OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
10
11return rdr;
12 }
13catch
14 {
15 conn.Close();
16throw;
17 }
18 }
19
20
21private void button5_Click(object sender, EventArgs e)
22 {
23if (pictureCount >= imageList1.Images.Count - 1)
24 {
25 pictureCount = 0;
26 }
27
28try
29 {
30string sql1 = @"select * from goods";
31 OracleDataReader odr = ExecuteReader(connectionString, sql1);
32while(odr.Read()){
33var lvi = new ListViewItem(odr[0].ToString());
34
35if (pictureCount >= imageList1.Images.Count - 1)
36 {
37 pictureCount = 0;
38 }
39 lvi.ImageIndex = pictureCount;
40 pictureCount++;
41
42 lvi.SubItems.Add(odr[1].ToString());
43 lvi.SubItems.Add(odr[2].ToString());
44 lvi.SubItems.Add(odr[3].ToString());
45 lvi.SubItems.Add(odr[4].ToString());
46
47 listView1.BeginUpdate();
48this.listView1.Items.Add(lvi);
49 listView1.Items[listView1.Items.Count - 1].EnsureVisible();//滚动到最后
50 listView1.EndUpdate();
51 lvi.EnsureVisible(); //关键的实现函数
52 }
53 odr.Close();
54 }
55catch (Exception ex)
56 {
57 MessageBox.Show(ex.Message);
58 }
59 }
效果如下:
3 dataGridView
dataGridView主要介绍绑定2种数据源,⼀种是list,另⼀种是数据库。
先看下效果吧!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论