asp.net подкачка и сортировка в gridview с помощью пользовательского оператора linq linq для sql

#c# #asp.net #linq-to-sql #gridview

#c# #asp.net #linq-to-sql #gridview

Вопрос:

Хорошо, я знаю, что это действительно не может быть так сложно, но у меня возникли проблемы с поиском какой-либо информации. У меня есть gridview на странице, которую я заполняю данными на основе выбранного пользователем диапазона дат (выпадающий список). Когда пользователь нажимает кнопку, я заполняю gridview и показываю его. Все это выполняется с помощью Linq to Sql. Мне также нужно включить подкачку и сортировку. Помогите, ПОЖАЛУЙСТА!!! Ниже приведено мое событие нажатия кнопки… я открыт для любых предложений, чтобы заставить это работать

 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;
  

Ответ №1:

У меня была та же проблема, что и у вас. В большинстве примеров linqdatasource я использую функциональность WhereParameters > controlparameter, которая хороша, но не настолько мощна.

Ответ прост: используйте 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>
  

CODEBEHIND:

     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();
    }
  

Ответ №2:

Поскольку вы используете LINQ-to-SQL с a GYTDataContext , почему бы не использовать a LinqDataSource для заполнения вашего Gridview?

LinqDataSource Может обрабатывать подкачку и сортировку автоматически.

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

Комментарии:

1. У меня две проблемы с использованием любого из источников данных (linqdatasource или objectdatasource). проблема 1 заключается в том, как мне создать запрос, подобный тому, который я использую для использования в источнике данных, возможно, существует более короткий или прямой метод для того, что я пытаюсь сделать. вторая проблема заключается в том, как мне обработать событие click