2012-07-15 41 views
0

我有以下的数据库设计:如何修改GridView中的这个复选框?

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

我有,我用它来添加,删除和更新/编辑员工信息的GridView控件。这些信息是员工用户名,姓名,证件号,JobTitle,IsActive和DivisionShortcut。 IsActive是一个标志,指示如果员工是可用的或在分配。我把它作为一个复选框,列应该显示两个值;有效和无效。在编辑模式下,将显示复选框。如果它被检查,那么这意味着员工是可用的,否则它是不活动的。

我写的代码,一切工作正常,但现在我面临两个问题,我不知道如何使它们与我的代码工作。

  1. 该GridView显示True或False而不是活动和不活动,并且我不知道为什么。
  2. 在编辑模式中,将显示该复选框,并且除此之外还将显示值(活动或非活动),并且不应显示它。我只想显示复选框。

那么如何修改它们?

enter image description here

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> 

代码隐藏:

//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:

更新我的代码如下: 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> 

代码隐藏:

//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; 

     } 
    } 

而且我收到以下错误,我不知道为什么: enter image description here

+0

查看我更新的答案,我更新了GridView1_RowDataBound事件。 – 2012-07-16 09:51:55

回答

2

对于问题没有: 1 您必须添加网格视图的Row_DataBound事件,在其中选择IsActive列并用Active和InActive替换其文本。但在此之前去后面的代码稍作改动你的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";    

    } 
} 

对于问题没有2: 删除的条件格式此

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

Eval("IsActive") 

取代它现在复选框将被显示。

更新答: 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. 为了证明我的代码工作,我创建了一个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. 
+0

感谢您的帮助,但我收到此错误:对象引用未设置为对象的实例。 在行'isActive.Text =“Active或InActive”;' – 2012-07-15 07:38:09

+0

除此之外,它显示“Active或InActive”或复选框被选中或未选中。为什么? – 2012-07-15 07:39:27

+0

@TechLover你没有得到确切的参考。调试您的网站。并且该标签绑定到您的数据库列,因此如果在数据库中的值为true,则应显示Active或InActvie。 – 2012-07-15 09:27:30

0
  1. 它返回“真”或“假”,因为它是期望来自IsActive的布尔数据类型。如果你想改变它,我怀疑你需要在网格的ItemDataBound事件中有条件地修改它。
+0

请看看我更新的代码和问题? – 2012-07-16 07:06:00