2017-10-17 1 views
1

Mon GridView a une case à cocher "Active", pour indiquer si l'enregistrement est actif ou non. C'est juste un drapeau, un peu de valeur dans la base de données.Comment mettre à jour des colonnes GridView spécifiques en fonction d'un CheckBox dans une colonne

J'ai besoin de mettre à jour les champs "ActivatedBy" et "DeactivatedBy" lorsqu'un utilisateur vérifie ou décoche le CheckBox (en mode d'édition).

Je suis en train de mettre à jour le champ "UpdatedBy" à chaque mise à jour d'une ligne, en le remplissant avec @UserName. Mais, je ne sais pas comment mettre à jour par programme les champs ActivatedBy ou DeactivatedBy uniquement lorsque le CheckBox est coché ou décoché respectivement. C'est juste pour enregistrer qui change la case à cocher (@UserName est le paramètre de travail).

Veuillez supposer que j'ai besoin de détails pour moi. Je fais. ;-) J'apprends juste C# et GridViews sont mon fléau. Je vous remercie!

<%@ 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()); 
    } 
} 

Répondre

0

Voici comment je le ferais. Ajoutez d'abord un TemplateField à votre GridView pour contenir le CheckBox et ajouter un événement OnCheckedChanged à la CheckBox et définir AutoPostBack à true. Ensuite, définissez DataKeyNames dans GridView. La valeur doit être l'index ou l'identifiant de votre base de données. Dans votre cas probablement programid. Le GridView résultant ressemblerait à ceci.

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

Ensuite, dans le code derrière la méthode CheckBox1_CheckedChanged.

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); 
     } 
    } 
} 
+0

Merci, VDWWD! Cela aide beaucoup. Je dois également enregistrer "Désactivé par" en plus de "Activé par", mais je pense que je peux comprendre les conditions pour cela avec ce que vous m'avez donné. Je vais mettre en place cette partie et revenir et accepter votre réponse si je ne rencontre pas de questions. –

+0

Oh, j'ai toutes les modifications, ainsi que les insertions faites dans un formulaire, ne montrant pas le bouton Edit LinkButton dans GridView. Je suppose que c'est exactement pareil, cependant. ... ajouter un TemplateField au FormView ... –

+0

Oh, en fait c'est plus facile que ça ... le FormView a déjà son EditItemTemplate :-) Hmmm, il semblerait que le code derrière nécessitera des changements significatifs, cependant. ... travailler dessus ... –

0
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