How can I UPDATE specific GridView columns based on a CheckBox in one column

My GridView has an “Active” CheckBox, to indicate whether the record is active or not. It’s just a flag, a bit value in the database.

I need to UPDATE the “ActivatedBy” and “DeactivatedBy” fields when a user checks or unchecks the CheckBox (in edit mode).

I’m currently updating the “UpdatedBy” field every time a row is updated, filling it with @UserName.

But, I don’t know how to programatically update either the ActivatedBy or DeactivatedBy fields only when the CheckBox is checked or unchecked respectively. This is just to record who changes the checkbox (@UserName is the working parameter).

Please assume I need the details spelled out for me. I do. 😉 I’m just learning C# and GridViews are my bane. Thank you!

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Admin.aspx.cs" Inherits="Admin" MaintainScrollPositionOnPostback="true" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title>Admin</title>
    <style>
        body {
            font-family:Arial;
            font-size:12px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="programid" DataSourceID="ITAAdminSqlDataSource" ForeColor="#333333" GridLines="None">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:CommandField ShowEditButton="True" ShowSelectButton="True" />
                <asp:BoundField DataField="programid" HeaderText="programid" InsertVisible="False" ReadOnly="True" SortExpression="programid" Visible="False" />
                <asp:BoundField DataField="OccGroup" HeaderText="Occ Group" SortExpression="OccGroup" />
                <asp:BoundField DataField="Provider" HeaderText="Provider" SortExpression="Provider" />
                <asp:BoundField DataField="Program" HeaderText="Program" SortExpression="Program" />
                <asp:BoundField DataField="OnetCode" HeaderText="Onet Code" SortExpression="OnetCode" />
                <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="Telephone" HeaderText="Telephone" SortExpression="Telephone" >
                <ItemStyle Wrap="False" />
                </asp:BoundField>
                <asp:BoundField DataField="TuitionCosts" DataFormatString="{0:c}" HeaderText="Tuition" HtmlEncode="False" SortExpression="TuitionCosts" />
                <asp:BoundField DataField="OtherCosts" DataFormatString="{0:c}" HeaderText="Other Costs" HtmlEncode="False" SortExpression="OtherCosts" />
                <asp:BoundField DataField="SpecialConditions" HeaderText="Special Conditions" SortExpression="SpecialConditions" />
                <asp:BoundField DataField="Credential" HeaderText="Credential" SortExpression="Credential" />
                <asp:CheckBoxField DataField="Active" HeaderText="Active" SortExpression="Active" />
                <asp:BoundField DataField="DateEntered" DataFormatString="{0:d}" HeaderText="Date Entered" HtmlEncode="False" SortExpression="DateEntered" />
                <asp:BoundField DataField="EnteredBy" HeaderText="Entered By" SortExpression="EnteredBy" />
                <asp:BoundField DataField="DateUpdated" DataFormatString="{0:d}" HeaderText="Date Updated" HtmlEncode="False" SortExpression="DateUpdated" />
                <asp:BoundField DataField="UpdatedBy" HeaderText="Updated By" SortExpression="UpdatedBy" />
                <asp:BoundField DataField="DateActivated" DataFormatString="{0:d}" HeaderText="Date Activated" HtmlEncode="False" SortExpression="DateActivated" />
                <asp:BoundField DataField="ActivatedBy" HeaderText="Activated By" SortExpression="ActivatedBy" />
                <asp:BoundField DataField="DateDeactivated" DataFormatString="{0:d}" HeaderText="Date Deactivated" HtmlEncode="False" SortExpression="DateDeactivated" />
                <asp:BoundField DataField="DeactivatedBy" HeaderText="Deactivated By" SortExpression="DeactivatedBy" />
            </Columns>
            <EditRowStyle BackColor="Tomato" />
            <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" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F5F7FB" />
            <SortedAscendingHeaderStyle BackColor="#6D95E1" />
            <SortedDescendingCellStyle BackColor="#E9EBEF" />
            <SortedDescendingHeaderStyle BackColor="#4870BE" />
        </asp:GridView>
        <asp:SqlDataSource ID="ITAAdminSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:ITAAdminConnectionString %>" 
            DeleteCommand="DELETE FROM [programs] WHERE [programid] = @programid" 
            InsertCommand="INSERT INTO [programs] ([OccGroup], [Provider], [Program], [OnetCode], [Address], [City], [Telephone], [TuitionCosts], [OtherCosts], [SpecialConditions], [Credential], [Active], [DateEntered], [EnteredBy], [DateUpdated], [UpdatedBy], [DateActivated], [ActivatedBy], [DateDeactivated], [DeactivatedBy]) VALUES (@OccGroup, @Provider, @Program, @OnetCode, @Address, @City, @Telephone, @TuitionCosts, @OtherCosts, @SpecialConditions, @Credential, @Active, @DateEntered, @EnteredBy, @DateUpdated, @UpdatedBy, @DateActivated, @ActivatedBy, @DateDeactivated, @DeactivatedBy)" 
            SelectCommand="SELECT [programid], [OccGroup], [Provider], [Program], [OnetCode], [Address], [City], [Telephone], [TuitionCosts], [OtherCosts], [SpecialConditions], [Credential], [Active], [DateEntered], [EnteredBy], [DateUpdated], [UpdatedBy], [DateActivated], [ActivatedBy], [DateDeactivated], [DeactivatedBy] FROM [programs] ORDER BY [Provider], [Program]" 
            UpdateCommand="UPDATE [programs] SET [OccGroup] = @OccGroup, [Provider] = @Provider, [Program] = @Program, [OnetCode] = @OnetCode, [Address] = @Address, [City] = @City, [Telephone] = @Telephone, [TuitionCosts] = @TuitionCosts, [OtherCosts] = @OtherCosts, [SpecialConditions] = @SpecialConditions, [Credential] = @Credential, [Active] = @Active, [DateEntered] = @DateEntered, [EnteredBy] = @EnteredBy, [DateUpdated] = GETDATE(), [UpdatedBy] = @UserName, [DateActivated] = @DateActivated, [ActivatedBy] = @ActivatedBy, [DateDeactivated] = @DateDeactivated, [DeactivatedBy] = @DeactivatedBy WHERE [programid] = @programid">
            <DeleteParameters>
                <asp:Parameter Name="programid" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="OccGroup" Type="String" />
                <asp:Parameter Name="Provider" Type="String" />
                <asp:Parameter Name="Program" Type="String" />
                <asp:Parameter Name="OnetCode" Type="Int32" />
                <asp:Parameter Name="Address" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="Telephone" Type="String" />
                <asp:Parameter Name="TuitionCosts" Type="Decimal" />
                <asp:Parameter Name="OtherCosts" Type="Decimal" />
                <asp:Parameter Name="SpecialConditions" Type="String" />
                <asp:Parameter Name="Credential" Type="String" />
                <asp:Parameter Name="Active" Type="Boolean" />
                <asp:Parameter DbType="Date" Name="DateEntered" />
                <asp:Parameter Name="EnteredBy" Type="String" />
                <asp:Parameter DbType="Date" Name="DateUpdated" />
                <asp:Parameter Name="UpdatedBy" Type="String" />
                <asp:Parameter Name="username" Type="String" DefaultValue="Anonymous" /> <%-- username parameter filled in Page_Init. use @username instead of UpdatedBy, ActivatedBy, etc. --%>
                <asp:Parameter DbType="Date" Name="DateActivated" />
                <asp:Parameter Name="ActivatedBy" Type="String" />
                <asp:Parameter DbType="Date" Name="DateDeactivated" />
                <asp:Parameter Name="DeactivatedBy" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="OccGroup" Type="String" />
                <asp:Parameter Name="Provider" Type="String" />
                <asp:Parameter Name="Program" Type="String" />
                <asp:Parameter Name="OnetCode" Type="Int32" />
                <asp:Parameter Name="Address" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="Telephone" Type="String" />
                <asp:Parameter Name="TuitionCosts" Type="Decimal" />
                <asp:Parameter Name="OtherCosts" Type="Decimal" />
                <asp:Parameter Name="SpecialConditions" Type="String" />
                <asp:Parameter Name="Credential" Type="String" />
                <asp:Parameter Name="Active" Type="Boolean" />
                <asp:Parameter DbType="Date" Name="DateEntered" />
                <asp:Parameter Name="EnteredBy" Type="String" />
                <asp:Parameter DbType="Date" Name="DateUpdated" />
                <asp:Parameter Name="UpdatedBy" Type="String" />
                <asp:Parameter Name="username" Type="String" DefaultValue="Anonymous" /> <%-- username parameter filled in Page_Init. use @username instead of UpdatedBy, ActivatedBy, etc. --%>
                <asp:Parameter DbType="Date" Name="DateActivated" />
                <asp:Parameter Name="ActivatedBy" Type="String" />
                <asp:Parameter DbType="Date" Name="DateDeactivated" />
                <asp:Parameter Name="DeactivatedBy" Type="String" />
                <asp:Parameter Name="programid" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>


using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Admin : System.Web.UI.Page
{
    protected string ClearDomain(string sItem) //Format username without domain
    {
        int sLoc = (sItem.IndexOf("\\") + 1);
        string sOutPut;
        sOutPut = sItem.Substring(sLoc);
        return sOutPut;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        //string usr;
        //usr = ClearDomain(User.Identity.Name.ToString());
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        ITAAdminSqlDataSource.InsertParameters["UserName"].DefaultValue = ClearDomain(User.Identity.Name.ToString());
        ITAAdminSqlDataSource.UpdateParameters["UserName"].DefaultValue = ClearDomain(User.Identity.Name.ToString());
    }
}

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

This is how I would do it. First add an TemplateField to your GridView to hold the CheckBox and add a OnCheckedChanged event to the CheckBox and set AutoPostBack to true. Then set the DataKeyNames in the GridView. The value should be your database index or identifier. In your case probably programid. The resulting GridView would look like this.

<asp:GridView ID="GridView1" runat="server" DataKeyNames="programid">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox ID="CheckBox1" runat="server"
                    Checked='<%# Convert.ToBoolean(Eval("sold")) %>'
                    OnCheckedChanged="CheckBox1_CheckedChanged" AutoPostBack="true" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Then in code behind the CheckBox1_CheckedChanged method.

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
    //get the current datagrid item from the sender
    GridViewRow row = (GridViewRow)(((Control)sender).NamingContainer);

    //get the correct programid from the datakeys
    int programid = Convert.ToInt32(GridView1.DataKeys[row.DataItemIndex].Values[0]);

    //cast the sender back to a checkbox
    CheckBox cb = sender as CheckBox;

    //create the sql string
    string sqlString = "UPDATE programs SET ActivatedBy = @ActivatedBy WHERE (programid = @programid)";

    //create a connection to the db and a command
    using (SqlConnection connection = new SqlConnection(myConnectionString))
    using (SqlCommand command = new SqlCommand(sqlString, connection))
    {
        //set the proper command type
        command.CommandType = CommandType.Text;

        //replace the parameters
        command.Parameters.Add("@ActivatedBy", SqlDbType.Bit).Value = cb.Checked;
        command.Parameters.Add("@programid", SqlDbType.Int).Value = programid;

        try
        {
            //open the db and execute the sql string
            connection.Open();
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            //catch any errors like unable to open db or errors in command. view with ex.Message
            Response.Write(ex.Message);
        }
    }
}

Solution 2

I need a Status column in database which contains 1,0 for representing Employee's Status "Active" and "Inactive" respectively. I want edit this record through front-end,having grid-view, and want to perform on GridView's update event, after clicking on Edit Button. I have a TemplateField having header-text "Status". I am unable to update changed value of checkbox.

Moreover, if will get checked or unchecked CheckBox on the basis of value stored in database, if it is 0 then CheckBox will be uncheked, otherwise will be checked. If user click on edit button, and then check or uncheck any Check-box, then on the basis of this, value should be updated in database.

DataBase:-

CREATE TABLE [dbo].[Employee](
    [Employee_ID] [int] IDENTITY(1,1) NOT NULL,
    [Employee_Name] [varchar](50) NULL,
    [Employee_Address] [varchar](100) NULL,
    [Emp_Status] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [Employee_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON

Front-End:-

Mark-up:

        <asp:GridView ID="GV_Product" runat="server" BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Vertical" AutoGenerateColumns="false" ShowFooter="true" OnRowEditing="GV_Product_RowEditing" OnRowUpdating="GV_Product_RowUpdating" OnRowDeleting="GV_Product_RowDeleting" OnRowCancelingEdit="GV_Product_RowCancelingEdit" OnRowCommand="GV_Product_RowCommand" AllowPaging="true" PageSize="5" OnPageIndexChanging="GV_Product_PageIndexChanging">
                            <AlternatingRowStyle BackColor="Gainsboro" />

                            <Columns>
                                <asp:TemplateField HeaderText="Employee ID">
                                    <ItemTemplate>
                                        <asp:Label ID="lbl_ID" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Employee_ID") %>'></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Employee Name">
                                  <ItemTemplate>
                                      <asp:TextBox ID="txt_Name" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Employee_Name") %>'></asp:TextBox>
                                  </ItemTemplate>

                                    <EditItemTemplate>
                                        <asp:TextBox ID="txtEdit_Name" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Employee_Name") %>'></asp:TextBox>
                                    </EditItemTemplate>

                                    <FooterTemplate>
                                        <asp:TextBox ID="txtAdd_Name" runat="server"></asp:TextBox>
                                        <%--<asp:RequiredFieldValidator ID="txtName" runat="server" ControlToValidate="txtAdd_Name" ErrorMessage="Please enter Employee Name"></asp:RequiredFieldValidator>--%>
                                    </FooterTemplate>

                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Employee Address">
                                    <ItemTemplate>
                                        <asp:TextBox ID="txt_Address" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Employee_Address") %>'></asp:TextBox>
                                    </ItemTemplate>

                                    <EditItemTemplate>
                                        <asp:TextBox ID="txtEdit_Address" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Employee_Address") %>'></asp:TextBox>
                                    </EditItemTemplate>

                                    <FooterTemplate>
                                        <asp:TextBox ID="txtAdd_Address" runat="server"></asp:TextBox>
                                    </FooterTemplate>
                                </asp:TemplateField>

                                <asp:TemplateField HeaderText="Action">
                                    <ItemTemplate>
                                        <asp:Button ID="btnEdit" runat="server" Text="Edit" CommandName="Edit" />
                                        <asp:Button ID="btnDelete" runat="server" Text="Delete" CommandName="Delete" OnClientClick="return confirm('Are you sure you want to delete this record?')" />

                                    </ItemTemplate> 

                                    <EditItemTemplate>
                                        <asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" />
                                        <asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" />
                                    </EditItemTemplate>

                                    <FooterTemplate>
                                        <asp:LinkButton ID="lblAdd" runat="server" Width="100px" Text="Add" CommandName="ADD"></asp:LinkButton>
                                    </FooterTemplate>
                                </asp:TemplateField>

                                <asp:TemplateField HeaderText="Status">
                                    <ItemTemplate>
                                        <asp:CheckBox ID="ChkBox" runat="server" Checked='<%# GetStatus(DataBinder.Eval(Container.DataItem,"Emp_Status").ToString() )%>' />
                                    </ItemTemplate>

                                    <EditItemTemplate>
                                        <asp:CheckBox ID="EditChkBox" runat="server" Checked='<%# GetStatus(DataBinder.Eval(Container.DataItem,"Emp_Status").ToString() )%>'/>
                                        <%--<asp:CheckBoxList ID="ChkBoxList" runat="server">
                                            <asp:ListItem>1</asp:ListItem>
                                        </asp:CheckBoxList>--%>
                                    </EditItemTemplate>
                                </asp:TemplateField>


                            </Columns>


     <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
                        <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
                        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
                        <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
                        <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
                        <SortedAscendingCellStyle BackColor="#F1F1F1" />
                        <SortedAscendingHeaderStyle BackColor="#0000A9" />
                        <SortedDescendingCellStyle BackColor="#CAC9C9" />
                        <SortedDescendingHeaderStyle BackColor="#000065" />
                    </asp:GridView>

Code:

protected bool GetStatus(string str)
    {
        if (str=="1")
        {
            return true;
        }

        else
        {
            return false;
        }
    }

I am getting Error:- 

An exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll but was not handled in user code

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply