پیشنیازها
-
صفحه بندی و مرتب سازی خودکار اطلاعات به کمک jqGrid در ASP.NET MVC
-
فعال سازی و پردازش جستجوی پویای jqGrid در ASP.NET MVC
-
سفارشی سازی عناصر صفحات پویای افزودن و ویرایش رکوردهای jqGrid در ASP.NET MVC
-
آشنایی با کتابخانهی PDF Report
اضافه کردن دکمهی خروجی به jqGrid
برای تهیه خروجی از jqGrid نیاز است بدانیم، اکنون در چه صفحهای از اطلاعات قرار داریم؟ بر روی چه ستونی، مرتب سازی صورت گرفتهاست؟ بر روی کدام فیلدها با چه مقادیری جستجو انجام شدهاست؟ تا ... بتوانیم بر این مبنا، منبع دادهی موجود را فیلتر کرده و لیست نهایی را تبدیل به گزارش کنیم. گزارشی که دقیقا با اطلاعاتی که کاربر در صفحه مشاهده میکند، تطابق داشته باشد.
خوشبختانه تمام این سؤالات توسط متد توکار excelExport در سمت سرور قابل دریافت است:
@section Scripts
{
<script type="text/javascript">
$(document).ready(function () {
$('#list').jqGrid({
caption: "آزمایش ششم",
// مانند قبل
}).navGrid(
// مانند قبل
}).jqGrid('navButtonAdd', '#pager', {
caption: "", buttonicon: "ui-icon-print", title: "خروجی پی دی اف",
onClickButton: function () {
$("#list").jqGrid('excelExport', { url: '@Url.Action("GetProducts", "Home")' });
}
});
});
</script>
}
در اینجا توسط متد navButtonAdd یک دکمهی جدید را اضافه کردهایم که کلیک بر روی آن سبب فراخوانی متد excelExport و ارسال اطلاعات گزارش به url تنظیم شدهاست. باید دقت داشت که این اطلاعات از طریق Http Get به سرور ارسال میشوند و دقیقا اجزای آن همان اجزای جستجوی پویای jqGrid است:
public ActionResult GetProducts(string sidx, string sord, int page, int rows,
bool _search, string searchField, string searchString,
string searchOper, string filters, string oper)
با این تفاوت که یک oper نیز به مجموعهی پارامترهای ارسالی به سرور اضافه شدهاست. این oper در اینجا با excel مقدار دهی میشود.
البته چون تعداد این پارامترها بیش از اندازه شدهاست، بهتر است آنها را تبدیل به یک کلاس کرد:
namespace jqGrid06.Models
{
public class JqGridRequest
{
public string sidx { set; get; }
public string sord { set; get; }
public int page { set; get; }
public int rows { set; get; }
public bool _search { set; get; }
public string searchField { set; get; }
public string searchString { set; get; }
public string searchOper { set; get; }
public string filters { set; get; }
public string oper { set; get; }
}
}
و متد جستجوی پویا را به نحو ذیل بازنویسی نمود:
public ActionResult GetProducts(JqGridRequest request)
{
var list = ProductDataSource.LatestProducts;
var pageIndex = request.page - 1;
var pageSize = request.rows;
var totalRecords = list.Count;
var totalPages = (int)Math.Ceiling(totalRecords / (float)pageSize);
var productsQuery = list.AsQueryable();
productsQuery = new JqGridSearch().ApplyFilter(productsQuery, request, this.Request.Form);
productsQuery = productsQuery.OrderBy(request.sidx + " " + request.sord);
if (string.IsNullOrWhiteSpace(request.oper))
{
productsQuery = productsQuery
.Skip(pageIndex * pageSize)
.Take(pageSize);
}
else if (request.oper == "excel")
{
productsQuery = productsQuery
.Skip(pageIndex * pageSize);
}
var productsList = productsQuery.ToList();
if (!string.IsNullOrWhiteSpace(request.oper) && request.oper == "excel")
{
new ProductsPdfReport().CreatePdfReport(productsList);
}
var productsData = new JqGridData
{
Total = totalPages,
Page = request.page,
Records = totalRecords,
Rows = (productsList.Select(product => new JqGridRowData
{
Id = product.Id,
RowCells = new List<string>
{
product.Id.ToString(CultureInfo.InvariantCulture),
product.Name,
product.AddDate.ToPersianDate(),
product.Price.ToString(CultureInfo.InvariantCulture)
}
})).ToArray()
};
return Json(productsData, JsonRequestBehavior.AllowGet);
}
توضیحات:
اکثر قسمتهای این متد با متدی که در مطلب «
فعال سازی و پردازش جستجوی پویای jqGrid در ASP.NET MVC» مشاهده کردید یکی است؛ برای مثال order by آن با استفاده از کتابخانهی Dynamic LINQ به صورت پویا عمل میکند و متد ApplyFilter، کار تهیه where پویا را انجام میدهد.
فقط در اینجا بررسی و پردازش پارامتر oper نیز اضافه شدهاست. اگر این پارامتر مقدار دهی شده باشد، یعنی نیاز است کل اطلاعات را واکشی کرد؛ زیرا میخواهیم گزارش گیری کنیم و نه اینکه صرفا اطلاعات یک صفحه را به کاربر بازگشت دهیم. همچنین در اینجا List نهایی فیلتر شده به یک گزارش Pdf Report ارسال میشود. این گزارش چون نهایتا اطلاعات را در مرورگر کاربر Flush میکند، کار به اجرای سایر قسمتها نخواهد رسید و همینجا گزارش نهایی تهیه میشود.
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید jqGrid06.7z