Технология 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 в нашей БД.
В приведенном выше коде отсутствует также проверка правильности вводимых значений. Оставляем это на ваше усмотрение, разумеется, подобные послабления недопустимы в условиях разработки реальных веб – приложений.








