PDA

View Full Version : مقاله: آموزش مرتب سازی و صفحه بندی گرید ویوو بدون دیتا سورس



minamorsali
دوشنبه 23 شهریور 1388, 23: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;
}



امیدوارم که خوب توضیح داده باشم.
موفق باشیم.
یا حق

iman_ad
پنج شنبه 26 شهریور 1388, 22:15 عصر
کدی که گذاشتی اشکالات اساسی داره، برای همچین کار ساده ای کی از این همه Session استفاده می کنه
costum page می تونی تو گرید آقای راد ببینی

minamorsali
جمعه 27 شهریور 1388, 08:57 صبح
من گرید ویوو آقای راد رو دیدم.
ورژن 7 اش که در 2005 جواب نمی ده. ورژن 6 اش رو هم که دیدم ازش سر در نیاوردم.
شما به بزرگی خودتان ببخشید، اما افراد زیادی مثل من هستن که فعلا سطحشون مبتدیه و این روش ساده اس و کارشون رو راه می ندازه.
شما اگه بلدید، این روش رو بدون سشن اصلاح کنید و بگید. روش آقای راد شاید برای افراد حرفه ای کارساز باشه، اما برای من و امثال منی که سطحمون پایینه کمک نمی کنه.
البته دوباره من به سایت فوق الذکر رجوع می کنم و طبق ایده هایی که افراد در اون سایت دادن، یک روش بدون سشن پیدا می کنم، و حتما در همین تاپیک روش رو اصلاح می کنم.

minamorsali
یک شنبه 12 مهر 1388, 17:59 عصر
من از یکی از دوستان که در زمینه asp حرفه ای هستند پرسیدم، گفت ایرادی نداره که از سشن استفاده کنیم. حالا اگه ایشون هم اشتباه کردن، دوستان حرفه ای راهنمایی کنن.
در ضمن با view state هم میشه پیاده سازی کرد، اما راستش من نتونستم.:(
دوستان اگه روش بهتری دارن برای یادگیری هم که شده بگن.
با تشکر

minamorsali
یک شنبه 12 مهر 1388, 18:12 عصر
در ضمن من از لینک زیر ایده گرفتم، در صفحه دو این تاپیک پایین صفحه ، یکی یه روشی گفته با VIEW STATE، من نتونستم برنامه شو دانلود کنم و از روی راهنمایی هاش هم نتونستم خودم این کارو انجام بدم، اگه شما تونستید، بگید لطف می کنید: لینک (http://forums.asp.net/t/956540.aspx?PageIndex=2)