Поделиться через


Создание параметров для полей, привязанных к данным, элементом управления источником данных

Обновлен: Ноябрь 2007

При использовании элемента управления с привязкой к данным, такого как элементы управления ASP.NET с привязкой к данным GridView, DetailsView или FormView, он может передавать имена и значения параметров элементу управления с привязкой к данным, основываясь на полях, привязанных к данным в элементе управления с привязкой к данным. Для операции обновления или удаления элемент управления источником данных включает значения и имена полей в коллекцию параметров. Дополнительные сведения см. в разделах Использование параметров с элементом управления SqlDataSource и Использование параметров для элемента управления ObjectDataSource.

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

Если элемент управления с привязкой к данным запрашивает операцию у элемента управления источником данных, то он передает одну или более коллекций IDictionary, содержащих значения и имена параметров для запрашиваемой операции с данными. Значения в парах "имя/значение" в словаре наследуются из дочерних элементов управления. Например, при операции обновления элемент управления с привязкой к данным считывает значения параметров из элемента управления TextBox или CheckBox, которые отображаются в режиме редактирования. Имена в парах "имя/значение" берутся из имен полей, привязанных к дочерним элементам управления, и из имен полей, указанных в свойстве DataKeyNames. Для проведения операции обновления или удаления элемент управления с привязкой к данным должен также передавать словарь, содержащий исходные значения записи данных.

Пары "имя/значение" передаются при помощи следующих коллекций IDictionary:

  • Коллекция Values Передается при операции вставки. Содержит пары "имя/значение" для новой записи. Имена и значения полей для коллекции Values берутся из дочерних элементов управления в InsertItemTemplate или из привязанных полей в элементе управления DetailsView, значение свойства InsertVisible которого принимает значение true.

  • Коллекция Keys Передается при операциях обновления и удаления. Содержит первичный ключ или ключи для обновляемой или удаляемой записи. Если ключевые поля могут изменяться в источнике данных, то коллекция Keys также содержит исходные значения ключевых полей. Если элемент управления с привязкой к данным заполняется данными из элемента управления источником данных, то он сохраняет данные в состоянии просмотра. При запросе операции обновления или удаления коллекция Keys заполняется значениями, ранее сохраненными в состоянии просмотра. Если свойство EnableViewState элемента управления с привязкой к данным имеет значение false, то коллекция Keys не заполняется при операциях обновления или удаления.

  • Коллекция NewValues Передается при операции обновления. Содержит пары "имя-значение" с новыми значениями для обновленного элемента, включая новые значения для обновляемых ключевых полей. Имена и значения полей для коллекции NewValues берутся из дочерних элементов управления в EditItemTemplate или из привязанных полей в элементе управления DetailsView, значение свойства ReadOnly которого принимает значение false.

  • Коллекция OldValues Передается при операциях обновления или удаления. Содержит исходные значения записи данных, используемые для проверки оптимистического параллелизма. (Дополнительные сведения о проверке оптимистического параллелизма обратитесь к свойству ConflictDetection элемента управления источником данных, с которым работаете.) Значения ключевых полей, определяемые свойством DataKeyNames , не включаются в коллекцию OldValues. Имена и значения ключевых полей включаются только в коллекцию Keys. Если элемент управления с привязкой к данным заполняется данными из элемента управления источником данных, то он сохраняет данные в состоянии просмотра. При запросе операции обновления или удаления коллекция OldValues заполняется значениями, ранее сохраненными в состоянии просмотра. Если свойство EnableViewState элемента управления с привязкой к данным имеет значение false, то коллекция OldValues не заполняется при операциях обновления или удаления.

Получить доступ ко всем этим коллекциям можно при помощи аргументов, передаваемых с событием элемента управления с привязкой к данным для запрашиваемой операции. Например, в событии RowUpdating элемента управления GridView класс GridViewUpdateEventArgs предоставляет доступ к коллекции NewValues.

Имена параметров

Элемент управления источником данных автоматически создает параметры для передаваемых в коллекции IDictionary значений. Для операции вставки элемент управления источником данных заполняет коллекцию InsertParameters значениями пар "имя/значение" из коллекции Values. Для операции обновления элемент управления источником данных заполняет коллекцию UpdateParameters значениями пар "имя/значение" из коллекций Keys, NewValues и OldValues. Для операции удаления элемент управления источником данных заполняет коллекцию DeleteParameters значениями пар "имя/значение" из коллекций Keys и OldValues.

Коллекция OldValues не заполняется по умолчанию. Она заполняется, только если свойство ConflictDetection элемента управления источником данных имеет значение CompareAllValues.

Для операций обновления и удаления по умолчанию создаются только параметры текущих привязанных значений. Если необходимо получить доступ к текущим и исходным привязанным значениям (например для поддержки проверки оптимистического параллелизма), то можно сделать так, чтобы элемент управления источником данных создавал параметры для текущих и исходных значений. Чтобы это сделать, необходимо задать правила именования для параметров, которые будут содержать исходные значения. Формат параметров для исходных значений определяется свойством OldValuesParameterFormatString. Установите свойство OldValuesParameterFormatString равным строке, содержащей "{0}" в качестве местозаполнителя для имени поля. Например, если используется элемент управления SqlDataSource и свойство OldValuesParameterFormatString установлено равным "old_{0}", то имена параметров исходных значений будут разрешаться в имя поля с префиксом "@old_". (Элемент управления SqlDataSource добавляет в начало имен всех параметров значение свойства символ "@".) Рассмотрим операцию обновления для поля с именем LastModifiedDate. Текущее значение поля передается в словарь Values, а исходное значение поля передается в словарь OldValues. Параметр с именем @LastModifiedDate создается для передачи текущего значения, а параметр с именем @old\_LastModifiedDate — для передачи исходного значения. Затем можно включить оба параметра в инструкцию SQL, чтобы различать текущие и исходные значения поля, как показано в следующем примере:

UPDATE Table1 SET LastModifiedDate = @LastModifiedDate
  WHERE Key = @Key AND LastModifiedDate = @old_LastModifiedDate

Нет необходимости обращаться к коллекциям "имя/значение" IDictionary напрямую. Можно просто включить автоматически создаваемые имена параметров в инструкцию SQL (если источник данных поддерживает указанные параметры), или имена параметров для методов работы с данными в бизнес-объектах, к которым получается доступ при помощи элемента управления ObjectDataSource.

При необходимости можно задать объект Parameter в коллекциях UpdateParameters, InsertParameters или DeleteParameters элемента управления источником данных, чтобы настроить передаваемые элементом управления с привязкой к данным значения. Можно создать объекты Parameter, чтобы строго типизировать значения или указать значения по умолчанию при передаче null.

В следующем примере показан элемент управления DetailsView, связанный с элементом управления SqlDataSource. Свойства InsertCommand, UpdateCommand и DeleteCommand элемента управления SqlDataSource используют имена параметров, которые автоматически создаются элементом управления SqlDataSource. Значения параметров заполняются, основываясь на словарях Keys и NewValues. Словарь OldValues не используется, так как свойство ConflictDetection имеет по умолчанию значение ConflictOptions.OverwriteChanges.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  Sub EmployeesDropDownList_OnSelectedIndexChanged(sender As Object, e As EventArgs)
    EmployeeDetailsView.DataBind()
  End Sub

  Sub EmployeeDetailsView_ItemUpdated(sender As Object, e As DetailsViewUpdatedEventArgs)
    EmployeesDropDownList.DataBind()
    EmployeesDropDownList.SelectedValue = e.Keys("EmployeeID").ToString()
    EmployeeDetailsView.DataBind()
  End Sub

  Sub EmployeeDetailsView_ItemDeleted(sender As Object, e As DetailsViewDeletedEventArgs)
    EmployeesDropDownList.DataBind()
  End Sub

  Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
    Dim command As System.Data.Common.DbCommand = e.Command  
    EmployeesDropDownList.DataBind()
    EmployeesDropDownList.SelectedValue = _
      command.Parameters("@EmpID").Value.ToString()
    EmployeeDetailsView.DataBind()
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" runat="server">

      <h3>Northwind Employees</h3>

        <table cellspacing="10">

          <tr>
            <td valign="top">
              <asp:DropDownList ID="EmployeesDropDownList" 
                DataSourceID="EmployeesSqlDataSource" 
                DataValueField="EmployeeID" 
                DataTextField="FullName"
                AutoPostBack="True"
                OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
                RunAt="Server" />            
            </td>

            <td valign="top">                
              <asp:DetailsView ID="EmployeeDetailsView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                AutoGenerateRows="false"
                AutoGenerateInsertbutton="true"
                AutoGenerateEditbutton="true"
                AutoGenerateDeletebutton="true"
                DataKeyNames="EmployeeID"     
                Gridlines="Both"
                OnItemUpdated="EmployeeDetailsView_ItemUpdated"
                OnItemDeleted="EmployeeDetailsView_ItemDeleted"      
                RunAt="server">

                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>

                <RowStyle backcolor="White"/>

                <AlternatingRowStyle backcolor="LightGray"/>

                <EditRowStyle backcolor="LightCyan"/>

                <Fields>                  
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
                  <asp:BoundField DataField="Address"    HeaderText="Address"/>                    
                  <asp:BoundField DataField="City"       HeaderText="City"/>                        
                  <asp:BoundField DataField="Region"     HeaderText="Region"/>
                  <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>                    
                </Fields>                    
              </asp:DetailsView>
            </td>                
          </tr>            
        </table>

        <asp:SqlDataSource ID="EmployeesSqlDataSource"  
          SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
          Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:SqlDataSource>


        <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
                         FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
                         VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode); 
                         SELECT @EmpID = SCOPE_IDENTITY()"

          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
                           City=@City, Region=@Region, PostalCode=@PostalCode
                         WHERE EmployeeID=@EmployeeID"

          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">

          <SelectParameters>
            <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
                                  Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>

          <InsertParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

          <UpdateParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </UpdateParameters>

          <DeleteParameters>
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </DeleteParameters>

        </asp:SqlDataSource>
      </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  void EmployeesDropDownList_OnSelectedIndexChanged(Object sender, EventArgs e)
  {
    EmployeeDetailsView.DataBind();
  }

  void EmployeeDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e)
  {
    EmployeesDropDownList.DataBind();
    EmployeesDropDownList.SelectedValue = e.Keys["EmployeeID"].ToString();
    EmployeeDetailsView.DataBind();
  }

  void EmployeeDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e)
  {
    EmployeesDropDownList.DataBind();
  }

  void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
  {
    System.Data.Common.DbCommand command = e.Command;   
    EmployeesDropDownList.DataBind();
    EmployeesDropDownList.SelectedValue = 
      command.Parameters["@EmpID"].Value.ToString();
    EmployeeDetailsView.DataBind();
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" runat="server">

      <h3>Northwind Employees</h3>

        <table cellspacing="10">

          <tr>
            <td valign="top">
              <asp:DropDownList ID="EmployeesDropDownList" 
                DataSourceID="EmployeesSqlDataSource" 
                DataValueField="EmployeeID" 
                DataTextField="FullName"
                AutoPostBack="True"
                OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
                RunAt="Server" />            
            </td>

            <td valign="top">                
              <asp:DetailsView ID="EmployeeDetailsView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                AutoGenerateRows="false"
                AutoGenerateInsertbutton="true"
                AutoGenerateEditbutton="true"
                AutoGenerateDeletebutton="true"
                DataKeyNames="EmployeeID"     
                Gridlines="Both"
                OnItemUpdated="EmployeeDetailsView_ItemUpdated"
                OnItemDeleted="EmployeeDetailsView_ItemDeleted"      
                RunAt="server">

                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>

                <RowStyle backcolor="White"/>

                <AlternatingRowStyle backcolor="LightGray"/>

                <EditRowStyle backcolor="LightCyan"/>

                <Fields>                  
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
                  <asp:BoundField DataField="Address"    HeaderText="Address"/>                    
                  <asp:BoundField DataField="City"       HeaderText="City"/>                        
                  <asp:BoundField DataField="Region"     HeaderText="Region"/>
                  <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>                    
                </Fields>                    
              </asp:DetailsView>
            </td>                
          </tr>            
        </table>

        <asp:SqlDataSource ID="EmployeesSqlDataSource"  
          SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
          Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:SqlDataSource>


        <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
                         FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
                         VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode); 
                         SELECT @EmpID = SCOPE_IDENTITY()"

          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
                           City=@City, Region=@Region, PostalCode=@PostalCode
                         WHERE EmployeeID=@EmployeeID"

          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">

          <SelectParameters>
            <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
                                  Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>

          <InsertParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

          <UpdateParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </UpdateParameters>

          <DeleteParameters>
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </DeleteParameters>

        </asp:SqlDataSource>
      </form>
  </body>
</html>

См. также

Основные понятия

Использование параметров с элементами управления источников данных

Использование параметров с элементом управления SqlDataSource

Использование параметров для элемента управления ObjectDataSource

Общие сведения об элементах управления источниками данных