请教高手们,我在做winform开发的时候,所有的列表信息都是用的ListView这个控件,然后我又写了一个关于ListView排序功能的类ListViewColumnSorter.我该怎样在这个类里面写ListView的ColumnClick事件呢,而且我每个窗口都是继承了BaseForm这个主窗体,又不能实现继承ListViewColumnSorter这个类了,不能多继承的.
这个那个排序类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace Apparel.Common
{
public class ListViewColumnSorter : IComparer
{
private int ColumnToSort;// 指定按照哪个列排序
private System.Windows.Forms.SortOrder OrderOfSort;// 指定排序的方式
private CaseInsensitiveComparer ObjectCompare;// 声明CaseInsensitiveComparer类对象,
public ListViewColumnSorter()// 构造函数
{
ColumnToSort = 0;// 默认按第一列排序
OrderOfSort = System.Windows.Forms.SortOrder.None;// 排序方式为不排序
ObjectCompare = new CaseInsensitiveComparer();// 初始化CaseInsensitiveComparer类对象
}
// 重写IComparer接口.
// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
public int Compare(object x, object y)
{ int compareResult;
ListViewItem listviewX, listviewY;
// 将比较对象转换为ListViewItem对象
listviewX = (ListViewItem)x;
listviewY = (ListViewItem)y;
// 比较
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
// 根据上面的比较结果返回正确的比较结果
if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
{ // 因为是正序排序,所以直接返回结果
return compareResult;
}
else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
{ // 如果是反序排序,所以要取负值再返回
return (-compareResult);
}
else
{
// 如果相等返回0
return 0;
}
}
/// 获取或设置按照哪一列排序.
public int SortColumn
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}
/// 获取或设置排序方式.
public System.Windows.Forms.SortOrder Order
{ set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
}
}
这是我使用的ListView控件的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Apparel.BLLOrder;
using Apparel.Model.Order;
using Apparel.BLL.Order;
using Apparel.Model;
using DevComponents.DotNetBar;
using Apparel.BLL.Produce;
using Apparel.Model.Produce;
using Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.Collections;
using Apparel.WinFormUI.Produce;
using System.Data.SqlClient;
using System.Diagnostics;
using Apparel.Common;
namespace Apparel.WinFormUI.Order
{
public partial class OrderList : BaseForm
{
#region 全局变量或对象
// 订单服务业务类实体
private readonly OrderBF _orderBF = new OrderBF();
private IList<OrderBE> _orders = new List<OrderBE>();
private SampleClothesBF _SamCloBF = new SampleClothesBF();//打样的逻辑层实例化
public static ProduceList ProduceList { get; set; }
#endregion
private ListViewColumnSorter lvwColumnSorter = new ListViewColumnSorter();
#region 构造涵数
public OrderList()
{
InitializeComponent();
this.lvOrder.ListViewItemSorter = lvwColumnSorter;
OrderPaging.PageSize = 20;
OrderPaging.PagingEvent += LoadAllData;
}
#endregion
#region 加载所有的订单信息
/// <summary>
/// 加载所有的订单信息
/// </summary>
public void LoadAllData()
{
PagingEventEntry pEntry = Common.BuildPagingEntry(OrderPaging.PagingEntry, null);
try
{
_orders = _orderBF.FetchAllOrder(pEntry);
Bind2ListView();
}
catch (Exception ex)
{
MessageBoxEx.Show(this, ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
#region 加载订单数据至ListView
/// <summary>
/// 将数据绑定到ListView中
/// </summary>
private void Bind2ListView()
{
if (null == _orders || _orders.Count == 0)
{
return;
}
if (lvOrder.Items.Count > 0)
{
lvOrder.Items.Clear();
}
foreach (var order in _orders)
{
var item = lvOrder.Items.Add(order.Employee.ToString());
item.Tag = order.Key;
item.SubItems.Add(order.StyleNo);
item.SubItems.Add(order.CommodityName);
//item.SubItems.Add(order.ArrangeId.ToString());
item.SubItems.Add(order.CustomerId.ToString());
item.SubItems.Add(order.TraceId.ToString());
item.SubItems.Add(order.SampleClothesFactory);
item.SubItems.Add(order.BulkProductionFactory);
item.SubItems.Add(string.Format("{0:C}", order.PriceRMB));
item.SubItems.Add(order.OrderCount.ToString());
if (order.RequireDueDate.HasValue)
{
item.SubItems.Add(order.RequireDueDate.Value.ToShortDateString());
}
else
{
item.SubItems.Add(String.Empty);
}
if (order.PlanDueDate.HasValue)
{
item.SubItems.Add(order.PlanDueDate.Value.ToShortDateString());
}
else
{
item.SubItems.Add(String.Empty);
}
if (order.ActualDueDate.HasValue && order.ActualDueDate != Common.DefaultDate)
{
item.SubItems.Add(order.ActualDueDate.Value.ToShortDateString());
}
else
{
item.SubItems.Add(String.Empty);
}
item.SubItems.Add(order.Remark);
}
}
#endregion
#region 首页加载
private void OrderList_Load(object sender, EventArgs e)
{
//LoadAllData();
if (Form_Main.dicForm.ContainsKey("生产列表"))
{
ProduceList = Form_Main.dicForm["生产列表"] as ProduceList;
}
}
#endregion
private void lvOrder_ColumnClick(object sender, ColumnClickEventArgs e)
{
// 检查点击的列是不是现在的排序列.
if (e.Column == lvwColumnSorter.SortColumn)
{
// 重新设置此列的排序方法.
if (lvwColumnSorter.Order == System.Windows.Forms.SortOrder.Ascending)
{
lvwColumnSorter.Order = System.Windows.Forms.SortOrder.Descending;
}
else
{
lvwColumnSorter.Order = System.Windows.Forms.SortOrder.Ascending;
}
}
else
{
// 设置排序列,默认为正向排序
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = System.Windows.Forms.SortOrder.Ascending;
}
// 用新的排序方法对ListView排序
this.lvOrder.Sort();
}
}
}
我现在就是想我只要继承了这个类,那我所有的Listview这个控件就都有点击列头排序的功能了.
用组合把这个类加到你需要的类中,然后需要的时候实例化调用其中的方法
谢谢你的回答,最后我自己解决了。
请问你是怎么解决的?