分享

ListView“表格编写”与“增,删,改”功能解析。

 goodwangLib 2019-04-26

DataGridView控件功能十分强大,显示表格也方便,但性能就没有那么高;
ListView控件功能没那么强大,显示表格也要多写代码,但性能相对高一些。
以下我总结出一系列对于ListView表格的详细代码解析:

1.首先我们需要先创建一个ListView表格必备的属性设定。

 this.ListView.GridLines = true; //显示表格线
 this.ListView.View = View.Details;//表格在窗体显示细节的格式,如果做成表格,这个视图必须选择Details
 this.ListView.Scrollable = true;//滚动条
 this.ListView.HeaderStyle = ColumnHeaderStyle.Clickable//表头样式
 this.ListView.FullRowSelect = true;//表示在控件上,是否可以选择一整行

基本以上属性更改后,形成一个基本完整的表格控件。在针对自己不同的需求可以在设置以下不同功能的属性。

this.ListView.LabelEdit = true;//是否可编辑,ListView只可编辑第一列。
 this.ListView.MultiSelect = true;//是否可以选择多个项。
 this.ListView.HotTracking = true;
 /*当鼠标指针经过某个项或者子项的文本时,文本的外观是否变成超链接形式。当选择此属性时则**HoverSelection**自动为true和**Activation**属性为oneClick*/
 this.ListView.HoverSelection = true;//该鼠标指针在该项停留几秒后自动选中。
 this.ListView.Activation = ItemActivation.Standard;//激活某一项时,必须执行的操作是(如:双击项或者单击项)

2.基本的表格属性设置完成后,首先要创建表头,即使每一列的列标题名称。

ListView.Columns.Add("序号");
ListView.Columns.Add("姓名");
ListView.Columns.Add("性别");
ListView.Columns.Add("电话");
ListView.Columns.Add("部门");
ListView.Columns.Add("入职时间");

3.表头创建完成后,那么就要给表格里面添加数据信息了。
给表格添加数据有两种实现代码:
⑴一种是运用数组去Fill
⑵另一种则需实例一个ListViewItem去Fill。
首先先说第一种的代码形式:
//用表示子项的字符串数组初始化 System.Windows.Forms.ListViewItem 类的新实例。
//items: -> 表示此新项的子项的字符串数组。
public ListViewItem(string[] items);

ListViewItem[] lvi = new ListViewItem[3];//声明一个ListViewItem的数组
lvi[0] = new  ListViewItem(new String[] {"值1","值2","值3","值4","值5"});
lvi[1] = new  ListViewItem(new String[] {"值1","值2","值3","值4","值5"});
//...........
this.ListView.Items.AddRange(lvi);

第二种的代码形式:

ListViewItem  lvi = new ListViewItem();//实例化一个ListViewItem项
this.ListView.BeginUpdate();//挂起
lvi.SubItems[0].Text = (ListView.Items.Count + 1).ToString;//母项第一列
lvi.SubItems.Add(TextBox1.Text.Trim());//母项第二列
lvi.SubItems.Add(TextBox2.Text.Trim());//母项第三列
//.....
this.ListView.EndUpdate();//恢复
this.ListView.Items.Add(Lvi);//添加到ListView集合中

其中第二种添加数据信息的方式需要在前后添加添加Begin… 和End…防止界面自动刷新。

在上面第二种增加的方式中可以在进行改变一下。如:
ListViewItems lvi = ListView.Items.Add((ListView.Items.Count + 1).ToString());//第一列
lvi.SubItems.Add(TextBox.Text.Trim());

4.基本一个标准的表格就完成了。下面我们来讨论一下,怎么利用ListView来对现有的这个表进行,删除,修改的三大功能呢?
Ⅰ、我们先来讨论下如何对表进行指定一行的修改。
首先必须设定一个“是否选中一行的属性”,ListView.FollRowSelec设置为True;
然后我们进行整行更新,在窗体界面上输入新的一行数据,在选中需要更改的那一行的信息。在点击修改按钮进行更新。
演示代码如下:

if(ListView.SelectedItems.Count>0)
{
       ListView.SelectedItems[0].SubItems[1].Text = TextBox1.Text;
       ListView.SelectedItems[0].SubItems[2].Text = TextBox2.Text;
       //.........
}

以上代码更新选中那一行信息。

但这样如果只修改一个子项的值,但需要全部数据进行更新岂不是很麻烦?需要全部信息重新输入一遍。
那么如何针对某一个子项进行修改而其他子项信息不被清除呢?
博主写了一套自己执行过程的代码。

if(ListView.SelectedIndices.Count>0)
{
      for(int i = 0;i<ListView.Items[0].SubItems.Count;i++)
      {//这个查询共有多少列
           if(TextBox1.Text != "")
           {
                  ListView.SelectedItems[0].SubItems[1].Text = TextBox1.Text;
                  TextBox1.Text = "";
           }else  if(TextBox1.Text != "")
           {
                  ListView.SelectedItems[0].SubItems[2].Text = TextBox2.Text;
                  TextBox2.Text = "";
           }
           //........
           //但这样也出现一个问题,就是每次只能修改一行某个值的数据信息。没办法同时修改多行的数据信息。
           //问题则出现在SelectedItems[0],每次只查询到一个母项,修改第一个选中的那一行。
           //那么在多选属性上这段代码就不起作用了。(ListView.MultiSelect 含义:是否设定选择多个项)。
           //只需要在代码进行修改即可,这里不在演示了。
     }
}

Ⅱ、接下来删除就很简单了。
①整表信息清空:

ListView.Items.Clear();

②删除选定行:

if(ListView.SelectedItems.Count > 0)
{
      this.ListView.SelectedItems[0].Remove();//移除该项
}

这里写图片描述

ListView表格的基本操作就到一段落了。
自己写了一个小程序,大家可以一起参考学习:
这里写图片描述

 public delegate void del();
        public del gate;

        #region 基础属性
        public int plan = 1; //记录性别
        public int Plan
        {
            set { plan = value; }
            get { return plan; }
        }
        public int plam = 1;//记录手机号码
        public int Plam
        {
            set { plam = value; }
            get { return plam; }
        }
        public int name = 1;//记录姓名
        public int Nane
        {
            set { name = value; }
            get { return name; }
        }
        public static int bumen = 1;//记录部门
        public static int Bumen
        {
            set { bumen = value;}
            get { return bumen; }
        }
        #endregion

        private void Form1_Load(object sender, EventArgs e)//初始化
        {
            listView1.GridLines = true;//网格线
            listView1.View = View.Details;//显示表格格式
            listView1.Scrollable = true;//滚动条
            listView1.HeaderStyle = ColumnHeaderStyle.Clickable;//表头样式
            listView1.FullRowSelect = true;//是否选择一整行
            listView1.MultiSelect = true;//是否可以选择多个项

            //添加表头
            listView1.Columns.Add("序号");
            listView1.Columns.Add("姓名");
            listView1.Columns.Add("性别");
            listView1.Columns.Add("电话");
            listView1.Columns.Add("部门");
            listView1.Columns.Add("入职时间");

            //进度条
            progressBar1.Maximum = 100;
            progressBar1.Minimum = 0;
            progressBar1.Step = progressBar1.Maximum / 4;

            //时间计时器
            timer1.Interval = 100;

            //图片控件
            gate = new del(NewTuXian);
            Thread th = new Thread(new ThreadStart(delegate{
                gate();
            }));
            th.IsBackground = true;
            th.Start();

            //设置日期时间控制器
            dateTimePicker1.MaxDate = DateTime.Now;
            /*
             * 如何设置日期时间控制器显示最大的可选日期为当天?
             * 解:
             * dateTimePicker1.MaxDate = DateTime.Now;
             * dateTimePicker1.Value = dateTimePicker1.MaxDate;
             */
        }

        private void NewTuXian()//图片显示程序
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

            string[] str = Directory.GetFiles(@"F:\visual studio C#编译器+1\新篇章\新篇章之控件补充学习\13-17 任务实施小结\图像");
            for (int i = 0; i < str.Length; i++)
            {
               this.Invoke((del)(() =>
               {
                  pictureBox1.Image = Image.FromFile(str[i]);
               }));
               Thread.Sleep(1000);
               if (i == str.Length - 1)
               {
                  i = 0;
               }
            }
        }

        private void XinZen_Click(object sender, EventArgs e)//增加信息按钮
        {
            /*
             * 补充
             * ListViewItem lv = listView1.Items.Add((listView1.Items.Count+1).ToString());
             * 为母项添加数据
             * lv.SubItems.Add(textBox1.Text.Trim());
             * ....
             * 为子项添加数据
             */
            ListViewItem lvi = new ListViewItem();
            this.listView1.BeginUpdate();
            lvi.SubItems[0].Text = (listView1.Items.Count + 1).ToString();
            lvi.SubItems.Add(textBox1.Text.Trim());
            lvi.SubItems.Add(comboBox1.Text.Trim());
            lvi.SubItems.Add(textBox4.Text.Trim());
            lvi.SubItems.Add(textBox5.Text.Trim());
            lvi.SubItems.Add(dateTimePicker1.Value.ToString("yyyy年MM月dd日"));
            this.listView1.EndUpdate();
            listView1.Items.Add(lvi);
            textBox1.Text = "";
            comboBox1.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            progressBar1.Value = 0;
            dateTimePicker1.Value = dateTimePicker1.MaxDate;
            Plam = 1;
            Plan = 1;
            Nane = 1;
            Bumen = 1;
        }
        //Random r = new Random();//随机数生成器
        //string[] str = Directory.GetFiles(@"F:\visual studio C#编译器+1\新篇章\新篇章之控件补充学习\13-17 任务实施小结\图像");
        private void timer1_Tick(object sender, EventArgs e)
        {
            //pictureBox1.Image = Image.FromFile(str[r.Next(0,str.Length)]);
            progressBar1.PerformStep();
            timer1.Stop();
        }

        #region 姓名textbox
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (Nane == 1)
            {
                JiChuXinXi xm = new JiChuXinXi();
                xm.NewXinMin(textBox1.Text.Length, timer1);
                Nane--;
            }
            else
            {
                NewXinMin(textBox1.Text.Length, timer1);
            }
        }

        public virtual void NewXinMin(int length,System.Windows.Forms.Timer T)//虚方法,主要功能减除进度条
        {
            if (textBox1.Text.Length == 0)
            {
                progressBar1.Value = progressBar1.Value - progressBar1.Maximum / 4;
                Nane++;
            }
        }

        private void textBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                textBox1.SelectAll();//选定所有的文本
            }
        } 
        #endregion

        #region 性别
        private void comboBox1_TextChanged(object sender, EventArgs e)
        {

            if (Plan == 1)
            {
                if (comboBox1.Text.Length == 1)
                {
                    timer1.Start();
                }
                Plan--;
            }
            if (comboBox1.Text.Length == 0)
            {
                Plan++;
                progressBar1.Value = progressBar1.Value - progressBar1.Maximum / 4;
            }
        } 
        #endregion

        #region 手机号码
        private void textBox4_TextChanged(object sender, EventArgs e)
        {
            if (Plam == 1)
            {
                if (textBox4.Text.Length > 10)
                {
                    timer1.Start();
                    Plam--;
                }
            }
            if (textBox4.Text.Length > 11)
            {
                MessageBox.Show("手机号码不超过11位");
            }
            if (textBox4.Text.Length == 0)
            {
                progressBar1.Value = progressBar1.Value - progressBar1.Maximum / 4;
                Plam--;
            }
        }

        private void textBox4_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                textBox4.SelectAll();
            }
        } 
        #endregion

        #region 部门
        private void textBox5_TextChanged(object sender, EventArgs e)
        {
            if (Bumen == 1)
            {
                NewBuMen(textBox5.Text.Length,progressBar1);
                Bumen--;
            }
            else
            {
                JiChuXinXi xm = new JiChuXinXi();
                xm.NewBuMen(textBox5.Text.Length, progressBar1);
            }

        }

        public virtual void NewBuMen(int val,ProgressBar pb)
        {
            if (val > 0)
            {
                timer1.Start();
            }
        }

        private void textBox5_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                textBox5.SelectAll();
            }
        } 
        #endregion

        private void ChaXu_Click(object sender, EventArgs e)//查找按键
        {
            if (listView1.Items.Count > 0 && textBox2.Text.Trim() != string.Empty)
            {
                for (int i = 0; i < listView1.Items.Count; i++)
                {//Items 为母项,SubItems 为母项中的所有子项
                    //if (listView1.Items[i].SubItems[1].Text.IndexOf(textBox2.Text.Trim()) >= 0)
                    //{
                    //    listView1.Items[i].Selected = true;
                    //    listView1.Items[i].EnsureVisible();
                    //    listView1.Items[i].BackColor = Color.Red;
                    //}
                    listView1.Items[i].BackColor = SystemColors.Window;//设置系统颜色
                    if (listView1.Items[i].SubItems[1].Text == textBox2.Text.Trim())
                    {
                        listView1.Items[i].BackColor = Color.Red;
                    }
                }
            }
            //ListViewItem lvi = listView1.FindItemWithText(textBox2.Text.Trim());
            //FindItemWithText代表是指定文本值开头的第一个ListViewItem的值
            //if (lvi != null)
            //{
            //    this.listView1.TopItem = lvi;
            //    lvi.ForeColor = Color.Red;
            //}
            //else
            //{
            //    MessageBox.Show("未查找到"+textBox2.Text);
            //}
        }

        private void QinKon_Click(object sender, EventArgs e)//清空所有记录
        {
            listView1.Items.Clear();
        }

        private void SanChu_Click(object sender, EventArgs e)//删除选定行
        {
            if (listView1.SelectedItems.Count > 0)
            {
                listView1.SelectedItems[0].Remove();
            }
        }

        private void XiuGai_Click(object sender, EventArgs e)//修改选定行
        {
            //if (listView1.SelectedItems.Count > 0)//整行更新
            //{
            //    listView1.SelectedItems[0].SubItems[1].Text = textBox1.Text;
            //    listView1.SelectedItems[0].SubItems[2].Text = comboBox1.Text;
            //    listView1.SelectedItems[0].SubItems[3].Text = textBox4.Text;
            //    listView1.SelectedItems[0].SubItems[4].Text = textBox5.Text;
            //    listView1.SelectedItems[0].SubItems[5].Text = dateTimePicker1.Value.ToString("yyyy年MM月dd日");
            //}

            if (listView1.SelectedIndices.Count > 0)//修改行中某个值
            {
                for (int i = 0; i < listView1.Items[0].SubItems.Count; i++)
                {
                    if (textBox1.Text != "")
                    {
                        listView1.SelectedItems[0].SubItems[1].Text = textBox1.Text;
                        textBox1.Text = "";
                    }
                    else if (textBox4.Text != "")
                    {
                        listView1.SelectedItems[0].SubItems[3].Text = textBox4.Text;
                        textBox4.Text = "";
                    }
                    else if (comboBox1.Text != "")
                    {
                        listView1.SelectedItems[0].SubItems[2].Text = comboBox1.Text;
                        comboBox1.Text = "";
                    }
                    else if (textBox5.Text != "")
                    {
                        listView1.SelectedItems[0].SubItems[4].Text = textBox5.Text;
                        textBox5.Text = "";
                    }
                    else if (dateTimePicker1.Value.ToString("yyyy年MM月dd日")!=DateTime.Now.ToString("yyyy年MM月dd日"))
                    {
                        listView1.SelectedItems[0].SubItems[5].Text = dateTimePicker1.Value.ToString("yyyy年MM月dd日");
                        dateTimePicker1.Value = dateTimePicker1.MaxDate;
                    }
                    progressBar1.Value = 0;
                }
            }
        }
   class JiChuXinXi:Form1//重写姓名方法
    {
        public override void NewXinMin(int length,Timer T)
        {//重写虚方法,主要功能是输入字符大于0时。//则执行一次进度条(增加)。//姓名属性
            {
                T.Start();
            }
        }

        public override void NewBuMen(int val,ProgressBar pb)
        {//部门属性,主要功能是文本框内零个字符串。//则执行一次进度条减除。
            if (val == 0)
            {
                pb.Value = pb.Value - pb.Maximum / 4;
                Form1.Bumen++;
            }
        }

    } 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约