2013-11-15 5 views
0

Я создал DetailsView, который отображает данные на основе выбранного элемента из GridView. Когда DetailsView находится в режиме редактирования, он отображает dropdownlists, которые содержат данные из SQL-данных SQL. Данные отображаются в раскрывающемся списке без проблем, но не обновляются. Все остальные поля успешны.asp.net C# DetailsView DropDownList не обновляется

Данные привязаны к выходу с помощью OnDataBound. Идея состоит в том, чтобы заполнить SelectedValue текущими данными и заполнить то, к чему его можно изменить. Это работает без проблем. Он просто не обновляется.

Я считаю, что это связано с синхронизацией элемента управления с параметром «an», но я не понимаю, как это сделать.

Front End Код, относящийся к вопросу:

<asp:DetailsView ID="userDetails" runat="server" 
      Height="50px" 
      Width="400px" 
      AutoGenerateRows="False" 
      CellPadding="4" 
      DataKeyNames="id" 
      DataSourceID="detailsSqlDataSource" 
      ForeColor="#333333" 
      GridLines="None" 
      OnDataBound="userDetails_ItemEdit"> 
      <AlternatingRowStyle BackColor="White" /> 
      <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" /> 
      <EditRowStyle BackColor="#2461BF" /> 
      <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" width="125px"/> 
      <Fields> 
       <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True" SortExpression="id" /> 
       <asp:BoundField DataField="first_name" HeaderText="First Name" SortExpression="first_name" /> 
       <asp:BoundField DataField="last_name" HeaderText="Last Name" SortExpression="last_name" /> 
       <asp:BoundField DataField="user_name" HeaderText="User Name" SortExpression="user_name" /> 
       <asp:TemplateField HeaderText="T" SortExpression="t"> 
        <EditItemTemplate> 
         <asp:DropDownList ID="tEditDD" runat="server" SelectedValue='<%# Bind("t") %>'> 
          <asp:ListItem Value="t1" Text="t1"></asp:ListItem> 
          <asp:ListItem Value="t2" Text="t2"></asp:ListItem> 
          <asp:ListItem Value="t3" Text="t3"></asp:ListItem> 
         </asp:DropDownList> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("t") %>'></asp:TextBox> 
        </InsertItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="Label1" runat="server" Text='<%# Bind("t") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="P" SortExpression="p"> 
        <EditItemTemplate> 
         <asp:DropDownList ID="pEditDD" runat="server" SelectedValue='<%# Bind("p") %>'> 
          <asp:ListItem Value="As" Text="As"></asp:ListItem> 
          <asp:ListItem Value="An" Text="An"></asp:ListItem> 
          <asp:ListItem Value="Su" Text="Su"></asp:ListItem> 
          <asp:ListItem Value="Ad" Text="Ad"></asp:ListItem> 
         </asp:DropDownList> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("p") %>'></asp:TextBox> 
        </InsertItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="Label2" runat="server" Text='<%# Bind("p") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="An" SortExpression="an"> 
        <EditItemTemplate> 
         <asp:DropDownList ID="anEditDD" runat="server"> 
         </asp:DropDownList> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("an") %>'></asp:TextBox> 
        </InsertItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="Label3" runat="server" Text='<%# Bind("an") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Su" SortExpression="su"> 
        <EditItemTemplate> 
         <asp:DropDownList ID="suEditDD" runat="server" > 
         </asp:DropDownList> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("su") %>'></asp:TextBox> 
        </InsertItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="Label4" runat="server" Text='<%# Bind("su") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField DataField="email" HeaderText="E-Mail" SortExpression="email" /> 
       <asp:TemplateField HeaderText="AL" SortExpression="al"> 
        <EditItemTemplate> 
         <asp:DropDownList ID="alEditDD" runat="server" SelectedValue='<%# Bind("al") %>'> 
          <asp:ListItem Value="As" Text="As"></asp:ListItem> 
          <asp:ListItem Value="An" Text="An"></asp:ListItem> 
          <asp:ListItem Value="Su" Text="Su"></asp:ListItem> 
          <asp:ListItem Value="Ad" Text="Ad"></asp:ListItem> 
         </asp:DropDownList> 
        </EditItemTemplate> 
        <InsertItemTemplate> 
         <asp:DropDownList ID="alInsertDD" runat="server" SelectedValue='<%# Bind("al") %>'> 
          <asp:ListItem></asp:ListItem> 
          <asp:ListItem Value="As" Text="As"></asp:ListItem> 
          <asp:ListItem Value="An" Text="An"></asp:ListItem> 
          <asp:ListItem Value="Su" Text="Su"></asp:ListItem> 
          <asp:ListItem Value="Ad" Text="Ad"></asp:ListItem> 
         </asp:DropDownList> 
        </InsertItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="Label5" runat="server" Text='<%# Bind("al") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" /> 
      </Fields> 
      <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
      <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> 
      <RowStyle BackColor="#EFF3FB" /> 
     </asp:DetailsView> 
     <asp:SqlDataSource ID="detailsSqlDataSource" runat="server" 
      ConflictDetection="CompareAllValues" 
      ConnectionString="<%$ ConnectionStrings:CPConnectionString %>" 

      UpdateCommand="UPDATE [users] SET [first_name] = @first_name, [last_name] = @last_name, [user_name] = @user_name, [t] = @t, [p] = @p, [an] = @an, [su] = @su, [email] = @email, [al] = @al WHERE [id] = @original_id"> 

      <SelectParameters> 
       <asp:ControlParameter ControlID="usersGrid" Name="id" PropertyName="SelectedValue" Type="Int32" /> 
      </SelectParameters> 
      <UpdateParameters> 
       <asp:Parameter Name="first_name" Type="String" /> 
       <asp:Parameter Name="last_name" Type="String" /> 
       <asp:Parameter Name="user_name" Type="String" /> 
       <asp:Parameter Name="t" Type="String" /> 
       <asp:Parameter Name="p" Type="String" /> 
       <asp:Parameter Name="an" Type="String" /> 
       <asp:Parameter Name="su" Type="String" /> 
       <asp:Parameter Name="email" Type="String" /> 
       <asp:Parameter Name="al" Type="String" /> 
       <asp:Parameter Name="original_id" Type="Int32" /> 
       <asp:Parameter Name="original_first_name" Type="String" /> 
       <asp:Parameter Name="original_last_name" Type="String" /> 
       <asp:Parameter Name="original_user_name" Type="String" /> 
       <asp:Parameter Name="original_t" Type="String" /> 
       <asp:Parameter Name="original_p" Type="String" /> 
       <asp:Parameter Name="original_an" Type="String" /> 
       <asp:Parameter Name="original_su" Type="String" /> 
       <asp:Parameter Name="original_email" Type="String" /> 
       <asp:Parameter Name="original_al" Type="String" /> 
      </UpdateParameters> 
     </asp:SqlDataSource> 

Код За:

protected void userDetails_ItemEdit(object sender, EventArgs e) 
{ 
    if (userDetails.CurrentMode == DetailsViewMode.Edit) 
    { 
     AnDD(); 
    } 
} 

protected void AnDD() 
{ 
    DropDownList anEditDD = userDetails.FindControl("anEditDD") as DropDownList; 
    string userName = ((TextBox)userDetails.Rows[3].Cells[1].Controls[0]).Text; 
    string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["CPConnectionString"].ConnectionString; 
    SqlConnection con = new SqlConnection(conStr); 
    con.Open(); 

    string currentAnSqlSelect = "SELECT an FROM users WHERE user_name='" + userName + "'"; 
    SqlDataReader currentReader; 
    SqlCommand ccmd = new SqlCommand(currentAnSqlSelect, con); 
    currentReader = ccmd.ExecuteReader(); 
    while (currentReader.Read()) 
    { 
     ListItem currentList = new ListItem(); 
     currentList.Text = currentReader["an"].ToString(); 
     errorLBL.Text = currentReader["an"].ToString(); 
     anEditDD.Items.Add(currentList); 
    } 
    currentReader.Close(); 

    string anSqlSelect = "SELECT first_name, last_name FROM users WHERE position='An'"; 
    SqlDataReader anReader; 

    SqlCommand cmd = new SqlCommand(anSqlSelect, con); 
    anReader = cmd.ExecuteReader(); 
    while (anReader.Read()) 
    { 
     ListItem anList = new ListItem(); 
     anList.Text = anReader["first_name"].ToString() + " " + anReader["last_name"].ToString(); 
     anEditDD.Items.Add(anList); 
    } 
    anReader.Close(); 
    con.Close(); 
    anEditDD.Items.Add("N/A"); 
    anEditDD.DataBind(); 
    anEditDD.SelectedIndex = 0; 
} 
+0

Когда вы говорите «это не удается обновить», это означает, что он на самом деле генерирует сообщение об ошибке SQL при попытке сохранить или он просто не спасает? Если он генерирует ошибку, какова ошибка? Если он просто не обновляется, посмотрите на SQL Profiler и посмотрите, что такое оператор обновления, который отправляется на сервер. –

+0

Не удается сохранить. Поскольку я не использую оператор SelectedValue = '<% # Bind ("an")%>', я не считаю, что значение передается и обновляется в SQL. Я получаю сообщение об ошибке при попытке использовать как вышеупомянутый оператор, так и OnDataBound. – hollow

ответ

0

Ваша команда обновления, кажется, часть детали просмотра, а не частью любого ObjectDataSource. Можете ли вы подтвердить правильность своей разметки?

Редактировать

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

<UpdateParameters> 
    <asp:Parameter /> 
    ...snip 
    <asp:ControlParameter Name="an" ControlID="idOfWhateverControlHasTheUserSetValue" Type="String" /> 
    ...snip 
</UpdateParameters> 
+0

То есть из asp: SqlDataSource для DetailsView – hollow

+1

Да, но он смешивается в середине вашей разметки DetailsView. Было бы очень полезно, если бы вы очистили разметку выше, чтобы как можно ближе напоминать существующий код. Вы можете использовать подсказки «snip», чтобы указать, где вы оставили фрагменты, которые не влияют на вопрос. –

+0

Отредактировано для оказания помощи – hollow

0

Я принял ваш совет и немного исследовал использование ControlParameter.

Исправление было добавлением следующего параметра Update Parameters и удалением автоматически заполненных параметров для «an». Спасибо за помощь, Ник.

<asp:ControlParameter Name="an" ControlID="userDetails$anEditDD" PropertyName="SelectedValue" Type="String" />

Смежные вопросы