简体   繁体   English

如何在GridView中修改此复选框?

[英]How to modify this checkbox inside the GridView?

I have the following database design: 我有以下数据库设计:

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

And I have a GridView that I am using it to add, delete and update/edit the employees information. 我有一个GridView,我用它来添加,删除和更新/编辑员工信息。 This information is employee Username, Name, BadgeNo, JobTitle, IsActive and the DivisionShortcut. 此信息是员工用户名,名称,BadgeNo,JobTitle,IsActive和DivisionShortcut。 IsActive is a flag that indicates if the employee is available or in an assignment . IsActive是一个标志,指示员工是否可用或在分配中 I made it as a checkbox and the column should show two values; 我把它作为一个复选框,列应该显示两个值; Active and Inactive. 主动和非主动。 In the Edit mode, the Checkbox will be displayed. 在编辑模式下,将显示复选框。 If it is checked, then it means the employee is avaiable, otherwise it is inactive. 如果选中它,则表示员工可以使用,否则表示处于非活动状态。

I wrote the code and everything works fine, but now I am facing two problems and I don't know how to make them work with my code. 我写了代码,一切正常,但现在我遇到两个问题,我不知道如何让它们与我的代码一起工作。

  1. The GridView shows True or False instead of Active and Inactive and I don't know why. GridView显示True或False而不是Active和Inactive,我不知道为什么。
  2. In the Edit mode, the checkbox will be displayed and the values (Active or Inactive) will be displayed besides to it and it shouldn't be displayed. 在编辑模式下,将显示复选框,除此之外将显示值(活动或非活动),不应显示。 I just want the checkbox to be displayed. 我只想要显示复选框。

So how to modify them? 那么如何修改呢?

在此输入图像描述

ASP.NET code: ASP.NET代码:

<%-- GridView for User Management Subsystem --%>
        <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")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource"
                                          DataTextField="DivisionShortcut" DataValueField="SapCode"
                                          SelectedValue='<%# Bind("DivisionCode")%>'>
                        </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" 
                                      AutoPostBack="true" OnCheckedChanged="isActive_OnCheckedChanged"
                                      Checked='<%# Convert.ToBoolean(Eval("IsActive")) %>'
                                      Text='<%# Eval("IsActive").ToString().Equals("True") ? " Active " : " Inactive " %>'/>
                    </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>

Code-behind: 代码隐藏:

//for updating the (IsActive) column using checkbox inside the GridView
    protected void isActive_OnCheckedChanged(object sender, EventArgs e)
    {
        CheckBox chkStatus = (CheckBox)sender;
        GridViewRow gvrow = (GridViewRow)chkStatus.NamingContainer;

        //Get the ID which is the NetworkID of the employee
        string username = gvrow.Cells[2].Text;
        bool status = chkStatus.Checked;

        string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection(connString);

        string updateIsActive = "UPDATE Employee SET IsActive = @IsActive WHERE Username = @Username";

        SqlCommand cmd = new SqlCommand(updateIsActive, conn);

        cmd.Parameters.AddWithValue("@IsActive", status);
        cmd.Parameters.AddWithValue("@Username", username);

        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }
        catch (SqlException se)
        {
            throw se;
        }
        finally
        {
            cmd.Dispose();
            conn.Close();
            conn.Dispose();
        }
    }

UPDATE: 更新:

I update my code as following: ASP.NET Code: 我更新我的代码如下:ASP.NET代码:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" 
            AutoGenerateColumns="False" DataKeyNames="Username" 
            DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound" 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")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DivisionsList" runat="server" DataSourceID="DivisionsListDataSource"
                                          DataTextField="DivisionShortcut" DataValueField="SapCode"
                                          SelectedValue='<%# Bind("DivisionCode")%>'>
                        </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>
                        <asp:Label ID="lblIsActive" runat="server" Text='<%# Eval("IsActive")%>'></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:CheckBox ID="isActive" runat="server" 
                                      AutoPostBack="true" OnCheckedChanged="isActive_OnCheckedChanged"
                                      Checked='<%# Convert.ToBoolean(Eval("IsActive")) %>'
                                      Text='<%# Eval("IsActive")%>'/>
                    </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>

Code-Behind: 代码隐藏:

//For showing Active or Inactive in the IsActive column instead of True or False
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //Here we will select the IsActive column and modify its text
            Label isActive = new Label();
            isActive = (Label)e.Row.FindControl("lblIsActive");
            //Now, after getting the reference, we can set its text
            isActive.Text = "Active or Inactive";

            // First check Checkedbox is check or not, if not make it grey
            //if (e.Row.Cells[6].Text == "False")
            //    GridView1.BackColor = Color.Gray;

        }
    }

And I am getting the following error and I don't know why: 我收到以下错误,我不知道为什么: 在此输入图像描述

For question no: 1 You have to add an Row_DataBound Event of your grid view, in which you select the IsActive column and replaced its text by Active and InActive. 对于问题号:1您必须添加网格视图的Row_DataBound事件,在该事件中选择IsActive列并将其文本替换为Active和InActive。 But before going to code behind make a little change to you aspx code: In your item template instead of direct binding place a label control and bind it as I does in the below code: 但在进入代码之前对你的aspx代码进行一些改动:在你的项目模板而不是直接绑定中放置一个标签控件并将其绑定,就像我在下面的代码中所做的那样:

<asp:TemplateField HeaderText="Is Active?">
                <ItemTemplate>
                      <asp:Label ID="lblIsActive" runat="server" Text='<%# Eval("IsActive") %>' ></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:CheckBox ID="isActive" runat="server" 
                                  AutoPostBack="true" OnCheckedChanged="isActive_OnCheckedChanged"
                                  Checked='<%# Convert.ToBoolean(Eval("IsActive")) %>'
                                  Text='<%# Eval("IsActive").ToString().Equals("True") ? " Active " : " Inactive " %>'/>
                </EditItemTemplate>
            </asp:TemplateField>

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // here you will select the IsActive column and modify it's text
        Label isActive=new Label();
        isActive = (Label) e.row.FindControl("lblIsActive");
        // after getting the reference set its text
        isActive.Text="Active or InActive";            

    }
}

For question no 2: Remove the condition form this 对于问题2:删除此条件

Eval("IsActive").ToString().Equals("True") ? " Active " : " Inactive " %>'

and replace it with 并替换它

 Eval("IsActive")

Now check boxes will be displayed. 现在将显示复选框。

Updated Answer: You are receiving an object reference not found error, Please debug your site and check it why you are unable to get the exact reference. I saw you code and it looks that your code is fine. 更新的答案: You are receiving an object reference not found error, Please debug your site and check it why you are unable to get the exact reference. I saw you code and it looks that your code is fine. You are receiving an object reference not found error, Please debug your site and check it why you are unable to get the exact reference. I saw you code and it looks that your code is fine. To prove that my code is working,I created a gridview with a single column 为了证明我的代码正常工作,我创建了一个包含单列的gridview

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                     <asp:Label ID="Label1" runat="server" Text='<%# Bind("name") %>'></asp:Label>
                </ItemTemplate>                   
            </asp:TemplateField>
        </Columns>            
    </asp:GridView>
    // and bind this grid view in the Page_Load of my Page
    protected void Page_Load(object sender, EventArgs e)
    { 
    DataTable dt = new DataTable();
    dt.Columns.Add("name");

    DataRow row = dt.NewRow();
    row[0] = "Waqar Janjua";
    dt.Rows.Add(row);

    GridView1.DataSource = dt;
    GridView1.DataBind();
    }

    // When I view this page in the browser it shows "Waqar Janjua"
    // Now to update the columns text, I add the following code and it works.
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
      if (e.Row.RowState != DataControlRowState.Edit)
      {
      if (e.Row.RowType == DataControlRowType.DataRow)
      {
        Label l = new Label();
        l = (Label)e.Row.FindControl("Label1");
        l.Text = "waqar";           
       }
      }
    }

   // When I run this page now, it shows me "Waqar" not "Waqar Janjua" The code works for me.
  1. It is returning "true" or "false" as it is expecting a boolean data type from IsActive. 它返回“true”或“false”,因为它期望来自IsActive的布尔数据类型。 If you want to change that out put, I suspect you need to amend this conditionally on the ItemDataBound event of the grid. 如果你想改变那个输出,我怀疑你需要在网格的ItemDataBound事件上有条件地修改它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM