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