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小时内删除。