#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 поступает из таблицы, либо мне нужно написать код для выполнения подкачки, и именно поэтому я задал вопрос в первую очередь.