так как вы не можете использовать первые две строки моего фрагмента. Но, возможно, formview также использует DataKeys (я никогда не использую formview)

ridView имеет «Активный» флажок, чтобы указать, активна ли запись. Это просто флаг, битовое значение в базе данных.

Мне нужно ОБНОВИТЬ поля «ActivatedBy» и «DeactivationBy», когда пользователь проверяет или снимает флажок CheckBox (в режиме редактирования).

В настоящее время я обновляю поле «updatedBy» каждый раз, когда обновляется строка, заполняя его @UserName.

Но я не знаю, как программно обновлять поля ActivatedBy или DeactivationBy, только когда CheckBox отмечен или не отмечен соответственно. Это просто для записи, кто меняет флажок (@UserName является рабочим параметром).

Пожалуйста, предположите, что мне нужны подробности, изложенные для меня. Я делаю. ;-) Я только учусь C #, и GridViews моя проклятие. Спасибо!

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

Ответы на вопрос(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
Решение Вопроса

Вот как бы я это сделал. Сначала добавьтеTemplateField к вашему GridView, чтобы держать CheckBox и добавитьOnCheckedChanged событие в CheckBox и установитьAutoPostBack к истине. Затем установитеDataKeyNames в GridView. Значение должно быть индексом вашей базы данных или идентификатором. В твоем случае наверноеprogramid, Результирующий GridView будет выглядеть следующим образом.

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

Тогда в коде позади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);
        }
    }
}
 David Megnin18 окт. 2017 г., 17:38
О, на самом деле это проще, чем это ... FormView уже имеет свой EditItemTemplate :-) Хммм, похоже, что код позади потребует некоторых существенных изменений, хотя. ...работаю над этим...
 David Megnin18 окт. 2017 г., 17:29
О, у меня есть все правки, а также вставки, сделанные в FormView, не отображающие кнопку Edit LinkButton в GridView. Я предполагаю, что это точно так же, хотя. ... добавить TemplateField в FormView ...
 David Megnin18 окт. 2017 г., 17:42
Извините за переключение на проблемы с FormView; Я не понимал, что мне придется работать над этим с этой точки зрения. Я учусь...
 VDWWD18 окт. 2017 г., 17:44
Нет проблем. Код будет почти таким же. Разница лишь в том, как получить правильныйprogramid так как вы не можете использовать первые две строки моего фрагмента. Но, возможно, formview также использует DataKeys (я никогда не использую formview)
 David Megnin18 окт. 2017 г., 14:26
Спасибо, VDWWD! Это очень помогает. Мне также нужно войти в «DeactivatiedBy» в дополнение к «ActivatedBy», но я думаю, что могу выяснить условия для этого с тем, что вы мне дали. Я настрою эту часть и вернусь и приму ваш ответ, если не буду сталкиваться с какими-либо вопросами.

Ваш ответ на вопрос