minamorsali
سه شنبه 24 شهریور 1388, 00:12 صبح
سلام خدمت دوستان برنامه نویس
با اجازه اساتید محترم
با پوزش از دوستای حرفه ای، من توضیحات رو تا حد ممکن جزئی گفتم تا دوستایی که مثل من در ابتدای کار هستن درست متوجه بشن.
در این مقاله می خوام روش مرتب سازی و صفحه بندی گرید ویوو در حالتی که دیتاسورس در زمان کد نویسی بایند میشه رو بگم.
البته این روش ایده گرفته از یکی از تاپیک های فروم asp.net هستش.
اول: مرتب سازی
ابتدا تابع زیر رو به ابتدای صفحه تون قبل از رویداد لود صفحه، اضافه کنید:
private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
string newSortDirection = String.Empty;
switch (sortDirection)
{
case SortDirection.Ascending:
newSortDirection = "ASC";
break;
case SortDirection.Descending:
newSortDirection = "DESC";
break;
}
return newSortDirection;
}
این تابع بر اساس نوع مرتب سازی انتخابی (صعودی یا نزولی) عبارت مناسب رو جهت مرتب کردن بر همون اساس می فرسته.
بعد properties گرید ویوو رو بیارید و خصوصیت های allowsorting و allow paging رو true کنید.
بعد در قسمت edit columns برین، هر ستون از نوع bound ، یه فیلدی داره به نام sort expression. نام ستون موردنظر جدولتون رو در اون قرار بدین.
بعدش در رویداد sorting گرید ویوو دستورات زیر رو اضافه کنید:
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dataTable = GridView1.DataSource as DataTable;
if (dataTable != null)
{
DataView dataView = new DataView(dataTable);
Session["currentDataSource"] = dataTable;
Session["currentSortExpression"] = e.SortExpression;
Session["sortingState"] = e.SortDirection;
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridView1.DataSource = dataView;
GridView1.DataBind();
}
}
این دستورات می یاد دیتا سورس گرید ویوو را در یه data table میریزه و بعد یه data view از روی data tableمون می سازه . دیتا ویوو رو مرتب می کنه. و بعد دوباره دیتاسورس گرید ویوو رو بایند می کنه، یعنی به جای دیتاویوو نامرتب ، دیتا ویوو مرتب رو جایگزین می کنه.
توضیح درباره sessionها:
ما اینجا سه تا سشن استفاده کردیم، علت اینه که این سشن ها بعدا توی صفحه بندی به دردمون می خوره.
نحوه مرتب سازی:
برای مرتب سازی دو تا عبارت گرفته (مشابه مرتب سازی دستور select خودمون):اول sort expression است که همون فیلد جدولمونه که می خواد مرتب بشه و ما این ستون رو از طریق bound فیلدمون به رویداد sorting فرستادیم.(همون طور که در بالا توضیح دادم.)
دوم sort direction امون هست که با متدی که در ابتدای تاپیک گفتم اونو به معادل sqlاش تبدیل می کنیم.
خوب تا اینجا مرتب سازی بود.حالا صفحه بندی:
باید دستورات زیر رو بنویسیم: pageindexchangingدر رویداد
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
DataTable dt = (DataTable)Session["currentDataSource"];
GridView1.PageIndex = e.NewPageIndex;
//sort
DataView dv = new DataView(dt);
dv.Sort = Session["currentSortExpression"].ToString() + " "
+ ConvertSortDirectionToSql((SortDirection)Session["sortingState"]);
GridView1.DataSource = dv;
GridView1.DataBind();
}
که صفحه جدید رو از طریق پارامترهای رویداد می گیره و به اون صفحه می ره.
اما اینجا یه سری عملیات اضافی هم داریم که مربوط به مرتب سازیمون میشه: اگه کاربر صفحه رو مرتب کنه و بعد به صفحه بعد بره، اگه توی رویداد paging این مرتب سازی رو درنظر نگیریم، وقتی به صفحه جدید می ریم، مرتب سازیمون می پره و در نتیجه همون داده های نامرتب قبلی رو می بینیم.
در این روش برای جلوگیری از اینکار از سشن ها استفاده شده، توی سشن ها table،sort expression و sort direction به ترتیب در سه سشن currentDataSource و currentSortExpression و sortingState نگهداری می شه و در رویداد pageIndexChanging بازیابی شده و دوباره براساس آخرین مرتب سازی کاربر ، جدول مرتب می شه.
اما آخرین کاری که می کنید باید سشن ها رو در رویداد لود یه مقدار اولیه بدین تا اگه کاربر بدون مرتب سازی به صفحات بعد رفت بهش ارور نده:
if (!IsPostBack)
{
Session["currentDataSource"] = dt;
Session["currentSortExpression"] = "PlaceCode";
Session["sortingState"] = SortDirection.Ascending;
}
امیدوارم که خوب توضیح داده باشم.
موفق باشیم.
یا حق
با اجازه اساتید محترم
با پوزش از دوستای حرفه ای، من توضیحات رو تا حد ممکن جزئی گفتم تا دوستایی که مثل من در ابتدای کار هستن درست متوجه بشن.
در این مقاله می خوام روش مرتب سازی و صفحه بندی گرید ویوو در حالتی که دیتاسورس در زمان کد نویسی بایند میشه رو بگم.
البته این روش ایده گرفته از یکی از تاپیک های فروم asp.net هستش.
اول: مرتب سازی
ابتدا تابع زیر رو به ابتدای صفحه تون قبل از رویداد لود صفحه، اضافه کنید:
private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
string newSortDirection = String.Empty;
switch (sortDirection)
{
case SortDirection.Ascending:
newSortDirection = "ASC";
break;
case SortDirection.Descending:
newSortDirection = "DESC";
break;
}
return newSortDirection;
}
این تابع بر اساس نوع مرتب سازی انتخابی (صعودی یا نزولی) عبارت مناسب رو جهت مرتب کردن بر همون اساس می فرسته.
بعد properties گرید ویوو رو بیارید و خصوصیت های allowsorting و allow paging رو true کنید.
بعد در قسمت edit columns برین، هر ستون از نوع bound ، یه فیلدی داره به نام sort expression. نام ستون موردنظر جدولتون رو در اون قرار بدین.
بعدش در رویداد sorting گرید ویوو دستورات زیر رو اضافه کنید:
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dataTable = GridView1.DataSource as DataTable;
if (dataTable != null)
{
DataView dataView = new DataView(dataTable);
Session["currentDataSource"] = dataTable;
Session["currentSortExpression"] = e.SortExpression;
Session["sortingState"] = e.SortDirection;
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridView1.DataSource = dataView;
GridView1.DataBind();
}
}
این دستورات می یاد دیتا سورس گرید ویوو را در یه data table میریزه و بعد یه data view از روی data tableمون می سازه . دیتا ویوو رو مرتب می کنه. و بعد دوباره دیتاسورس گرید ویوو رو بایند می کنه، یعنی به جای دیتاویوو نامرتب ، دیتا ویوو مرتب رو جایگزین می کنه.
توضیح درباره sessionها:
ما اینجا سه تا سشن استفاده کردیم، علت اینه که این سشن ها بعدا توی صفحه بندی به دردمون می خوره.
نحوه مرتب سازی:
برای مرتب سازی دو تا عبارت گرفته (مشابه مرتب سازی دستور select خودمون):اول sort expression است که همون فیلد جدولمونه که می خواد مرتب بشه و ما این ستون رو از طریق bound فیلدمون به رویداد sorting فرستادیم.(همون طور که در بالا توضیح دادم.)
دوم sort direction امون هست که با متدی که در ابتدای تاپیک گفتم اونو به معادل sqlاش تبدیل می کنیم.
خوب تا اینجا مرتب سازی بود.حالا صفحه بندی:
باید دستورات زیر رو بنویسیم: pageindexchangingدر رویداد
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
DataTable dt = (DataTable)Session["currentDataSource"];
GridView1.PageIndex = e.NewPageIndex;
//sort
DataView dv = new DataView(dt);
dv.Sort = Session["currentSortExpression"].ToString() + " "
+ ConvertSortDirectionToSql((SortDirection)Session["sortingState"]);
GridView1.DataSource = dv;
GridView1.DataBind();
}
که صفحه جدید رو از طریق پارامترهای رویداد می گیره و به اون صفحه می ره.
اما اینجا یه سری عملیات اضافی هم داریم که مربوط به مرتب سازیمون میشه: اگه کاربر صفحه رو مرتب کنه و بعد به صفحه بعد بره، اگه توی رویداد paging این مرتب سازی رو درنظر نگیریم، وقتی به صفحه جدید می ریم، مرتب سازیمون می پره و در نتیجه همون داده های نامرتب قبلی رو می بینیم.
در این روش برای جلوگیری از اینکار از سشن ها استفاده شده، توی سشن ها table،sort expression و sort direction به ترتیب در سه سشن currentDataSource و currentSortExpression و sortingState نگهداری می شه و در رویداد pageIndexChanging بازیابی شده و دوباره براساس آخرین مرتب سازی کاربر ، جدول مرتب می شه.
اما آخرین کاری که می کنید باید سشن ها رو در رویداد لود یه مقدار اولیه بدین تا اگه کاربر بدون مرتب سازی به صفحات بعد رفت بهش ارور نده:
if (!IsPostBack)
{
Session["currentDataSource"] = dt;
Session["currentSortExpression"] = "PlaceCode";
Session["sortingState"] = SortDirection.Ascending;
}
امیدوارم که خوب توضیح داده باشم.
موفق باشیم.
یا حق