程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WINFORM中綁定對象支持排序功能

WINFORM中綁定對象支持排序功能

編輯:關於.NET

在很久很久以前,DataSet操作是.Net中的一個重要使用手段,其實現在也是 。

在很久很久以前,我的項目操作方式是通過數據Fill一個DataSet,之後返回 給業務層做處理,之後給頁面去顯示。

隨著時間積累,越來越不喜歡DataSet,我記得有人跟我說DataTable比 DataSet效率高,我不反駁也不認同,不知道。

我只知道DataSet如果不做任何處理在WebService上傳輸效率極其低下。

之後的編程模式中引入了對象的概念。至於對象的好處,在此不做論述。

這篇文章主要表述不是對象如何好,而是如何在Winform中DataGridView綁定 對象支持排序功能。

首先,一個測試的實體類。

Code

/// <summary>

    /// 用戶信息實體

    /// </summary>

    public struct UserInfo

    {

        private string id;

        public string Id

        {

            get { return id; }

            set { id = value; }

        }

        private string name;

        public string Name

        {

            get { return name; }

            set { name = value; }

        }

        private string password;

        public string Password

        {

            get { return password; }

            set { password = value; }

        }

        private string email;

        public string Email

        {

            get { return email; }

            set { email = value; }

        }

        private string address;

        public string Address

        {

            get { return address; }

            set { address = value; }

        }

    }

之後做綁定處理

Code

BindingList<UserInfo> infos = new BindingList<UserInfo>();

            UserInfo myUserInfo = new UserInfo();

            myUserInfo.Id = "1";

            myUserInfo.Name = "張三";

            myUserInfo.Password = "111111";

            myUserInfo.Email = "[email protected]";

            myUserInfo.Address = "浙江寧波";

            infos.Add(myUserInfo);

            UserInfo myUserInfo1 = new UserInfo();

            myUserInfo1.Id = "2";

            myUserInfo1.Name = "李四";

            myUserInfo1.Password = "123456";

            myUserInfo1.Email = "[email protected]";

            myUserInfo1.Address = "上海";

            infos.Add(myUserInfo1);

            this.dataGridView1.DataSource = infos;

這是最常用的一種用對象綁定數據源的手段。

當然也可以使用BindingSource組件,BindingSource 組件的本質是生成一個 BindingList<UserInfo>的列表。

這樣做會產生一個結果就是,如果使用的數據源是DataSet,則可以點擊標題 進行字段排序,但是如果使用List<T>或者BindingList<T>的集合類 就不能實現。

處理手段

做排序處理,做本質的辦法是繼承ICompare接口,重新Compare方法。

新建一排序類

通過PropertyDescriptor和ListSortDirection完成對象屬性排序功能。

Code

class ObjectPropertyCompare<T> : System.Collections.Generic.IComparer<T>

Code

public int Compare(T x, T y)

        {

            object xValue = x.GetType().GetProperty

(property.Name).GetValue(x, null);

            object yValue = y.GetType().GetProperty

(property.Name).GetValue(y, null);

            int returnValue;

            if (xValue is IComparable)

            {

                returnValue = ((IComparable)

xValue).CompareTo(yValue);

            }

            else if (xValue.Equals(yValue))

            {

                returnValue = 0;

            }

            else

            {

                returnValue = xValue.ToString

().CompareTo(yValue.ToString());

            }

            if (direction == ListSortDirection.Ascending)

            {

                return returnValue;

            }

            else

            {

                return returnValue * -1;

            }

        }

之後處理BindingList<T>

Code

public class BindingCollection<T> : 

BindingList<T>

重寫BindingList<T>的兩個方法。

ApplySortCore,RemoveSortCore

BindingList<T>繼承於Collection<T>繼承於IList<T>。

Code

protected override void ApplySortCore(PropertyDescriptor property, 

ListSortDirection direction)

        {

            List<T> items = this.Items as 

List<T>;

            if (items != null)

            {

                ObjectPropertyCompare<T> pc = new 

ObjectPropertyCompare<T>(property, direction);

                items.Sort(pc);

                isSorted = true;

            }

            else

            {

                isSorted = false;

            }

            sortProperty = property;

            sortDirection = direction;

            this.OnListChanged(new ListChangedEventArgs

(ListChangedType.Reset, -1));

        }

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved