تا قبل از ASP.NET 4.5 ، هنگام کار با GridView رسم بر این بوده که به خاصیت DataSource ، یک منبع داده (مانند SqlDataSource و ...) را Bind کرده و متد DataBind را صدا نموده و نتیجه نمایش داده میشد.
اما با استفاده از ویژگیهای جدید اضافه شده(هر چند با تأخیر نسبت به Gridهای پیشرفته دیگر ) کار با این کنترل راحتتر و خواناتر شده است. یکی از این ویژگیها را با هم بررسی میکنیم:
با استفاده از ویژگی SelectMethod میتوان متدی را به GridView معرفی کرد که وظیفه منبع داده را انجام داده و هنگام Bind فراخوانی شده و گرید را پر کند:
مثال:
<asp:GridView ID="gvCities"
runat="server"
AutoGenerateColumns="False"
ItemType="WebApplication3.City"
SelectMethod="GetAllCities">
<Columns>
<asp:TemplateField HeaderText="نام">
<ItemTemplate><%#: Item.Name %></ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
نکته مهم در این کد ItemType است. با استفاده از این خاصیت به جای اینکه مانند قبل نام فیلدهایی که قرار است در گرید نمایش داده شود را بصورت string معرفی کنیم (مثلا در اینجا ("Eval("Name ، اگر نام فیلد را غلط بنویسیم هنگام کامپایل خطایی صادر نمیشود)، آنرا بصورت Strongly Type نوشته و از اشتباه جلوگیری میکنیم.(
+ )
کد متد:
public IQueryable<City> GetAllCities()
{
var context = new EFContext();
var q = from c in context.City
orderby c.Name
select c;
return q;
}
و سپس دستور زیر را فراخوانی میکنیم:
اگر بخواهیم در گرید Paging داشته باشیم بصورت زیر عمل میکنیم:
<asp:GridView ID="gvCities"
runat="server"
AutoGenerateColumns="False"
AllowPaging="True"
PageSize="10"
ItemType="WebApplication3.City"
SelectMethod="GetAllCities">
<Columns>
<asp:TemplateField HeaderText="نام">
<ItemTemplate><%#: Item.Name %></ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
که در اینجا دو خصوصیت AllowPaging و PageSize را مقدار دهی کرده ایم. این خصوصیتها اجازه صفحه بندی را به گرید میدهند.حال برای اینکه متد نیز برای صفحه بندی آماده شود باید سه آرگومان به آن اضافه کنیم:(نام پارامترها باید دقیقا موارد زیر باشد)
1- startRowIndex: نقطه شروع صفحه بندی را مشخص میکند.
2- maximumRows: تعداد سطرهایی که گرید باید نمایش دهد را مشخص میکند.
3- totalRowCount: این پارامتر باید در تابع مقدار دهی شود (مانند مثال) تا مشخص شود نتیجه Query چند رکورد است و در نهایت گرید تعداد صفحات را بر این اساس نمایش میدهد.
و برای اینکه صفحه بندی را در Query هم لحاظ کنیم از دو تا بع Skip و Take استفاده شده است.
public IQueryable<City> GetAllCities(int startRowIndex, int maximumRows, out int totalRowCount)
{
var context = new EFContext();
var q = from c in context.City
select c;
totalRowCount = q.Count();
return q.OrderBy(x=>x.Name).Skip(startRowIndex).Take(maximumRows);
}
نکته مهم در این متد IQueryable بودن آن است که باعث واکشی دادهها بصورت صفحه به صفحه میشود.
دستورات SQL تولید شده در پروفایلر:
همانطور که مشاهده میکنید دو دستور SQL تولید شده ، یکی برای بازگرداندن تعداد رکوردها و یکی هم برای واکشی دادهها به اندازه تعداد رکوردهای مجاز در هر صفحه.