Добавить поле итога в DataGrid в ASP.NET
Автор:Eve Cole
Время обновления:2009-06-30 15:40:15
Один из наиболее часто задаваемых вопросов на форуме: «Как отобразить итоги по столбцам в DataGrid?». Я лично много раз предоставлял пример кода для этого вопроса, поэтому хотел поместить такое руководство в заголовок DotNetJunkies. В этом руководстве вы узнаете, как программно подсчитывать значения столбца в DataGrid и отображать общее значение в нижнем колонтитуле DataGrid. Загружаемые примеры в этом руководстве включают код C# и Visual Basic.NET.
Конечный результат этого руководства будет выглядеть так:
Как видно из картинки выше:
DataGrid на приведенном выше изображении экрана представляет собой очень типичный DataGrid. Существует множество свойств, управляющих внешним видом DataGrid, который использует два BoundColumn для управления данными, но это не самое важное. Действительно важно сделать это хорошо — использовать событие DataGrid.OnItemDataBound. Это событие будет срабатывать каждый раз, когда запись привязывается к DataGrid. Вы можете создать обработчик событий для этого события, чтобы манипулировать записью данных. В этом случае вы получите общее значение столбца «Цена» во время выполнения.
Нижний колонтитул относится к последней строке диапазона данных. Если эта строка квалифицирована, вы можете получить статистику времени выполнения столбца «Цена» во время обработки событий.
Выполнение :
Сначала давайте найдем способ манипулировать выводом веб-форм. В этом руководстве вы будете использовать веб-форму (calcTotals.aspx) и файл кода класса (calcTotals.aspx.cs). Целью данного руководства является то, что код класса будет скомпилирован с использованием JIT-компилятора. Вот код CalcTotals.aspx:
<%@ Page Inherits="myApp.calcTotals" Src="20010731T0101.aspx.cs" %>
|
AutoGenerateColumns="False" CellPadding="4" CellSpacing="0" BorderStyle="Сплошной" BorderWidth="1" Gridlines="Нет" BorderColor="Черный" ItemStyle-Font-Name="Вердана" ItemStyle-Font-Size="9pt" HeaderStyle-Font-Name="Вердана" HeaderStyle-Font-Size="10pt" HeaderStyle-Font-Bold="True" HeaderStyle-ForeColor="Белый" HeaderStyle-BackColor="Синий" FooterStyle-Font-Name="Вердана" FooterStyle-Font-Size="10pt" FooterStyle-Font-Bold="True" FooterStyle-ForeColor="Белый" FooterStyle-BackColor="Синий" OnItemDataBound="MyDataGrid_ItemDataBound" ShowFooter="True">
|
ItemStyle-HorizontalAlign="Право" HeaderStyle-HorizontalAlign="Центр" />
|
В веб-формах вы используете @Page для непосредственного объявления кода класса, который наследует страница. Атрибут SRC указывает, что код класса будет скомпилирован с использованием JIT-компилятора. Большинство объявлений стилей кода в веб-формах используются для улучшения внешнего вида DataGrid.
Одним из последних указанных свойств является свойство OnItemDataBound. Это событие будет вызвано при возникновении события OnItemDataBound.
DataGrid (MyGrid) в веб-форме содержит два BoundColumn: один — Title, а другой — Price. Здесь будут отображаться столбцы названия и цены таблицы Titles в базе данных Pubs (SQL Server).
Игнорировать определения кода
Код класса будет использоваться везде. В коде класса вы можете управлять двумя событиями: событием Page_Load и событием MyGrid_OnItemDataBound. Существует также частный метод CalcTotal, который можно использовать для простого выполнения математических операций со статистикой времени выполнения.
Начало основного структурного блока кода класса:
использование системы; использование System.Web; использование System.Web.UI; использование System.Web.UI.WebControls; использование System.Web.UI.HtmlControls; использование System.Data; использование System.Data.SqlClient;
пространство имен myApp { общедоступный класс CalcTotals: Страница { защищенный DataGrid MyGrid; частный двойной запускTotal = 0; } } |
В базовой структуре кода класса необходимо использовать соответствующие операторы для импорта пространства имен (namespace). В объявлении класса вы объявляете две переменные: одна — это переменная, отображающая элемент управления DataGrid (MyGrid) веб-формы в коде класса, другая — значение двойной точности, используемое для управления статистикой времени выполнения в столбце Price DataGrid; .
Событие Page_Load
В событии Page_Load все, что вам нужно сделать, — это подключиться к SQL Server и выполнить простую команду SqlCommand. Вы получили все данные о праве собственности и ценах со значением цены > 0. Вы используете метод SqlCommand.ExecuteReader для возврата SqlDataReader и привязки его непосредственно к DataGrid (MyGrid).
protected void Page_Load (отправитель объекта, EventArgs e) { SqlConnection myConnection = new SqlConnection("server=Localhost;database=pubs;uid=sa;pwd=;"); //Создание SQL-соединения SqlCommand myCommand = new SqlCommand("SELECT title, цена ИЗ заголовков WHERE цена > 0", myConnection );//Создаем SQL-команду
пытаться { myConnection.Open();//Открываем соединение с базой данных MyGrid.DataSource = myCommand.ExecuteReader();//Указываем источник данных DataGrid MyGrid.DataBind();//Привязываем данные к DataGrid myConnection.Close();//Закрываем соединение для передачи данных} поймать (исключение ex) { //Перехватываем ошибку HttpContext.Current.Response.Write(ex.ToString()); } } |
Метод CalcTotals
Метод CalcTotals используется для обработки переменной RunningTotal. Это значение будет передано в виде строки. Вам нужно проанализировать его как двойной, и тогда переменная RunningTotal станет двойной.
частная пустота CalcTotal (строка _price) { пытаться { RunningTotal += Double.Parse(_price); } ловить { //обнаруживаем ошибку} } |
Событие MyGrid_ItemDataBound
Событие MyGrid_ItemDataBound вызывается, когда каждая строка в источнике данных привязывается к DataGrid. В этом обработчике событий вы можете обрабатывать каждую строку данных. Для ваших целей вам нужно будет вызвать метод CalcTotals, передать текст из столбца «Цена», отформатировать столбец «Цена» каждой строки с указанием суммы и отобразить значение «runningTotal» в строке нижнего колонтитула.
public void MyDataGrid_ItemDataBound (отправитель объекта, DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { CalcTotal(e.Item.Cells[1].Text); e.Item.Cells[1].Text = string.Format("{0:c}", Convert.ToDouble(e.Item.Cells[1].Text)); } иначе if(e.Item.ItemType == ListItemType.Footer) { e.Item.Cells[0].Text="Итого"; e.Item.Cells[1].Text = string.Format("{0:c}", RunningTotal); } } |
В обработчике событий MyGrid_ItemDataBound сначала необходимо использовать ListItemType, чтобы определить, является ли текущий DataGridItem элементом данных или строкой AlternatingItem. Для элементов данных вы вызываете CalcTotals и передаете ему значение столбца «Цена» в качестве параметра, затем форматируете и раскрашиваете столбец «Цена» в формате суммы;
Если DataGridItem является нижним колонтитулом, RunningTotal может отображаться в формате суммы.
Подвести итог
В этом руководстве вы узнали, как использовать событие DataGrid.OnItemDataBound для получения статистики времени выполнения для столбца DataGrid. Используя это событие, вы можете создать итоговое значение столбца и раскрасить нижний колонтитул строки DataGrid.