ASP.NET (4.5) Привязка GridView к динамически генерируемому SQL-запросу с подкачкой и сортировкой?

#asp.net #gridview

#asp.net #gridview

Вопрос:

Я использую VS 2013 (последнюю версию) и ASP.NET 4.5 Приложение WebForms. Мне нужно запускать команды SQL, которые возвращают данные, но это все, что я знаю о SQL во время выполнения. Я хочу привязать результат во время выполнения к GridView и заставить его автоматически генерировать столбцы. Я также хочу, чтобы он поддерживал сортировку и подкачку.

Я исследовал это до тошноты, и я нахожу тонны примеров, которые относятся к одной части этого, но ничего, что, по-видимому, допускает все аспекты сразу.

Нет ли какого-нибудь простого способа сделать это? Мне кажется, что я должен просто привязать данные к сетке и позволить ей позаботиться обо всем остальном.

К вашему СВЕДЕНИЮ, рассматриваемые команды SQL хранятся в таблице в базе данных вместе с информацией о параметрах (если таковые имеются). Мое веб-приложение позволяет пользователю выбрать одну из этих команд SQL, облегчает ввод информации о параметрах и позволяет пользователю запускать запрос для экспорта его в разные форматы или даже запускать для него Crystal Report. Вот почему я ничего не знаю о SQL во время выполнения. На случай, если вам не все равно. 🙂

Редактировать:

Итак, вот что я придумал. Пожалуйста, обратите внимание, что я удалил кучу кода, связанного с моей логикой, которая на самом деле не имеет отношения к этому обсуждению, поэтому это может не скомпилироваться, но это должно дать вам представление.

 <asp:GridView runat="server" ID="gridView1" CssClass="XG_DataTable" 
                AllowSorting="true" AllowPaging="true" PageSize="20"
                OnPageIndexChanging="gridView1_OnPageIndexChanging"
                OnSorting="gridView1_OnSorting"
                AutoGenerateColumns="true">
</asp:GridView>
  

 public partial class ViewGrid
{
    private bool SortAscending
    {
        get
        {
            var result = ViewState["SortAscending"];
            return (result == null) || ((bool) result);
        }
        set { ViewState["SortAscending"] = value; }
    }

    private string SortExpression
    {
        get
        {
            var result = ViewState["SortExpression"];
            return result == null ? "" : result.ToString();
        }
        set
        {
            if (value == SortExpression)
                SortAscending = !SortAscending;
            else
            {
                ViewState["SortExpression"] = value;
                SortAscending = true;
            }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        BindGridView();
    }

    private void BindGridView()
    {
        gridView1.DataSource = GetData();
        gridView1.DataBind();
    }

    private object GetData()
    {
        var dataTable = GetUnsortedData();

        var sortExpression = SortExpression;
        if (string.IsNullOrEmpty(sortExpression))
            return dataTable;

        var dv = new DataView(dataTable);
        dv.Sort = string.Format("{0} {1}", sortExpression, SortAscending ? "asc" : "desc");
        return dv;
    }

    private DataTable GetUnsortedData()
    {
        // retrieve the data from the database
    }

    protected void gridView1_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gridView1.PageIndex = e.NewPageIndex;
        BindGridView();
    }

    protected void gridView1_OnSorting(object sender, GridViewSortEventArgs e)
    {
        SortExpression = e.SortExpression;
        BindGridView();
    }
}
  

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

1. Как вы привязываете свои данные? Используете ли вы элемент управления SqlDataSource или ObjectDataSource для привязки ваших данных к сетке? Или вы извлекаете данные в коде и назначаете их в качестве источника данных для gridview вручную?

Ответ №1:

Вот пример

Разметка HTMl:

 <asp:GridView runat="server" AllowPaging="true" AllowSorting="true"     
id="mygrid" AutoGenerateColumns="true"></asp:GridView>
  

Вы можете задать размер страницы для количества строк из источника данных для отображения на странице.

C#

 protected void Page_Load(object sender, EventArgs e)
 {
       if (!Page.IsPostBack)
       {
          gvBind(); //Bind gridview
       }
}

public void gvBind()
{    SqlDataAdapter dap = new SqlDataAdapter("select query", conn);
     DataSet ds = new DataSet();
     dap.Fill(ds);
     mygrid.DataSource = ds.Tables[0];
     mygrid.DataBind();
}

protected void PageIndexChanging(object sender, GridViewPageEventArgs e)
{
       mygrid.PageIndex = e.NewPageIndex;
       gvBind();
}
  

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

1. Спасибо. Мне пришлось проделать некоторую работу, чтобы разобраться с сортировкой, но ваш пост должен идти в правильном направлении.

Ответ №2:

Получите данные в наборе данных и установите источник данных gridview для этого набора данных.

Интерфейс

 <asp:GridView runat="server" AllowPaging="true" AllowSorting="true"     id="mygrid" AutoGenerateColumns="true"></asp:GridView>
  

Затем код позади

  mygrid.DataSource = dataset
           mygrid.DataBind();
  

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

1. Спасибо за ответ. Когда я делаю это и нажимаю на номер страницы, я получаю сообщение об ошибке: «GridView ‘GridView1’ запустил событие PageIndexChanging, которое не было обработано».

2. Обработайте событие PageIndexChanging , много примеров в Интернете, поиск

3. Это именно моя точка зрения. Если я обрабатываю событие PageIndexChanging, то мне либо нужно добавить параметры подкачки к SQL-запросу, чего я не могу сделать, потому что SQL поступает из таблицы, либо мне нужно написать код для выполнения подкачки, и именно поэтому я задал вопрос в первую очередь.