制作时间:2009-9-10 9:30-13:38
地点:北大青鸟公共机房
要求:
1.用ListView显示数据
2.实现模糊查询功能
3.修改ListView中某项的值(比如:从活动改为非活动)
4.可以修改多行,可以删除多行
5.ListView列宽自动调整
实现:
1.ListView显示数据
1.写一个比较公用的方法,如果参数为空则查询所有,否则根据条件查询
public void FillLvStudentByCondition(string condition)
string sql = string.Format("select * from student {0}",condition);
2.在此方法内,循环读取数据并填充到listview
while (dr.Read())
{
//循环填充到lvStudent
ListViewItem lviStudent = new ListViewItem(dr["Name"].ToString());
lviStudent.Tag = dr["Id"].ToString();//把Id保存在Tag,方便以后修改或删除
string state = Convert.ToInt32(dr["State"]) == 0 ? "活动" : "非活动";
lviStudent.SubItems.AddRange(new string[] { dr["stuNo"].ToString(), state });
lvStudent.Items.Add(lviStudent);
}
2.实现模糊查询功能:直接传参数调用上面的方法,比如:
string sql = string.Format("where name like '%{0}%'",txtName.Text);
FillLvStudentByCondition(sql);
3.修改ListView中某项的值(可修改多行)
1.先拼接sql语句,再调用通用的更新方法。
foreach (ListViewItem lviStudent in lvStudent.SelectedItems)
{
sql += string.Format("{0} update student set State={1} where Id={2}", "",
Convert.ToInt32(((ToolStripMenuItem)sender).Tag), Convert.ToInt32(lviStudent.Tag));
}
UpdateOrDelete(sql);
2.解释:
1.lvStudent.SelectedItems 表示lvStudent中被选中的项
2.((ToolStripMenuItem)sender).Tag 当点快捷菜单(ContextMenuStrip)时得到它的Tag
Tag在load事件给赋值,如:tsmiAction.Tag = 0; tsmiInAction.Tag = 1;
3.lviStudent.Tag 表示选中的行在数据库中对应的Id(在填充ListView时,给赋的值)
4.删除多行同理(和修改差不多,就是sql语句不同)
5.ListView列宽自动调整
private void lvStudent_SizeChanged(object sender, EventArgs e)
{
lvStudent.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
额外知识:
1.用了枚举,保证输入数据的正确性
public enum State
{
Action=0,InAction=1
}
tsmiAction.Tag = Convert.ToInt32(State.Action);//tag里保存的值为0
tsmiInAction.Tag = Convert.ToInt32(State.InAction);
2.ListView有项被选中时,才能弹出快捷菜单
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
if (lvStudent.SelectedItems.Count == 0)
e.Cancel = true;//取消此事件,呵呵
}
待改进:
1.状态保持
比如:listView显示的是第100行记录,修改后,用户看到的还是停留在100行,而不是第一行