Технология ASP.Net: методы доступа к данным, управление состоянием
Элементы управления источником данных, управление состоянием.
Рассмотрим простой пример, иллюстрирующий работу в целом как элементов управления с привязкой к источнику данных и элементов управления источником данных, так и управление состоянием на стороне сервера. Управление состоянием на стороне клиента предлагается рассмотреть самостоятельно.
Для начала снова подготовим нашу базу данных для выполнения примера. Создадим хранимую SQL-процедуру, выводящую в зависимости от введенного идентификатора заказа, товары в заказе и их количество.
Конечно, реализовать данный функционал можно и при помощи SQL – запроса непосредственно при редактировании C# кода нашей страницы, но это будет не лучшее решение, с точки зрения безопасности и уязвимости сайта.
- Нажмите правой кнопкой мыши на папке Хранимыве процедуры (раздел Программирование ) и выберите Создать хранимую процедуру.
- Введите следующий код.
CREATE PROCEDURE dbo.orderInfo (@ordID int) AS BEGIN select dbo.Good.GoodName, dbo.GoodsInOrder.NumberOfGoods from dbo.GoodsInOrder INNER JOIN dbo.Good ON dbo.Good.GoodID=dbo.GoodsInOrder.GoodID where dbo.GoodsInOrder.OrderID=@ordID END
Нажмите Выполнить. На этом создание процедуры закончено, теперь мы можем обращаться к ней.
Добавьте на веб - страницу следующие ЭУ: SqlDataSource и GridView. В качестве источника данных для GridView укажите SqlDataSource и при настройке оператора Select источника данных выберите пункт Укажите специальный оператор SQL или хранимую процедуру и нажмите Далее.
В качестве хранимой процедуры для оператора Select укажите только что созданную нами orderInfo и нажмите Далее.
В качестве источника параметров укажите Session, В качестве Session Field укажите orderID и значение по умолчанию 1.
Добавьте следующий код для события выпадающего списка SelectedIndexChanged
//вот собственно и иллюстрация применения Session – передача данных protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { Session["OrderID"] = DropDownList1.SelectedValue; }
В свойствах выпадающего списка присвойте параметру AutoPostBack значение True.
Теперь при изменении текущего знаячения выпадающего списка мы будем видеть более подробную информацию о выбранном заказе. Логика выполнения такова: при изменении значения выпадающего списка в сессию OrderID передается значение идентификатора заказа, затем в соответствии с настройкой источника данных выполняется хранимая SQL – процедура, кооторая возвращает наименования товаров в данном заказе и их количество, что и отображается в "привязанном" к источнику данных GridView.
Для иллюстрации работы элемента управления источником данных нам понадобится следующая процедура, вносящая изменение количества определенного товара в заказе.
CREATE PROCEDURE dbo.Updt (@id int, @newValue int, @goodname nvarchar(50)) AS BEGIN Update dbo.GoodsInOrder set NumberOfGoods=@newValue where OrderID=@id and GoodID = (Select GoodID from dbo.Good where dbo.Good.GoodName = @goodname) END
Затем добавим GridView командную колонку Правка, для этого выберите Правка столбцов в меню задач GridView.
Добавьте столбец Правка, Обновить, Отмена и с помощью стрелок справа от поля Выбранные поля переместите его в начало списка.
В asp – коде для GridView добавьте свойство ReadOnly=true, для колонки GoodName, это необходимо для того, чтобы сделать возможным только изменение поля Number.
<asp:GridView ID="gv_goods" runat="server" AutoGenerateColumns="False" DataSourceID="ordInfo" onrowupdating="gv_goods_RowUpdating"> <Columns> <asp:CommandField ShowEditButton="True" /> <asp:BoundField DataField="GoodName" HeaderText="GoodName" ReadOnly=true SortExpression="GoodName" /> <asp:BoundField DataField="NumberOfGoods" HeaderText="NumberOfGoods" SortExpression="NumberOfGoods" /> </Columns>
У элемента управления SqlDataSource есть параметр UpdateString, определяющий sql – команду выполняемую в случае обновления источника данных. Метод Update этого же элемента управления осуществляет непосредственное обновление источника данных, в нашем случае таблицы GoodsInOrder.
Напишем обработчик события RowUpdating для GridView.
C# - код итоговой веб – страницы
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.Linq; using System.Data.SqlClient; using System.Data; using System.Configuration; using System.Collections; using System.Web.Security; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class OrderInfo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { Session["OrderID"] = DropDownList1.SelectedValue; } protected void gv_goods_RowUpdating(object sender, GridViewUpdateEventArgs e) { int orderID = 0; try { orderID = Convert.ToInt32(Session["OrderID"].ToString()); } catch (Exception exc) { //не очень изящный код, используется исключительно для упрощения самого примера //по сути, если в сессии у нас нет значений, т.е. не произошла смена значения // выпадающего списка мы в качестве идентификатора заказа передаем процедуре 1 orderID = 1; } int newGoodNumber = 0; //получаем наименование товара, для которого необходимо поменять количество string nameOfGood = gv_goods.Rows[e.RowIndex].Cells[1].Text; foreach (DictionaryEntry newValues in e.NewValues) { //поскольку в GridView у нас только один столбец, значение которого можно изменить // в словаре e.NewValues содержится только одно единственное значение нового количества //в результате мы получаем измененное количество определенного товара в заказе newGoodNumber = Convert.ToInt32(e.NewValues[0].ToString()); } //вызываем процедуру обновления БД с необходимыми параметрами ordInfo.UpdateCommand = "exec dbo.Updt '"+orderID+"', '"+ newGoodNumber+"', N'"+nameOfGood+"'"; //обновляем БД средствами элемента управления SqlDataSource ordInfo.Update(); } }
Результат. При выполнении Правка – изменение числа товара – Обновить, обновляются значения в таблице GoodsInOrder в нашей БД.
В приведенном выше коде отсутствует также проверка правильности вводимых значений. Оставляем это на ваше усмотрение, разумеется, подобные послабления недопустимы в условиях разработки реальных веб – приложений.