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