내 현재 프로젝트에는 표시/업데이트/삽입/삭제/등해야하는 몇 가지 테이블이 있습니다. 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;
}
}
이 그냥 더러운 것 그리고 더 많은이 있어야한다 느낀다 그것을하는 우아한 방법. 당신이 당신의 데이터 소스로 개체의 목록을 사용하고 있기 때문에
그건 속임수 였어. 그런 간단한 문제에 대한 대단히 부피가 큰 해결책 인 것 같지만 지금까지 본 것 중 가장 우아합니다. 감사. – Jeremy
@ 제레미 - 그래, 나도 간단한 솔루션이 있었으면 좋겠어.하지만 좋은 소식은 당신이 이것을 선택하면 웹 응용 프로그램에서 유틸리티 클래스로 다시 사용할 수 있다는 것입니다. 기쁜 데 도움이되었습니다. 이 답변에 대한 답변도 자유롭게하십시오. :-) –