2012-07-11 2 views
0

나는 다음과 같은 데이터베이스 디자인이 있습니다GridView에서 DropDownList를 사용하여이 열을 업데이트 할 수없는 이유는 무엇입니까?

Employee Table: Username, Name, JobTitle, BadgeNo, IsActive, DivisionCode 
Divisions Table: SapCode, DivisionShortcut 

(DivisionCode가 부서 테이블의 SapCode에 외래 키) 그리고 내가 추가하는 데 사용 오전의 GridView이를 , 삭제 및 직원 정보를 업데이 트/편집 할 수 있습니다. 이 정보는 직원 Username, Name, BadgeNo, JobTitle, IsActive 및 DivisionShortcut입니다. Divisions가 DropDownList에 나열됩니다. 이제 문제는 직원의 부서를 업데이트하는 것입니다. 나는 코드를 작성하지만 다음과 같은 오류 있어요 : *

Invalid column name 'DivisionShortcut'.

  • ASP.NET 코드 :

    <asp:TemplateField HeaderText="Division"> 
         <ItemTemplate> 
          <%# Eval("DivisionShortcut")%> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource" 
               DataTextField="DivisionShortcut" DataValueField="SapCode"> 
          </asp:DropDownList> 
         </EditItemTemplate> 
        </asp:TemplateField> 
    
        <asp:BoundField DataField="Username" HeaderText="Network ID" ReadOnly="True" 
         SortExpression="Username" /> 
    
        <asp:TemplateField HeaderText="Name"> 
         <ItemTemplate> 
          <%# Eval("Name")%> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtEmployeeName" runat="server" Text='<%# Bind("Name")%>' /> 
         </EditItemTemplate> 
        </asp:TemplateField> 
    
        <asp:TemplateField HeaderText="Job Title"> 
         <ItemTemplate> 
          <%# Eval("JobTitle")%> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtJobTitle" runat="server" Text='<%# Bind("JobTitle")%>' /> 
         </EditItemTemplate> 
        </asp:TemplateField> 
    
        <asp:TemplateField HeaderText="Badge No."> 
         <ItemTemplate> 
          <%# Eval("BadgeNo")%> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:TextBox ID="txtBadgeNo" runat="server" Text='<%# Bind("BadgeNo")%>' /> 
         </EditItemTemplate> 
        </asp:TemplateField> 
    
        <asp:TemplateField HeaderText="Is Active?"> 
         <ItemTemplate> 
          <%# Eval("IsActive")%> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:CheckBox ID="isActive" runat="server" 
              Checked='<%# Eval("IsActive").ToString().Equals("True") %>'/> 
         </EditItemTemplate> 
        </asp:TemplateField> 
    
        <asp:TemplateField HeaderText="Delete?"> 
         <ItemTemplate> 
          <span onclick="return confirm('Are you sure to Delete the record?')"> 
           <asp:ImageButton ID="lnkB" runat="server" ImageUrl="Images/icons/delete24.png" CommandName="Delete" /> 
          </span> 
         </ItemTemplate> 
        </asp:TemplateField> 
    </Columns> 
    

    "

    ,536,913,632을 10
    SelectCommand="SELECT  dbo.Divisions.DivisionShortcut, dbo.employee.Username, dbo.employee.Name, dbo.employee.JobTitle, dbo.employee.BadgeNo, dbo.employee.IsActive 
           FROM   dbo.Divisions INNER JOIN 
              dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode" 
    UpdateCommand="UPDATE [employee] SET [Name] = @Name, [JobTitle] = @JobTitle, 
                [BadgeNo] = @BadgeNo WHERE [Username] = @Username" 
    DeleteCommand="DELETE FROM [employee] WHERE [Username] = @Username"> 
    <UpdateParameters> 
        <asp:Parameter Name="Name" Type="String" /> 
        <asp:Parameter Name="JobTitle" Type="String" /> 
        <asp:Parameter Name="BadgeNo" Type="String" /> 
        <asp:Parameter Name="Username" Type="String" /> 
    </UpdateParameters> 
    <DeleteParameters> 
        <asp:Parameter Name="Username" Type="String" /> 
    </DeleteParameters> 
    

    " SelectCommand에 ="

코드 숨김> 부서 "SELECT * : 를 //의 GridView 보호 공극 GridView1_RowEditing 어떠한 행을 편집 (객체 발신자 , GridViewEditEventArgs e) { GridView1.EditIndex = e.NewEditIndex; }

//For canceling any editng in any row in the GridView 
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
{ 
    e.Cancel = true; 
    GridView1.EditIndex = -1; 
} 

//For updating the information in any row in the GridView 
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    GridViewRow gvrow = GridView1.Rows[e.RowIndex]; 

    DropDownList DivisionsList = (DropDownList)gvrow.FindControl("DivisionsList"); 

    TextBox txtEmployeeName = (TextBox)gvrow.FindControl("txtEmployeeName"); 
    TextBox txtJobTitle = (TextBox)gvrow.FindControl("txtJobTitle"); 
    TextBox txtBadgeNo = (TextBox)gvrow.FindControl("txtBadgeNo"); 

    CheckBox isActive = (CheckBox)gvrow.FindControl("isActive"); 

    //For getting the ID (primary key) of that row 
    string username = GridView1.DataKeys[e.RowIndex].Value.ToString(); 

    string name = txtEmployeeName.Text; 
    string jobTitle = txtJobTitle.Text; 
    string badgeNo = txtBadgeNo.Text; 
    string division = DivisionsList.SelectedValue.ToString(); 

    UpdateEmployeeInfo(username, name, jobTitle, badgeNo, division); 
} 


private void UpdateEmployeeInfo(string username, string name, string jobTitle, string badgeNo, string division) 
{ 
    string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString; 
    SqlConnection conn = new SqlConnection(connString); 
    string update = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, 
         BadgeNo = @BadgeNo, DivisionShortcut = @division WHERE Username = @Username; 
         UPDATE Divisions SET [DivisionShortcut] = @division WHERE SapCode = @SapCode;"; 

    SqlCommand cmd = new SqlCommand(update, conn); 

    cmd.Parameters.AddWithValue("@Name", name); 
    cmd.Parameters.AddWithValue("@JobTitle", jobTitle); 
    cmd.Parameters.AddWithValue("@BadgeNo", badgeNo); 
    cmd.Parameters.AddWithValue("@division", division); 
    cmd.Parameters.AddWithValue("@Username", username); 
    //cmd.Parameters.AddWithValue("@IsActive", isActive.checked); 

    try 
    { 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 

     GridView1.EditIndex = -1; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     cmd.Dispose(); 
     conn.Close(); 
     conn.Dispose(); 
    } 
    GridView1.DataBind(); 
} 

그래서 나는의 GridView 안에있는 DropDownList를 사용하는 직원에 대한 Divivsion 필드를 업데이트 할 수있는 방법?

UPDATE : 여기

내 업데이트 된 코드가 그리고 여전히 아무것도 나와 함께 작동하지 않습니다 : ASP.NET 코드 :

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" 
      AutoGenerateColumns="False" DataKeyNames="Username" 
      DataSourceID="SqlDataSource1" BorderWidth="1px" BackColor="#DEBA84" 
      CellPadding="3" CellSpacing="2" BorderStyle="None" 
      BorderColor="#DEBA84"> 
      <FooterStyle ForeColor="#8C4510" 
       BackColor="#F7DFB5"></FooterStyle> 
      <PagerStyle ForeColor="#8C4510" 
       HorizontalAlign="Center"></PagerStyle> 
      <HeaderStyle ForeColor="White" Font-Bold="True" 
       BackColor="#A55129"></HeaderStyle> 
      <Columns> 
       <asp:CommandField ButtonType="Image" ShowEditButton="true" ShowCancelButton="true" 
           EditImageUrl="Images/icons/edit24.png" UpdateImageUrl="Images/icons/update24.png" 
           CancelImageUrl="Images/icons/cancel324.png" /> 

       <asp:TemplateField HeaderText="Division"> 
        <ItemTemplate> 
         <%# Eval("DivisionShortcut")%> 
         <asp:HiddenField ID="divisioncode" value='<%#Eval("divisioncode")%>' runat="server" /> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource" 
              DataTextField="DivisionShortcut" DataValueField="SapCode"> 
         </asp:DropDownList> 
        </EditItemTemplate> 
       </asp:TemplateField> 

       <asp:BoundField DataField="Username" HeaderText="Network ID" ReadOnly="True" 
        SortExpression="Username" /> 

       <asp:TemplateField HeaderText="Name"> 
        <ItemTemplate> 
         <%# Eval("Name")%> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtEmployeeName" runat="server" Text='<%# Bind("Name")%>' /> 
        </EditItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Job Title"> 
        <ItemTemplate> 
         <%# Eval("JobTitle")%> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtJobTitle" runat="server" Text='<%# Bind("JobTitle")%>' /> 
        </EditItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Badge No."> 
        <ItemTemplate> 
         <%# Eval("BadgeNo")%> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtBadgeNo" runat="server" Text='<%# Bind("BadgeNo")%>' /> 
        </EditItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Is Active?"> 
        <ItemTemplate> 
         <%# Eval("IsActive")%> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:CheckBox ID="isActive" runat="server" 
             Checked='<%# Eval("IsActive").ToString().Equals("True") %>'/> 
        </EditItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Delete?"> 
        <ItemTemplate> 
         <span onclick="return confirm('Are you sure to Delete the record?')"> 
          <asp:ImageButton ID="lnkB" runat="server" ImageUrl="Images/icons/delete24.png" CommandName="Delete" /> 
         </span> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>" 

      SelectCommand="SELECT  dbo.Divisions.DivisionShortcut,dbo.employee.DivisionCode, dbo.employee.Username, dbo.employee.Name, dbo.employee.JobTitle, dbo.employee.BadgeNo, dbo.employee.IsActive 
        FROM   dbo.Divisions INNER JOIN 
           dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode" 
      UpdateCommand="UPDATE [employee] SET [Name] = @Name, [JobTitle] = @JobTitle, 
               [BadgeNo] = @BadgeNo WHERE [Username] = @Username" 
      DeleteCommand="DELETE FROM [employee] WHERE [Username] = @Username"> 
      <UpdateParameters> 
       <asp:Parameter Name="Name" Type="String" /> 
       <asp:Parameter Name="JobTitle" Type="String" /> 
       <asp:Parameter Name="BadgeNo" Type="String" /> 
       <asp:Parameter Name="Username" Type="String" /> 
      </UpdateParameters> 
      <DeleteParameters> 
       <asp:Parameter Name="Username" Type="String" /> 
      </DeleteParameters> 
     </asp:SqlDataSource> 

     <asp:SqlDataSource ID="DivisionsListDataSource" runat="server" 
      ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>" 
      SelectCommand="SELECT * FROM Divisions"> 
     </asp:SqlDataSource> 

코드 숨김 :

//For editing any row in the GridView 
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     GridView1.EditIndex = e.NewEditIndex; 
    } 

    //For canceling any editng in any row in the GridView 
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
    { 
     e.Cancel = true; 
     GridView1.EditIndex = -1; 
    } 

    //For updating the information in any row in the GridView 
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     GridViewRow gvrow = GridView1.Rows[e.RowIndex]; 

     DropDownList DivisionsList = (DropDownList)gvrow.FindControl("DivisionsList"); 
     HiddenField hidden = (HiddenField)gvrow.FindControl("divisioncode"); 
     string division_code = hidden.Value.ToString(); 

     TextBox txtEmployeeName = (TextBox)gvrow.FindControl("txtEmployeeName"); 
     TextBox txtJobTitle = (TextBox)gvrow.FindControl("txtJobTitle"); 
     TextBox txtBadgeNo = (TextBox)gvrow.FindControl("txtBadgeNo"); 

     CheckBox isActive = (CheckBox)gvrow.FindControl("isActive"); 

     //For getting the ID (primary key) of that row 
     string username = GridView1.DataKeys[e.RowIndex].Value.ToString(); 

     string name = txtEmployeeName.Text; 
     string jobTitle = txtJobTitle.Text; 
     string badgeNo = txtBadgeNo.Text; 
     string division = DivisionsList.SelectedValue.ToString(); 

     //string divisioncode = DivisionsList.SelectedValue; 

     UpdateEmployeeInfo(username, name, jobTitle, badgeNo, division, division_code); 
    } 


    private void UpdateEmployeeInfo(string username, string name, string jobTitle, string badgeNo, string division, string divisioncode) 
    { 
     string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString; 
     SqlConnection conn = new SqlConnection(connString); 
     string update = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, 
          BadgeNo = @BadgeNo WHERE Username = @Username; 
          UPDATE Divisions SET [DivisionShortcut] = @division WHERE SapCode = @SapCode;"; 

     SqlCommand cmd = new SqlCommand(update, conn); 

     cmd.Parameters.AddWithValue("@Name", name); 
     cmd.Parameters.AddWithValue("@JobTitle", jobTitle); 
     cmd.Parameters.AddWithValue("@BadgeNo", badgeNo); 
     cmd.Parameters.AddWithValue("@division", division); 
     cmd.Parameters.AddWithValue("@Username", username); 
     cmd.Parameters.AddWithValue("@SapCode", divisioncode); 
     //cmd.Parameters.AddWithValue("@IsActive", isActive.checked); 

     try 
     { 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 

      GridView1.EditIndex = -1; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      conn.Close(); 
      conn.Dispose(); 
     } 
     GridView1.DataBind(); 
    } 

답변

0

그 귀하의 코드는 여기

UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, 
        BadgeNo = @BadgeNo, DivisionShortcut = @division WHERE Username =  @Username; 

DivisionShortcut은 Employee 테이블의 구성원이 아닙니다. 당신은 그 아래에 업데이트 성명서를 가지고있어서 우연히 거기에 남겨 두었다고 생각합니다.이 업데이트 라인에서 그것을 삭제하면 문제가 해결 될 것입니다.

+0

를 해결 희망 '. 스칼라 변수 "@SapCode"를 선언해야' –

2

당신은 라인의 코드 부분 다음에 오류가 있습니다

string update = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, 
         BadgeNo = @BadgeNo, DivisionShortcut = @division WHERE Username = @Username; 
                ^^ 
         UPDATE Divisions SET [DivisionShortcut] = @division WHERE SapCode = @SapCode;"; 

dividionshortcut 직원 테이블의 구성원이 아닙니다. 표시된 위치에서 제거하고 다시 실행하십시오. 오류가 제거 될 것이라고 확신합니다.

코드를 사용하십시오. 당신의 gridview에서 추가 다음 필드 :

<asp:TemplateField HeaderText="Division"> 
      <ItemTemplate> 
       <%# Eval("DivisionShortcut")%> 
<asp:HiddenField ID="divisioncode" value='<%#Eval("divisioncode")%>' runat="server" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource" 
            DataTextField="DivisionShortcut" DataValueField="SapCode"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 

처음 사용할 때 선택 명령 다음

SelectCommand="SELECT  dbo.Divisions.DivisionShortcut,dbo.employee.DivisionCode, dbo.employee.Username, dbo.employee.Name, dbo.employee.JobTitle, dbo.employee.BadgeNo, dbo.employee.IsActive 
        FROM   dbo.Divisions INNER JOIN 
           dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode" 
    UpdateCommand="UPDATE [employee] SET [Name] = @Name, [JobTitle] = @JobTitle, 
             [BadgeNo] = @BadgeNo WHERE [Username] = @Username" 
    DeleteCommand="DELETE FROM [employee] WHERE [Username] = @Username"> 
    <UpdateParameters> 
     <asp:Parameter Name="Name" Type="String" /> 
     <asp:Parameter Name="JobTitle" Type="String" /> 
     <asp:Parameter Name="BadgeNo" Type="String" /> 
     <asp:Parameter Name="Username" Type="String" /> 
    </UpdateParameters> 
    <DeleteParameters> 
     <asp:Parameter Name="Username" Type="String" /> 
    </DeleteParameters> 

행 업데이트 이벤트가 다음 사용이라고합니다 둘째 :

코드에서 이제
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    GridViewRow gvrow = GridView1.Rows[e.RowIndex]; 

    DropDownList DivisionsList = (DropDownList)gvrow.FindControl("DivisionsList"); 
    HiddenField hidden = (HiddenField)gvrow.FindControl("divisioncode"); 
    string division_code=hidden.value.ToString(); 
    TextBox txtEmployeeName = (TextBox)gvrow.FindControl("txtEmployeeName"); 
    TextBox txtJobTitle = (TextBox)gvrow.FindControl("txtJobTitle"); 
    TextBox txtBadgeNo = (TextBox)gvrow.FindControl("txtBadgeNo"); 

    CheckBox isActive = (CheckBox)gvrow.FindControl("isActive"); 

    //For getting the ID (primary key) of that row 
    string username = GridView1.DataKeys[e.RowIndex].Value.ToString(); 

    string name = txtEmployeeName.Text; 
    string jobTitle = txtJobTitle.Text; 
    string badgeNo = txtBadgeNo.Text; 
    string division = DivisionsList.SelectedValue.ToString(); 

    UpdateEmployeeInfo(username, name, jobTitle, badgeNo, division,division_code); 
} 

뒤에 하나를 추가를 함수의 나누기 코드에 대한 더 많은 매개 변수와 다음 업데이트 기능 호출 :

,210
private void UpdateEmployeeInfo(string username, string name, string jobTitle, string badgeNo, string division,string divisioncode) 
    { 
     string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString; 
     SqlConnection conn = new SqlConnection(connString); 
     string update = @"UPDATE Employee SET Name = @Name, JobTitle = @JobTitle, 
          BadgeNo = @BadgeNo WHERE Username = @Username; 
          UPDATE Divisions SET [DivisionShortcut] = @division WHERE SapCode = @SapCode;"; 

     SqlCommand cmd = new SqlCommand(update, conn); 

     cmd.Parameters.AddWithValue("@Name", name); 
     cmd.Parameters.AddWithValue("@JobTitle", jobTitle); 
     cmd.Parameters.AddWithValue("@BadgeNo", badgeNo); 
     cmd.Parameters.AddWithValue("@division", division); 
     cmd.Parameters.AddWithValue("@Username", username); 
     cmd.Parameters.AddWithValue("@DapCode", divisioncode); 

     try 
     { 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 

      GridView1.EditIndex = -1; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      conn.Close(); 
      conn.Dispose(); 
     } 
     GridView1.DataBind(); 
    } 

나는이 내가 그것을 제거하고 여전히 오류가 직면하는 문제

+0

다음 오류가 발생했습니다 : '스칼라 변수 "@SapCode"를 선언해야합니다.' –

+0

SapCode의 값을 얻는 방법 및 어디에서 사용해야합니까? 죄송합니다. 많은 질문을 드려 죄송 합니다만 새로운 ASP.NET 개발자입니다. 위의 코드 숨김을 살펴보십시오. –

+0

DivisionCode는 Divisions 테이블의 SapCode에 대한 외래 키이므로 직원 테이블의 업데이트 된 직원 코드 코드를 sapcode 값으로 사용할 수 있습니다. 둘 다 같기 때문에 (희망 사항). –

관련 문제