Опубликован: 07.05.2010 | Уровень: для всех | Доступ: платный
Лекция 13:

Привязка данных ADO.NET

Обработка исключений источников данных

Любая среда исполнения программ при возникновении ошибки выдает соответствующее сообщение, которое для пользователя представляет набор непонятных символов. Задача прикладного программиста - предусмотреть в своем приложении перехват этого сообщения, распознавание его и замену на более понятные для пользователя рекомендации. Даже если код нашей страницы не содержит ошибок, все равно сбой может произойти по причинам, от нас не зависящим. Например, может быть не запущен во время запроса страницы сервер базы данных или разорвано соединение с ней.

Сбой в работе источника данных SqlDataSource сопровождается генерацией события, которое происходит сразу после возникновения ошибки. Сбой при выполнении запроса выбрасывает событие Selected, а при обновлении, вставке или удалении записей - события Updated, Inserted или Deleted соответственно. Мы можем предусмотреть обработку каждого из этих событий в отдельности или запланировать общий обработчик на любой из этих сбоев.

В обработчике ошибок можно получить доступ к объекту сгенерированного исключения через его свойство SqlDataSourceStatusEventArgs.Exception. Если после выброса исключения мы хотим подавить его далнейшее распространение, то в обработчике должны установить SqlDataSourceStatusEventArgs.ExceptionHandled в true.

В качестве примера предусмотрим общий обработчик возможных исключений источника данных SqlDataSource на выполнение всех четырех операций выборки, обновления, вставки и удаления записей в базе данных.

  • Создайте копию страницы SqlDataSourceSimple.aspx с именем SqlDataSourceException.aspx и назначьте ее стартовой
  • Откройте страницу SqlDataSourceException.aspx на редактирование в режиме Design и двойным щелчком на свободном месте Web-формы создайте обработчик Page_Load()
  • В обработчике Page_Load() начинайте набирать строки кода регистрации событий объекта источника данных SqlDataSource1 страницы, активно пользуясь подсказчиком кода

  • Следуйте указаниям подсказчика кода и нажимайте клавишу Tab, чтобы правильно сгенерировать заготовку обработчика
  • Указанным способом зарегистрируйте события (и создайте для каждого из них обработчики)
    • Selected
    • Updated
    • Inserted
    • Deleted

После проведенных действий страница SqlDataSourceException.aspx должна выглядеть так

<%@ Page Language="C#" %>
    
<script runat="server">
    
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlDataSource1.Selected += new SqlDataSourceStatusEventHandler(SqlDataSource1_Selected);
        SqlDataSource1.Updated += new SqlDataSourceStatusEventHandler(SqlDataSource1_Updated);
        SqlDataSource1.Inserted += new SqlDataSourceStatusEventHandler(SqlDataSource1_Inserted);
        SqlDataSource1.Deleted += new SqlDataSourceStatusEventHandler(SqlDataSource1_Deleted);
    }
    
    void SqlDataSource1_Deleted(object sender, SqlDataSourceStatusEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }
    
    void SqlDataSource1_Inserted(object sender, SqlDataSourceStatusEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }
    
    void SqlDataSource1_Updated(object sender, SqlDataSourceStatusEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }
    
    void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }
</script>
    
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ProviderName="System.Data.SqlClient" 
            ConnectionString="<%$ connectionStrings:Northwind %>" 
            SelectCommand=
            "SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" />
        <asp:ListBox ID="ListBox1" runat="server" DataSourceID="SqlDataSource1"
            DataTextField="FirstName" />
        <br />
        <br />
        <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" />
        <br />
        <asp:Button ID="Button1" runat="server" Text="Обновить" /></div>
    </form>
</body>
</html>
  • Оставьте только один обработчик, а остальные удалите
  • Измените имя оставшегося общего обработчика на SqlDataSource1_Error и внесите это имя в регистрацию каждого события, чтобы блок кода сценария стал таким
<script runat="server">
    
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlDataSource1.Selected += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
        SqlDataSource1.Updated += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
        SqlDataSource1.Inserted += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
        SqlDataSource1.Deleted += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
    }
    
    void SqlDataSource1_Error(object sender, SqlDataSourceStatusEventArgs e)
    {
    }
</script>

Теперь осталось обработать возможное исключение источника данных в заготовленном обработчике, чтобы должным образом предупредить пользователя о том, что команда не была завершена.

  • Поместите в конец страницы текстовую метку Label с именем lblError
  • Заполните обработчик ошибки источника данных предупреждающим кодом, чтобы окончательно страница стала следующей
    <%@ Page Language="C#" %>
        
    <script runat="server">
        
        protected void Page_Load(object sender, EventArgs e)
        {
            SqlDataSource1.Selected += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
            SqlDataSource1.Updated += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
            SqlDataSource1.Inserted += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
            SqlDataSource1.Deleted += new SqlDataSourceStatusEventHandler(SqlDataSource1_Error);
        }
        
        void SqlDataSource1_Error(object sender, SqlDataSourceStatusEventArgs e)
        {
            if (e.Exception != null)
            {
                // Известить пользователя, что команда не была завершена
                lblError.Text = "<h1 style='color:#FF0000'>"
                    + "При исполнении запроса произошло исключение!</h1>";
        
                // Известить систему, что ошибка обработана
                e.ExceptionHandled = true;            
            }
        }
    </script>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ProviderName="System.Data.SqlClient" 
                ConnectionString="<%$ connectionStrings:Northwind %>" 
                SelectCommand=
                "SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" />
            <asp:ListBox ID="ListBox1" runat="server" DataSourceID="SqlDataSource1"
                DataTextField="FirstName" />
            <br />
            <br />
            <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" />
            <br />
            <asp:Button ID="Button1" runat="server" Text="Обновить" />
            <asp:Label ID="lblError" runat="server" />
        </div>
        </form>
    </body>
    </html>
  • Чтобы испытать обработчик исключения, внесите какую-нибудь ошибку в строку запроса (измените имя поля или исказите SQL-оператор) и запустите страницу. Результат будет таким

Редактирование записей в источнике данных

Чтобы дать возможность пользователю редактировать записи в механизме множественной привязки данных, не обязательно писать дополнительный код. Можно настроить источник данных и элемент отображения так, чтобы редактирование данных происходило автоматически. Списковые элементы отображения не имеют возможностей редактирования, а более сложные элементы, такие как GridView, DetailsView и FormView имеют такие средства, которые можно в них включить.

Настройка возможностей редактирования состоит из двух шагов:

  1. Определения SQL-операций в соответствующих свойствах UpdateQuery, InsertQuery и DeleteQuery
  2. Настройки элемента отображения

Какие операции с данными мы хотим разрешить пользователю, такие свойства в источнике данных и нужно определять, а остальные можно пропускать.

Приведем пример, в котором дадим возможность пользователю редактировать таблицу Employees учебной базы данных Northwind.

  • Скопируйте страницу SqlDataSourceSimple.aspx с именем SqlDataSourceUpdates.aspx и назначьте ее стартовой
  • Удалите из нее объекты списка ListBox1 и кнопки Button1, чтобы остались только источник данных SqlDataSource1 и элемент отображения GridView1
  • Исполните страницу, чтобы убедиться, что данные, извлеченные источником из таблицы Employees, по-прежнему отображаются в GridView1

Теперь настроим источник на обновление данных.

  • Выделите в режиме Design источник данных SqlDataSource1 и в панели Properties щелкните на кнопке с многоточием в поле UpdateQuery, чтобы запустить редактор формирования SQL-команды обновления записей с параметрами
  • Заполните поле UPDATE command редактора строкой SQL-команды с параметрами
    UPDATE Employees SET FirstName=@FirstName, 
           LastName=@LastName, Title=@Title, City=@City 
           FROM Employees WHERE EmployeeID=@EmployeeID

После щелчка на кнопке Refresh Parameters автоматически заполнится поле Parameters, как показано на рисунке

После таких действий редактор параметров сгенерирует дополнительные поправки в настройку источника данных, дескрипторное описание которого станет таким

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ProviderName="System.Data.SqlClient" 
    ConnectionString="<%$ connectionStrings:Northwind %>" 
    SelectCommand=
        "SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" 
    UpdateCommand="UPDATE Employees SET FirstName=@FirstName, 
        LastName=@LastName, Title=@Title, City=@City 
        FROM Employees WHERE EmployeeID=@EmployeeID" >
    <UpdateParameters>
        <asp:Parameter Name="FirstName" />
        <asp:Parameter Name="LastName" />
        <asp:Parameter Name="Title" />
        <asp:Parameter Name="City" />
        <asp:Parameter Name="EmployeeID" />
    </UpdateParameters>
</asp:SqlDataSource>

Обратите внимание, что имена параметров, предваряемых символом @, мы выбрали совпадающими с именами полей таблицы. Это необходимо потому, что объект GridView1 после привязки к нему источника данных будеть иметь коллекцию столбцов с именами полей, которые и будут выступать в качестве параметров для обмена при обновлении записей. Такое соглашение именования параметров должно выполняться для всех элементов управления данными ASP.NET множественной привязки.

  • Исполните страницу SqlDataSourceUpdates.aspx с внесенными на данном этапе настройками источника данных, чтобы убедиться, что все работает по старому и никаких дополнительных возможностей редактирования пока не появилось

Теперь осталось настроить интерфейсный объект GridView1 на возможность редактирования данных. Для этого добавим к GridView1 дополнительный столбец с функциями управления редактированием записей.

  • Вызовите внутреннюю панель настройки объекта GridView1, как показано на рисунке, и выберите пункт Edit Columns

Появится диалоговое окно Fields, которое предоставляет в удобном виде настройки столбцов объекта GridView1

  • Используя диалоговое окно Fields выполните следующее:
    • Сбросьте флажок Auto-generate fields, чтобы отключить неконтролируемое отображение всех столбцов
    • Добавьте кнопкой Add в поле Selected fields пять столбцов типа BoundField, которые будут связаны с источником данных
    • Выделяя каждый из пяти добавленных столбцов, определите их свойства DataField (имя связываемого поля в источнике данных) и HeaderText (отображаемый на экране заголовок столбца)
    • Добавьте шестой столбец типа CommandField/Edit, Update, Cancel и задайте ему следующие свойства:
      • EditText="Редакция"
      • CancelText="Отмена"
      • UpdateText="Применить
      • ButtonType="Button"
      • HeaderText="Изменить"
      • HeaderStyle/BackColor="Red"
      • HeaderStyle/ForeColor="Yellow"

В результате таких опосредованных действий оболочка сформирует следующее описание объекта GridView1

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" 
                                            AutoGenerateColumns="False" >
    <Columns>
        <asp:BoundField DataField="EmployeeID" HeaderText="№ п/п" />
        <asp:BoundField DataField="FirstName" HeaderText="Имя" />
        <asp:BoundField DataField="LastName" HeaderText="Отчество" />
        <asp:BoundField DataField="Title" HeaderText="Статус" />
        <asp:BoundField DataField="City" HeaderText="Проживает" />
        <asp:CommandField ButtonType="Button" HeaderText="Изменить" 
            ShowEditButton="True" ShowHeader="True"
            EditText="Редакция" CancelText="Отмена" UpdateText="Применить" >
            <HeaderStyle BackColor="Red" ForeColor="Yellow" />
        </asp:CommandField>
    </Columns>
</asp:GridView>

В итоге окончательный код страницы будет следующим

<%@ Page Language="C#" %>
    
<script runat="server">
    // Здесь мы не написали ни строчки кода!!!
</script>
    
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ProviderName="System.Data.SqlClient" 
            ConnectionString="<%$ connectionStrings:Northwind %>" 
            SelectCommand=
                "SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" 
            UpdateCommand="UPDATE Employees SET FirstName=@FirstName, 
                LastName=@LastName, Title=@Title, City=@City 
                FROM Employees WHERE EmployeeID=@EmployeeID" >
            <UpdateParameters>
                <asp:Parameter Name="FirstName" />
                <asp:Parameter Name="LastName" />
                <asp:Parameter Name="Title" />
                <asp:Parameter Name="City" />
                <asp:Parameter Name="EmployeeID" />
            </UpdateParameters>
        </asp:SqlDataSource>
        <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" 
                                                    AutoGenerateColumns="False" >
            <Columns>
                <asp:BoundField DataField="EmployeeID" HeaderText="№ п/п" />
                <asp:BoundField DataField="FirstName" HeaderText="Имя" />
                <asp:BoundField DataField="LastName" HeaderText="Фамилия" />
                <asp:BoundField DataField="Title" HeaderText="Статус" />
                <asp:BoundField DataField="City" HeaderText="Проживает" />
                <asp:CommandField ButtonType="Button" HeaderText="Изменить" 
                    ShowEditButton="True" ShowHeader="True"
                    EditText="Редакция" CancelText="Отмена" UpdateText="Применить" >
                    <HeaderStyle BackColor="Red" ForeColor="Yellow" />
                </asp:CommandField>
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>
</html>
  • Запустите страницу и испытайте ее функциональность. Можно спокойно редактировать записи, не написав при этом ни строчки кода - все делает встроенный механизм ASP.NET

Страница SqlDataSourceUpdates.aspx в действии может выглядеть так

№ п/п Имя Фамилия Статус Проживает Изменить
1 Nancy Davolio Sales Representative Redmond
2 Andrew Fuller Vice President, Sales Tacoma
3 Janet Leverling Sales Representative Kirkland
4 Margaret Peacock Sales Representative Redmond
5 Steven Buchanan Sales Manager London
6 Michael Suyama Sales Representative London
7 Robert King Sales Representative London
8 Laura Callahan Inside Sales Coordinator Redmond
9 Владимир Снетков Доцент 007 Красноярск

В добавленном столбце управления редактированием (его можно разместить на любом месте, изменив порядок следования дескрипторов) щелчок на кнопке "Применить" инициирует обратную отсылку, которая при поступлении на сервер передает источнику значения коллекции параметров, используя имена полей, и затем вызывает метод SqlDataSource.Update() для внесения изменений в базу данных.

Можно создать аналогичные параметризованные команды в источнике данных для свойств InsertQuery и DeleteQuery. Чтобы разрешить, например, вставку в элементе отображения GridView, нужно добавить управляющий столбец типа CommandField и установить его отображение в свойстве ShowInsertButton

Обновление данных при параллельном доступе

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

Такая ситуация называется конкуренцией данных или конфликтом изменений. Для ее решения применяются разные способы, один из которых опирается на тот факт, что в элементе отображения GridView хранятся как оригинальные значения полей, так и их последние изменения. Сам источник данных может оперировать с двумя видами параметров: оригинальными, носящими имя поля с префиксом original по умолчанию (например, @original_FirstName ), и измененными, носящими имя поля. Источник может понимать имена оригинальных параметров и с другим префиксом, который можно установить в его свойстве OldValuesParameterFormatString (например, xxx{0} ).

Принимая решение о сохранении конечных изменений в базе данных, мы можем сконфигурировать в источнике данных команду обновления так, что она выполнится только в том случае, если с момента считывания нами данных их никто не менял. Например

UpdateCommand="UPDATE Employees SET FirstName=@FirstName,
    LastName=@LastName, Title=@Title, City=@City
    FROM Employees WHERE EmployeeID=@original_EmployeeID
    AND FirstName=@original_FirstName
    AND LastName=@original_LastName
    AND Title=@original_Title AND City=@original_City"

Здесь для проверки неизменности полей в базе данных применяются оригинальные параметры, переданные из GridView в источник данных, а для замены - параметры с модифицированными значениями. Приведенная команда выполнит обновление значений полей только тех записей, которые остались неизменными с момента их считывания нашей страницей.

Подобную проверку конфликта изменений данных не обязательно закладывать в SQL-команду обновления. Эту обязанность можно возложить на источник данных, поменяв в нем значение свойства ConflictDetection с OverwriteChanges (заменять без проверки, установлено по умолчанию) на CompareAllValues (заменять только при совпадении всех оригинальных значений).

Применение параметров обновления, не совпадающими с именами полей

Ранее мы говорили, что необходимым условием правильной пересылки данных из GridView в SqlDataSource с целью обновления конечных данных должно быть совпадение имен параметров с именами полей таблицы. Но иногда может возникнуть необходимость применить для обновления конечных данных чью-то подходящую хранимую процедуру, в которой имена параметров отличаются от имен полей, или использовать более информативные имена параметров. Чтобы обойти упомянутое условие совпадения имен параметров и полей, декларативного способа (только настройки объектов на этапе проектирования) не существует, требуется писать дополнительный код сценария.

Рассмотрим этот способ на примере.

  • Скопируйте страницу SqlDataSourceUpdates.aspx с именем OtherNameParamUpdates.aspx и назначьте ее стартовой
  • Проверьте, что страница OtherNameParamUpdates.aspx работает
  • Назовите параметры источника другими именами, отличными от имен полей, например так
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ProviderName="System.Data.SqlClient" 
        ConnectionString="<%$ connectionStrings:Northwind %>" 
        SelectCommand=
            "SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" 
        UpdateCommand="UPDATE Employees SET FirstName=@paramFirstName, 
            LastName=@paramLastName, Title=@paramTitle, City=@paramCity 
            FROM Employees WHERE EmployeeID=@paramEmployeeID" >
        <UpdateParameters>
            <asp:Parameter Name="paramFirstName" Type="string" />
            <asp:Parameter Name="paramLastName" Type="string" />
            <asp:Parameter Name="paramTitle" Type="string" />
            <asp:Parameter Name="paramCity" Type="string" />
            <asp:Parameter Name="paramEmployeeID" Type="string" />
        </UpdateParameters>
    </asp:SqlDataSource>
  • Запустите страницу OtherNameParamUpdates.aspx и убедитесь, что конечные обновления в базе данных не выполняются из за того, что измененные поля не передаются из GridView1 в источник данных SqlDataSource1

Для решения задачи используем событие SqlDataSource.Updating, которое возбуждается непосредственно перед подтверждением обновлений.

  • Перейдите в режим Design редактирования страницы OtherNameParamUpdates.aspx и двойным щелчком на свободном месте Web-формы создайте обработчик события Page_Load()
  • Зайдите в тело обработчика и начинайте регистрировать событие Updating источника данных, набирая следующий код
    SqlDataSource1.Updating +=
    и далее используя клавишу Tab

Оболочка создаст правильную заготовку обработчика события Updating. Теперь можно полностью удалить обработчик Page_Load() как неиспользуемый.

  • Удалите ненужный теперь обработчик Page_Load()
  • Добавьте к описанию источника атрибут OnUpdating="SqlDataSource1_Updating"

Здесь мы пошли более длинным, но универсальным путем создания заготовки обработчика SqlDataSource1_Updating(). Знакомый нам более короткий и традиционный путь - создать заготовку обработчика через панель Properties, при этом имя обработчика автоматически добавится в описание источника данных.

  • Заполните обработчик события Updating так, чтобы страница имела следующий вид
    <%@ Page Language="C#" %>
        
    <script runat="server">
        
        void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
        {
            // Передать значения нестандартным именам параметров
            e.Command.Parameters["@paramFirstName"].Value =
                e.Command.Parameters["@FirstName"].Value;
            e.Command.Parameters["@paramLastName"].Value =
                e.Command.Parameters["@LastName"].Value;
            e.Command.Parameters["@paramTitle"].Value =
                e.Command.Parameters["@Title"].Value;
            e.Command.Parameters["@paramCity"].Value =
                e.Command.Parameters["@City"].Value;
            e.Command.Parameters["@paramEmployeeID"].Value =
                e.Command.Parameters["@EmployeeID"].Value;
        
            // Удалить из коллекции стандартные имена параметров
            e.Command.Parameters.Remove(e.Command.Parameters["@FirstName"]);
            e.Command.Parameters.Remove(e.Command.Parameters["@LastName"]);
            e.Command.Parameters.Remove(e.Command.Parameters["@Title"]);
            e.Command.Parameters.Remove(e.Command.Parameters["@City"]);
            e.Command.Parameters.Remove(e.Command.Parameters["@EmployeeID"]);
        }
    </script>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ProviderName="System.Data.SqlClient" 
                ConnectionString="<%$ connectionStrings:Northwind %>" 
                SelectCommand=
                    "SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" 
                UpdateCommand="UPDATE Employees SET FirstName=@paramFirstName, 
                    LastName=@paramLastName, Title=@paramTitle, City=@paramCity 
                    FROM Employees WHERE EmployeeID=@paramEmployeeID" 
                    OnUpdating="SqlDataSource1_Updating" >
                <UpdateParameters>
                    <asp:Parameter Name="paramFirstName" Type="string" />
                    <asp:Parameter Name="paramLastName" Type="string" />
                    <asp:Parameter Name="paramTitle" Type="string" />
                    <asp:Parameter Name="paramCity" Type="string" />
                    <asp:Parameter Name="paramEmployeeID" Type="string" />
                </UpdateParameters>
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" 
                                                        AutoGenerateColumns="False" >
                <Columns>
                    <asp:BoundField DataField="EmployeeID" HeaderText="№ п/п" />
                    <asp:BoundField DataField="FirstName" HeaderText="Имя" />
                    <asp:BoundField DataField="LastName" HeaderText="Фамилия" />
                    <asp:BoundField DataField="Title" HeaderText="Статус" />
                    <asp:BoundField DataField="City" HeaderText="Проживает" />
                    <asp:CommandField ButtonType="Button" HeaderText="Изменить" 
                        ShowEditButton="True" ShowHeader="True"
                        EditText="Редакция" CancelText="Отмена" UpdateText="Применить" >
                        <HeaderStyle BackColor="Red" ForeColor="Yellow" />
                    </asp:CommandField>
                </Columns>
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>
  • Запустите страницу OtherNameParamUpdates.aspx и убедитесь, что она сохранила прежние способности обновления данных в базе

Переходим к следующей части...

Илья Онучин
Илья Онучин
Россия
Igor Chelyadinski
Igor Chelyadinski
Беларусь, Минск, №54, 2013