Опубликован: 24.05.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 3:

Технология ASP.Net: методы доступа к данным, управление состоянием

< Лекция 8 || Самостоятельная работа 3: 1234 || Самостоятельная работа 4 >

Элементы управления источником данных, управление состоянием.

Рассмотрим простой пример, иллюстрирующий работу в целом как элементов управления с привязкой к источнику данных и элементов управления источником данных, так и управление состоянием на стороне сервера. Управление состоянием на стороне клиента предлагается рассмотреть самостоятельно.

Для начала снова подготовим нашу базу данных для выполнения примера. Создадим хранимую SQL-процедуру, выводящую в зависимости от введенного идентификатора заказа, товары в заказе и их количество.

Конечно, реализовать данный функционал можно и при помощи SQL – запроса непосредственно при редактировании C# кода нашей страницы, но это будет не лучшее решение, с точки зрения безопасности и уязвимости сайта.

  1. Нажмите правой кнопкой мыши на папке Хранимыве процедуры (раздел Программирование ) и выберите Создать хранимую процедуру.

  2. Введите следующий код.
    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 в нашей БД.

В приведенном выше коде отсутствует также проверка правильности вводимых значений. Оставляем это на ваше усмотрение, разумеется, подобные послабления недопустимы в условиях разработки реальных веб – приложений.

< Лекция 8 || Самостоятельная работа 3: 1234 || Самостоятельная работа 4 >
Екатерина Соколова
Екатерина Соколова
Россия, Ухта
Никита Гекторов
Никита Гекторов
Украина, Донецк