1. 程式人生 > >ListView“表格編寫”與“增,刪,改”功能解析。

ListView“表格編寫”與“增,刪,改”功能解析。

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++;
            }
        }

    }