如何使用GridView中的DropDownList更新一列?

时间:2012-07-14 07:22:58

标签: c# asp.net sql-server gridview

我是一名新的ASP.NET开发人员,我正在努力使用DropDownList更新GridView中的列。详细说明,我有一个GridView,我用它来添加,删除和更新/编辑员工信息。此信息是员工用户名,名称,BadgeNo,JobTitle和DivisionShortcut。 Divisions将列在DropDownList中,但我仍然无法更新此列,我不知道为什么。

我有以下数据库设计:

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

我编写了代码,在调试代码时没有发现任何错误。但是,当我运行代码并从下拉列表中选择一个值时,该列不会更新,我不知道为什么。那么如何在GridView中更新此列?

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" OnRowEditing="GridView1_RowEditing" 
             OnRowCancelingEdit="GridView1_RowCancelingEdit" 
             OnRowUpdating="GridView1_RowUpdating">
            <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")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource"
                                          AutoPostBack="true" DataTextField="DivisionShortcut" DataValueField="SapCode"
                                          selectedValue='<%# Bind("DivisionShortcut") %>'>
                        </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>

在GridView之外,我有DropDownList的SqlDataSource:

<asp:SqlDataSource ID="DivisionsListDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:UsersInfoDBConnectionString %>" 
    SelectCommand="SELECT * FROM Divisions"
    InsertCommand="INSERT INTO [Divisions] ([SapCode], [DivisionShortcut]) VALUES (@SapCode, @DivisionShortcut)"
    UpdateCommand="UPDATE [Divisions] SET [DivisionShortcut] = @DivisionShortcut WHERE [SapCode] = @SapCode">
    <DeleteParameters>
        <asp:Parameter Name="SapCode" Type="Double" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="SapCode" Type="Double" />
        <asp:Parameter Name="DivisionShortcut" Type="String" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="DivisionShortcut" Type="String" />
        <asp:Parameter Name="SapCode" Type="Double" />
    </UpdateParameters>
</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"); 

        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.Text;
        //string divisioncode = DivisionsList.SelectedValue;

        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 WHERE Username = @Username";

        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("@SapCode", divisioncode);
        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();
    }

    //For deleting a row in the GridView
    protected void DeleteRecord(object sender, GridViewDeleteEventArgs e) 
    {
        string networkID = GridView1.DataKeys[e.RowIndex].Value.ToString();

        string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection(connString);
        string deleteCommand = "DELETE employee where dbo.employee.Username = " + networkID;
        SqlCommand cmd = new SqlCommand(deleteCommand, conn);
        cmd.Parameters.AddWithValue("@username", networkID);
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }
        catch (SqlException se)
        {
            throw se;
        }
        finally
        {
            cmd.Dispose();
            conn.Close();
            conn.Dispose();
        }
        GridView1.DataBind();
    }

2 个答案:

答案 0 :(得分:0)

string division = DivisionsList.Text;您必须传递SapCode是错误的,因为SapCode是Divison表中的主键,它是Employees表中的foreing键,因此您必须更新Employee表中的SapCode。希望它能奏效。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string division = DivisionsList.Value; // Hope that it will work
}

答案 1 :(得分:0)

 protected void ddlGrdDtype_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList btn = (DropDownList)sender;
        GridViewRow row = (GridViewRow)btn.Parent.Parent;
        int i = row.RowIndex;

      

        Label lbl_LAId = (Label)grdAttendance.Rows[i].FindControl("lblLAId");
        Label lbl_AttendanceDate = (Label)grdAttendance.Rows[i].FindControl("lblAttendanceDate");
        lblAttandanceDate.Value = lbl_AttendanceDate.Text;
        Label lbl_WorkHrs = (Label)grdAttendance.Rows[i].FindControl("lblWorkHrs");
        Label lbl_Duties = (Label)grdAttendance.Rows[i].FindControl("lblDuties");
        DropDownList ddlGrdDtype = (DropDownList)grdAttendance.Rows[i].FindControl("ddlGrdDtype");
        lblLAId.Value = lbl_LAId.Text;
       

        UpdateDutyTypeOnSelection(lbl_LAId.Text, lbl_WorkHrs.Text, lbl_Duties.Text, ddlGrdDtype.SelectedItem.Text);
    }