开发一个含有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控件的子项集合。
 
posted @ 2011-10-07 14:02  peterlee  阅读(305)  评论(0)    收藏  举报