2013-11-20 6 views
1

내 현재 프로젝트에는 표시/업데이트/삽입/삭제/등해야하는 몇 가지 테이블이 있습니다. GridView를 사용하는 이유는 관련 데이터에 대해 가장 의미가 있기 때문입니다. 그래서 LINQ를 사용하여 DB에서 데이터를 가져옵니다. 지금까지 매우 간단한 쿼리 ... GetAll과 GetByID 타입의 것들. 일의Gridviews 및 일반 목록

List<ds_Users_old> selectedUser = DataContext1.ds_Users_olds.ToList(); 

List<ds_Users_old> selectedUser = DataContext1.ds_Users_olds.Where(user => user.WorkEmail == email).ToList(); 

그 종류 :
그래서 내 쿼리는 다음과 같다.

myUsers를 GridView에 바인딩하고 완료하는 것이 꽤 쉽습니다. 예외는 아니지만 GridView를 모든 열로 정렬해야합니다. SortExpression = "FirstName", "LastName", "OfficePhone", "UserID"등 myUsers.OrderByDescending(o => o.LastName).ToList();은 정상적으로 작동하지만 myUsers.OrderByDescending(o => SortExpression).ToList();이 필요하며 작동하지 않습니다. 그리고 각 SortExpression마다 다른 경우를 만들고 싶지 않습니다. 내가 모은 것에서 그 역동 성을 만들어 내면 정말 엉망이 될 수 있습니다.

그래서 내 LINQ 결과를 DAL의 DataTable로 변환하고 내 LINQ 개체의 일반 목록 대신 DataTable을 반환했습니다. DataTables은 동적 필드별로 정렬하는 것이 더 간단합니다. dt.DefaultView.Sort = e.SortExpression + " " + mySortDirection; 등을들 수있다. 그러나 LINQ 결과를 사용하기 전에 내 LINQ 결과를 DataTable로 변환하는 것은 다소 부피가 클 것 같습니다. 다음은

내 프로젝트의 단순화 된 버전입니다 :

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      UsersGridView_BindGridViewData(); 
     } 
    } 

    protected void UsersGridView_BindGridViewData() 
    { 
     List<ds_Users_old> allUsersList = UserClass.GetAllUsers(); 
     DataTable allUsersDT = UserClass.GetAllUsersDT(); 

     //UsersGridView.DataSource = allUsersList; 
     //UsersGridView.DataBind(); 

     UsersGridView.DataSource = allUsersDT; 
     UsersGridView.DataBind(); 
     Session["allUsersDT"] = allUsersDT; 
    } 

    protected void ComponentGridView_Sorting(object sender, GridViewSortEventArgs e) 
    { 
     DataTable dt = Session["testDT"] as DataTable; 

     if (dt != null) 
     { 
      if (e.SortExpression == "GroupName") 
       e.SortExpression = "GroupID"; 

      dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); 
      UsersGridView.DataSource = Session["allUsersDT"]; 
      UsersGridView.DataBind(); 
     } 
    } 

    private string GetSortDirection(string column) 
    { 
     string sortDirection = "ASC"; 
     string sortExpression = ViewState["SortExpression"] as string; 

     if (sortExpression != null) 
     { 
      if (sortExpression == column) 
      { 
       string lastDirection = ViewState["SortDirection"] as string; 
       if ((lastDirection != null) && (lastDirection == "ASC")) 
       { 
        sortDirection = "DESC"; 
       } 
      } 
     } 

     ViewState["SortDirection"] = sortDirection; 
     ViewState["SortExpression"] = column; 

     return sortDirection; 
    } 

을 그리고 이것은 내가 가진 데이터에 액세스하는 클래스입니다 :

public static class UserClass 
{ 
    private static nsdc_supplyDataContext DataContext1 = new nsdc_supplyDataContext(); 

    #region SELECTS 
    public static List<ds_Users_old> GetAllUsers() 
    { 
     List<ds_Users_old> selectedUser = DataContext1.ds_Users_olds.ToList(); 
     return selectedUser; 
    } 

    public static DataTable GetAllUsersDT() 
    { 
     List<ds_Users_old> selectedUser = DataContext1.ds_Users_olds.ToList(); 
     DataTable selectedUserDT = ConvertToDataTable(selectedUser); 
     return selectedUserDT; 
    } 

    public static List<ds_Users_old> GetUsersByWorkEmail(string email) 
    { 
     List<ds_Users_old> selectedUser = DataContext1.ds_Users_olds.Where(user => user.WorkEmail == email).ToList(); 
     return selectedUser; 
    } 

    public static DataTable GetUsersByWorkEmailDT(string email) 
    { 
     List<ds_Users_old> selectedUsers = DataContext1.ds_Users_olds.Where(user => user.WorkEmail == email).ToList(); 
     DataTable selectedUsersDT = ConvertToDataTable(selectedUsers); 
     return selectedUsersDT; 
    } 
    #endregion 

    public static DataTable ConvertToDataTable<T>(IList<T> data) 
    { 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); 
     DataTable table = new DataTable(); 
     foreach (PropertyDescriptor prop in properties) 
      table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
     foreach (T item in data) 
     { 
      DataRow row = table.NewRow(); 
      foreach (PropertyDescriptor prop in properties) 
       row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
      table.Rows.Add(row); 
     } 
     return table; 
    } 
} 

이 그냥 더러운 것 그리고 더 많은이 있어야한다 느낀다 그것을하는 우아한 방법. 당신이 당신의 데이터 소스로 개체의 목록을 사용하고 있기 때문에

답변

1

는, 당신은 다음과 같이 자신의 정렬 로직을 구현해야합니다

public sealed class GenericComparer<T> : IComparer<T> 
{ 
    public enum SortOrder 
    { 
     Ascending = 0, 
     Descending = 1 
    } 

    private string sortColumn; 
    private SortOrder sortingOrder; 

    public string SortColumn 
    { 
     get 
     { 
      return this.sortColumn; 
     } 
    } 

    public SortOrder SortingOrder 
    { 
     get 
     { 
      return this.sortingOrder; 
     } 
    } 

    public GenericComparer(string theSortColumn, SortOrder theSortingOrder) 
    { 
     this.sortColumn = theSortColumn; 
     this.sortingOrder = theSortingOrder; 
    } 

    public int Compare(T x, T y) 
    { 
     PropertyInfo thePropertyInfo = typeof(T).GetProperty(this.sortColumn); 
     IComparable object1 = (IComparable)thePropertyInfo.GetValue(x, null); 
     IComparable object2 = (IComparable)thePropertyInfo.GetValue(y, null); 
     if (this.sortingOrder == SortOrder.Ascending) 
     { 
      return object1.CompareTo(object2); 
     } 
     else 
     { 
      return object2.CompareTo(object1); 
     } 
    } 
} 

이제 통화에서 개체의 목록에 방법 .Sort()에, 이 도우미 클래스의 새 인스턴스를 전달합니다 (정렬 할 목록의 속성과 정렬하려는 방향 (오름차순 또는 내림차순)을 전달).

위의 비교 논리는 제네릭을 사용하므로 정렬 할 유형 (예 : int, DateTime 또는 도메인 객체)을 전달할 수 있습니다.

+0

그건 속임수 였어. 그런 간단한 문제에 대한 대단히 부피가 큰 해결책 인 것 같지만 지금까지 본 것 중 가장 우아합니다. 감사. – Jeremy

+0

@ 제레미 - 그래, 나도 간단한 솔루션이 있었으면 좋겠어.하지만 좋은 소식은 당신이 이것을 선택하면 웹 응용 프로그램에서 유틸리티 클래스로 다시 사용할 수 있다는 것입니다. 기쁜 데 도움이되었습니다. 이 답변에 대한 답변도 자유롭게하십시오. :-) –