开发一个含有ListView控件的程序
开发一个含有ListView控件的程序
2009-07-30 12:05:04| 分类: 面试相关 | 标签: |字号大中小 订阅
开发一个含有ListView控件的程序,要求达到以下的特殊功能:ListView控件可以显示用户要求的数据库记录,当点击ListView的“ID”列的列头(数据记录的主键)时,能按照点击列的每行值进行重排视图中的所有行(排序的方式与DataGridView【考点】
ListView控件的排序改造方法。
【出现频率】
★★☆☆☆
【解答】
在VS 2005/VS 2008中创建名为ListView的窗体应用程序项目,其控件布局及命名如图9.10所示。图9.10 ListView项目窗体控件布局及命名
在项目的窗体中,名称为“MyList”的控件为题目所要求的ListView控件,编写ListView项目的Form1.cs代码如代码9.6所示。代码9.6 ListView排序程序:Form1.cs
using System;
………………………………
using System.Data;
using System.Data.SqlClient;
namespace MyListView
{
//使用自定义别名指定System.Windows.Forms.SortOrder枚举类型
using SO = System.Windows.Forms.SortOrder;
partial class Form1 : System.Windows.Forms.Form
{
//将数据库连接字符串赋值给ConnStr变量
string ConnStr = @"Data Source = (local)\SQLEXPRESS;Integrated Security = True;Database=MyDb;";
//声明SqlTxt变量,用于存储SQL查询字符串
string SqlTxt;
//声明SqlConnection类型的cn变量
SqlConnection cn;
//声明SqlDataAdapter类型的da变量
SqlDataAdapter da;
//创建DataSet对象,其引用为ds,名称为MyDs
DataSet ds = new DataSet("MyDs");
//声明DataTable类型的dt变量,用于引用特定数据表对象
DataTable dt;
//声明ListViewItem类型的lvt变量,用于持有ListView的子项引用
ListViewItem lvt;
//声明i变量和t变量
int i;
string t;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//设置MyList的子项显示方式为View枚举的Details成员
MyList.View = View.Details;
//设置MyList控件可拖动列标题,以重新给列排序
MyList.AllowColumnReorder = true;
//设置MyList控件可选择整行
MyList.FullRowSelect = true;
//设置MyList控件可显示网格线
MyList.GridLines = true;
//设置MyList控件按SortOrder枚举的Ascending成员排序(递增)
MyList.Sorting = SO.Ascending;
}
private void SQLExe_Click(object sender, EventArgs e)
{
//根据ConnStr变量创建SqlConnection连接对象,其引用赋值给cn
cn = new SqlConnection(ConnStr);
try
{
//将SQLLabel的Text属性赋值给SqlTxt变量
SqlTxt = this.SQLLabel.Text;
//判断cn的连接是否为关闭状态
if (cn.State == ConnectionState.Closed)
{
//调用cn的Open方法,打开指定连接
cn.Open();
}
//创建新的SqlDataAdapter对象,并传递SqlStr和cn
//将SqlDataAdapter对象引用赋值给da
da = new SqlDataAdapter(SqlTxt, cn);
//如果dt已有数据表对象引用
if (dt != null)
{
//dt数据清空
dt.Clear();
}
//调用da的Fill方法,传递ds和自定义数据表名称
da.Fill(ds, "datatable");
//将ds的Tables集合中名为“datatable”表对象引用赋值给dt
dt = ds.Tables["datatable"];
//对MyList的列进行初始化,添加4列
//并用构造函数的参数指定每列的文本、宽度和对齐方式
MyList.Columns.Add("记录顺序", 80, HorizontalAlignment.Left);
MyList.Columns.Add("ID", 30, HorizontalAlignment.Left);
MyList.Columns.Add("姓名", 90, HorizontalAlignment.Left);
MyList.Columns.Add("密码", 90, HorizontalAlignment.Left);
//将MyList当前的子项集合清空
this.MyList.Items.Clear();
//进入for循环,以i变量为计数器,循环计数从0到dt所包含记录条数减去1
for (i = 0; i < dt.Rows.Count; i++)
{
t = String.Format("第{0}条记录", i + 1);
//创建ListViewItem对象,其文本为t
//并将对象引用赋值给lvt
lvt = new ListViewItem(t);
//将数据表中的每条记录的前3个字段添加到lvt的子项集合
lvt.SubItems.Add(dt.Rows[0].ToString());
lvt.SubItems.Add(dt.Rows[1].ToString());
lvt.SubItems.Add(dt.Rows[2].ToString());
//将lvt添加到MyList的子项集合
MyList.Items.Add(lvt);
}
}
//捕捉各种异常
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
//关闭数据库连接
cn.Close();
}
}
//当MyList控件的列头被单击时的事件处理方法
private void MyList_ColumnClick(object sender, ColumnClickEventArgs e)
{
//如果被单击的列是第2列(从0开始计数),即文本为“ID”列
if (e.Column == 1)
{
//创建SorterClass的对象sc,传递1(代表第2列)和MyList控件当前的排序顺序(递增)
SorterClass sc = new SorterClass(MyList.Sorting);
//设置MyList的排序比较器为sc
MyList.ListViewItemSorter = sc;
//如果MyList控件当前的排序为递增
if (MyList.Sorting == SO.Ascending)
{
//设置MyList控件当前的排序为递减
MyList.Sorting = SO.Descending;
}
else
{
//设置MyList控件当前的排序为递增
MyList.Sorting = SO.Ascending;
}
}
}
//定义实现IComparer接口的SorterClass类
public class SorterClass : IComparer
{
//声明SO类型的_sortOrder字段,值为
private SO _sortOrder = SO.Ascending;
//重载构造函数,接收一个SO类型参数
public SorterClass(SO sortOrder)
{
//将参数值赋值给_sortOrder字段
_sortOrder = sortOrder;
}
//实现Compare方法
public int Compare(object x, object y)
{
//将两个参数转换为ListViewItem类型
ListViewItem item1 = (ListViewItem)x;
ListViewItem item2 = (ListViewItem)y;
//当_sortOrder字段为SO枚举的Descending成员,即排序为递减
if (_sortOrder == SO.Descending)
{
//判断两个子项第2列的值(转换为int类型后比较),并返回相应的int结果
if (int.Parse(item1.SubItems[1].Text) < int.Parse(item2.SubItems[1].Text))
{
return -1;
}
else if (int.Parse(item1.SubItems[1].Text) > int.Parse(item2.SubItems[1].Text))
{
return 1;
}
else
{
return 0;
}
}
else
{
if (int.Parse(item1.SubItems[1].Text) > int.Parse(item2.SubItems[1].Text))
{
return -1;
}
else if (int.Parse(item1.SubItems[1].Text) < int.Parse(item2.SubItems[1].Text))
{
return 1;
}
else
{
return 0;
}
}
}
}
}
}
在程序开始运行时,用户可在“TextBox”控件中输入相应的SQL命令,这里的ListView控件的列头根据“MyDb”数据库的“userinfo”数据表结构而初始化。输入SQL命令查询“userinfo”数据表,运行效果如图9.11所示。
当用户单击“ID”列头时,数据记录将反向排序,运行效果如图9.12所示。
图9.11 输入SQL命令 图9.12 对结果中的记录排序
【分析】
本题不仅考查数据控件绑定数据源的基本知识,还考查了using的指定别名方法以及实现排序的方法。通过ADO.NET的数据适配器(DataAdapter)读取数据库中的数据记录,将数据结果集存储在DataSet的DataTable中。然后将DataTable中的数据记录的字段值对应ListView控件的列名,逐条添加至ListView控件的子项集合。
ListView控件的排序改造方法。
【出现频率】
★★☆☆☆
【解答】
在VS 2005/VS 2008中创建名为ListView的窗体应用程序项目,其控件布局及命名如图9.10所示。图9.10 ListView项目窗体控件布局及命名
在项目的窗体中,名称为“MyList”的控件为题目所要求的ListView控件,编写ListView项目的Form1.cs代码如代码9.6所示。代码9.6 ListView排序程序:Form1.cs
using System;
………………………………
using System.Data;
using System.Data.SqlClient;
namespace MyListView
{
//使用自定义别名指定System.Windows.Forms.SortOrder枚举类型
using SO = System.Windows.Forms.SortOrder;
partial class Form1 : System.Windows.Forms.Form
{
//将数据库连接字符串赋值给ConnStr变量
string ConnStr = @"Data Source = (local)\SQLEXPRESS;Integrated Security = True;Database=MyDb;";
//声明SqlTxt变量,用于存储SQL查询字符串
string SqlTxt;
//声明SqlConnection类型的cn变量
SqlConnection cn;
//声明SqlDataAdapter类型的da变量
SqlDataAdapter da;
//创建DataSet对象,其引用为ds,名称为MyDs
DataSet ds = new DataSet("MyDs");
//声明DataTable类型的dt变量,用于引用特定数据表对象
DataTable dt;
//声明ListViewItem类型的lvt变量,用于持有ListView的子项引用
ListViewItem lvt;
//声明i变量和t变量
int i;
string t;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//设置MyList的子项显示方式为View枚举的Details成员
MyList.View = View.Details;
//设置MyList控件可拖动列标题,以重新给列排序
MyList.AllowColumnReorder = true;
//设置MyList控件可选择整行
MyList.FullRowSelect = true;
//设置MyList控件可显示网格线
MyList.GridLines = true;
//设置MyList控件按SortOrder枚举的Ascending成员排序(递增)
MyList.Sorting = SO.Ascending;
}
private void SQLExe_Click(object sender, EventArgs e)
{
//根据ConnStr变量创建SqlConnection连接对象,其引用赋值给cn
cn = new SqlConnection(ConnStr);
try
{
//将SQLLabel的Text属性赋值给SqlTxt变量
SqlTxt = this.SQLLabel.Text;
//判断cn的连接是否为关闭状态
if (cn.State == ConnectionState.Closed)
{
//调用cn的Open方法,打开指定连接
cn.Open();
}
//创建新的SqlDataAdapter对象,并传递SqlStr和cn
//将SqlDataAdapter对象引用赋值给da
da = new SqlDataAdapter(SqlTxt, cn);
//如果dt已有数据表对象引用
if (dt != null)
{
//dt数据清空
dt.Clear();
}
//调用da的Fill方法,传递ds和自定义数据表名称
da.Fill(ds, "datatable");
//将ds的Tables集合中名为“datatable”表对象引用赋值给dt
dt = ds.Tables["datatable"];
//对MyList的列进行初始化,添加4列
//并用构造函数的参数指定每列的文本、宽度和对齐方式
MyList.Columns.Add("记录顺序", 80, HorizontalAlignment.Left);
MyList.Columns.Add("ID", 30, HorizontalAlignment.Left);
MyList.Columns.Add("姓名", 90, HorizontalAlignment.Left);
MyList.Columns.Add("密码", 90, HorizontalAlignment.Left);
//将MyList当前的子项集合清空
this.MyList.Items.Clear();
//进入for循环,以i变量为计数器,循环计数从0到dt所包含记录条数减去1
for (i = 0; i < dt.Rows.Count; i++)
{
t = String.Format("第{0}条记录", i + 1);
//创建ListViewItem对象,其文本为t
//并将对象引用赋值给lvt
lvt = new ListViewItem(t);
//将数据表中的每条记录的前3个字段添加到lvt的子项集合
lvt.SubItems.Add(dt.Rows
lvt.SubItems.Add(dt.Rows
lvt.SubItems.Add(dt.Rows
//将lvt添加到MyList的子项集合
MyList.Items.Add(lvt);
}
}
//捕捉各种异常
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
//关闭数据库连接
cn.Close();
}
}
//当MyList控件的列头被单击时的事件处理方法
private void MyList_ColumnClick(object sender, ColumnClickEventArgs e)
{
//如果被单击的列是第2列(从0开始计数),即文本为“ID”列
if (e.Column == 1)
{
//创建SorterClass的对象sc,传递1(代表第2列)和MyList控件当前的排序顺序(递增)
SorterClass sc = new SorterClass(MyList.Sorting);
//设置MyList的排序比较器为sc
MyList.ListViewItemSorter = sc;
//如果MyList控件当前的排序为递增
if (MyList.Sorting == SO.Ascending)
{
//设置MyList控件当前的排序为递减
MyList.Sorting = SO.Descending;
}
else
{
//设置MyList控件当前的排序为递增
MyList.Sorting = SO.Ascending;
}
}
}
//定义实现IComparer接口的SorterClass类
public class SorterClass : IComparer
{
//声明SO类型的_sortOrder字段,值为
private SO _sortOrder = SO.Ascending;
//重载构造函数,接收一个SO类型参数
public SorterClass(SO sortOrder)
{
//将参数值赋值给_sortOrder字段
_sortOrder = sortOrder;
}
//实现Compare方法
public int Compare(object x, object y)
{
//将两个参数转换为ListViewItem类型
ListViewItem item1 = (ListViewItem)x;
ListViewItem item2 = (ListViewItem)y;
//当_sortOrder字段为SO枚举的Descending成员,即排序为递减
if (_sortOrder == SO.Descending)
{
//判断两个子项第2列的值(转换为int类型后比较),并返回相应的int结果
if (int.Parse(item1.SubItems[1].Text) < int.Parse(item2.SubItems[1].Text))
{
return -1;
}
else if (int.Parse(item1.SubItems[1].Text) > int.Parse(item2.SubItems[1].Text))
{
return 1;
}
else
{
return 0;
}
}
else
{
if (int.Parse(item1.SubItems[1].Text) > int.Parse(item2.SubItems[1].Text))
{
return -1;
}
else if (int.Parse(item1.SubItems[1].Text) < int.Parse(item2.SubItems[1].Text))
{
return 1;
}
else
{
return 0;
}
}
}
}
}
}
在程序开始运行时,用户可在“TextBox”控件中输入相应的SQL命令,这里的ListView控件的列头根据“MyDb”数据库的“userinfo”数据表结构而初始化。输入SQL命令查询“userinfo”数据表,运行效果如图9.11所示。
当用户单击“ID”列头时,数据记录将反向排序,运行效果如图9.12所示。
图9.11 输入SQL命令 图9.12 对结果中的记录排序
【分析】
本题不仅考查数据控件绑定数据源的基本知识,还考查了using的指定别名方法以及实现排序的方法。通过ADO.NET的数据适配器(DataAdapter)读取数据库中的数据记录,将数据结果集存储在DataSet的DataTable中。然后将DataTable中的数据记录的字段值对应ListView控件的列名,逐条添加至ListView控件的子项集合。
浙公网安备 33010602011771号