2013-11-15 3 views
0

GridView에서 선택한 항목을 기반으로 데이터를 표시하는 DetailsView를 만들었습니다. DetailsView가 편집 모드에 있으면 SQL 데이터 바인딩의 데이터가 포함 된 드롭 다운 목록을 표시합니다. 데이터는 문제없이 드롭 다운 목록에 표시되지만 업데이트하지 못합니다. 다른 모든 필드는 성공합니다.asp.net C# DetailsView DropDownList가 업데이트되지 않습니다.

데이터가 OnDataBound를 통해 드롭 다운에 바인딩됩니다. 아이디어는 SelectedValue를 현재 데이터로 채우고 변경할 수있는 데이터를 채우는 것입니다. 이 문제없이 작동합니다. 단순히 업데이트하지 못합니다.

나는 "an"매개 변수와 컨트롤을 동기화하는 것과 관련이 있다고 생각하지만 그렇게하는 방법을 놓치지 않았습니다.

프런트 엔드 코드 문제에 관한 :

<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 프로파일 러를보고 서버로 보내지는 업데이트 문을 확인하십시오. –

+0

저장에 실패했습니다. SelectedValue = '<% # Bind (") %> 문을 사용하지 않기 때문에 값이 SQL에서 전달되고 업데이트되고 있다고 생각하지 않습니다. 앞에서 설명한 문과 OnDataBound를 모두 사용하려고하면 오류가 발생합니다. – hollow

답변

0

귀하의 업데이트 명령은 세부 사항의 일부로보고, 어떤 ObjectDataSource를의 일부가 될 것으로 보인다. 위의 마크 업이 맞는지 확인할 수 있습니까?

편집은 UpdateParameters 그룹에서

, 당신은 컨트롤에서 값을받지 못하고있다. 다음을 시도해보십시오.

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

DetailsView의 asp : SqlDataSource에서 가져온 것입니다. – hollow

+1

그래,하지만 DetailsView 마크 업 중간에 혼합되어 있습니다. 위의 마크 업을 정리하여 가능한 기존 코드와 비슷하게 만들면 매우 유용합니다. '스 니핑 (snip)'종류의 힌트를 사용하여 질문에 영향을주지 않는 부분을 생략 한 부분을 나타낼 수 있습니다. –

+0

편집 지원 – hollow

0

저는 ControlParameter 사용에 대한 조언을 들었습니다.

수정 사항은 업데이트 매개 변수에 다음을 추가하고 'an'에 대한 자동 채워진 매개 변수를 제거했습니다. 도와 줘서 고마워, 닉.

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

관련 문제