主要内容:
制作时间 2009/9/22 23:40- 00:30
目标:用比较器给集合排序(其中,集合中保存的是对象,排序方式按对象的某个属性(如:Student对象的Name))
实现:
1.简单实现(例子:SimpleDemo)
1.新建一个类Student,里面加几个内部类(表示这个对象是可比较的)
为什么做成内部类?答:应该可以实现更好的封装吧,而且也比较好找,效率高
public class SortByName:IComparer<Student>
{
public int Compare(Student x, Student y)
{
return x.Name.CompareTo(y.Name);
}
}
2.新建一个窗体SimpleDemo,拖一个DataGridView(dgvStudent)
1.新建集合并添加值
List<Student> students = new List<Student>();
students.Add(new Student("肖新苗",100));
students.Add(new Student("张韶涵", 99));
2. 给集合排序,并和DataGridView绑定,这样就OK了
private void btnNameAsc_Click(object sender, EventArgs e)
{
students.Sort(new Student.SortByName());
BindDgvStudent();
}
3.总结:比较器的实现
1.需要有个对象类(Student),里面有内部类(SortByName:IComparer<Student>)
2.有个此对象的集合,调用集合的Sort(new Student.SortByName());
2.用DataGridView实现(点击列标题就可以排序)
1.Student对象和他的内部类同上
2.新建窗体DataGridViewSort
1.新建并初始化集合 同上
2.找到用户单击列标题时的事件(ColumnHeaderMouseClick)
并写代码,反射内部内要把"."变成"+"(如:ComparerDemo.Student+SortByName)
3.代码
//用户单击列标题时的事件
bool flag = true;//用来切换升序和降序(如点列标题(姓名),第一次若为升序,第二次点就要换为降序)
private void dgvStudent_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
//通过事件源找到控件的Name(也就是列标题,和绑定集合里对象的字段对应,如:Name,Popularity)
string comparerName=string.Format("ComparerDemo.Student+SortBy{0}",
((DataGridView)sender).Columns[e.ColumnIndex].Name);
if (flag)//如果为真调用升序比较器
{
flag = false;
}
else//否则,调用降序比较器
{
comparerName += "Desc";
flag = true;
}
//下面是通过字符串反射对象(即:反射得到比较器)
Type type = Type.GetType(comparerName);
if (type != null)
students.Sort((IComparer<Student>)System.Activator.CreateInstance(type));
BindDgvStudent();//排序后,重新绑定DataGridView
}
3.用ListView实现
1.Student对象和他的内部类同上
2.新建窗体ListViewSort
1.新建并初始化集合 同上
2.找到用户单击列标题时的事件(ColumnClick)
3.代码(和DataGridView类似)
(和上面也一样,唯一不同的是得到列标题的名字(comparerName))
//用户单击列标题时的事件
bool flag = true;//用来切换升序和降序(如点列标题(姓名),第一次若为升序,第二次点就要换为降序)
private void lvStudent_ColumnClick(object sender, ColumnClickEventArgs e)
{
lvStudent.Sorting = SortOrder.None;//防止最开始的时候,设置SortOrder.Ascending;
//通过事件源找到控件的Name(也就是列标题,和绑定集合里对象的字段对应,如:Name,Popularity)
string comparerName = string.Format("ComparerDemo.Student+SortBy{0}",
((ListView)sender).Columns[e.Column].Name.ToString());
if (flag)//如果为真调用升序比较器
{
flag = false;
}
else//否则,调用降序比较器
{
comparerName += "Desc";
flag = true;
}
//下面是通过字符串反射对象(即:反射得到比较器)
Type type = Type.GetType(comparerName);
if (type != null)
students.Sort((IComparer<Student>)System.Activator.CreateInstance(type));
BindLvStudent();//排序后,重新绑定ListView
}