2011-04-14 59 views
4

好吧,我知道这不能真的很难,但我很难找到任何信息。我在页面上有一个gridview,根据用户选择的日期范围(下拉列表)填充数据。当用户点击按钮我填写gridview并显示它。这一切都是使用Linq to Sql完成的。我需要实现分页和排序。请帮助!!!下面是我的按钮单击事件......我愿意接受任何建议,得到这个工作asp.net gridview分页和使用LINQ到SQL自定义LINQ语句排序

protected void btnGenerate_Click(object sender, EventArgs e) 
    { 
     int dateRange =0; 
     if (rbDateList.Checked) 
     { 
      switch (ddlDateRange.SelectedIndex) 
      { 
       case 0: 
        dateRange = 30; 
        break; 
       case 1: 
        dateRange = 60; 
        break; 
       case 2: 
        dateRange = 90; 
        break; 
       default: 
        dateRange = 30; 
        break; 
      } 
     } 
     GYTDataContext gt = new GYTDataContext(); 
     var productList = from o in gt.PurchaseOrderDetails 
          join p in gt.Products on o.ProductId equals p.ProductId 
          join h in gt.PurchaseOrderHeaders on o.PurchaseOrderId equals h.PurchaseOrderId 
          where h.OrderDate>DateTime.Now.AddDays(-dateRange) 
          group o by o.ProductId into orderedItems 
          select new 
          { 
           orderedItems.Key, 
           QuantityOrdered = orderedItems.Sum(s => s.OrderQuantity) 
          }; 
     var totalOrderInfo = from p in productList 
           join prod in gt.Products 
           on p.Key equals prod.ProductId 
           select new 
           { 
            prod.Reference, 
            UnitPrice = prod.Price, 
            prod.ManufacturerProductId, 
            p.QuantityOrdered, 
            TotalCost = prod.Price * Convert.ToInt32(p.QuantityOrdered) 
           }; 

     gvOrderReport.DataSource = totalOrderInfo; 
     gvOrderReport.DataBind(); 
     gvOrderReport.Visible = true; 

回答

5

我有同样的问题,因为你。 linqdatasource,ilustare的大部分例子都是WhereParameters>控件参数的功能,它很酷但不是很强大。

答案很简单: 使用LinqDataSource,只需实现“onselecting”事件就可以传递任何你想要的数据。

这里是全过滤,分页,排序功能 (也注意到,人口SQL是最佳的,并且仅请求前10条记录每次)

ASPX一个简单的例子:

<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox> 
<asp:Button ID="btnFilter" runat="server" Text="Filter" 
    onclick="btnFilter_Click"/> 

<asp:LinqDataSource ID="LinqDataSource1" runat="server" 
    onselecting="LinqDataSource1_Selecting"> 
</asp:LinqDataSource> 

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    AllowSorting="True" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"> 
    <Columns> 
     <asp:BoundField DataField="FirstName" HeaderText="FirstName" ReadOnly="True" 
      SortExpression="FirstName" /> 
     <asp:BoundField DataField="MiddleName" HeaderText="MiddleName" ReadOnly="True" 
      SortExpression="MiddleName" /> 
     <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" 
      SortExpression="LastName" /> 
    </Columns> 
</asp:GridView> 

代码隐藏:

protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
    { 
     var ctx = new LinqDataSource.DBDataContext(); 
     IQueryable<Customer> customers = ctx.Customers; 

     if (!String.IsNullOrEmpty(txtLastName.Text)) 
      customers = customers.Where (c => c.LastName.Contains(txtLastName.Text)); 

     e.Result = customers; 
    } 

    protected void btnFilter_Click(object sender, EventArgs e) 
    { 
     GridView1.DataBind(); 
    } 
1

由于您使用LINQ到SQL与GYTDataContext,为什么不使用LinqDataSource来填充你的GridView?

LinqDataSource可以自动处理分页和排序。

http://msdn.microsoft.com/en-us/library/bb547113.aspx

+0

香港专业教育学院有两个PROBL ems使用任何一个数据源(linqdatasource或objectdatasource)。问题1是我如何创建一个像在数据源中使用的即时消息的查询,也许有一个更短或更直接的方法来试图做什么。问题二是我如何处理点击事件 – 2011-04-14 21:01:33