C# 动态添加控件和按钮回发

C# 动态添加控件和按钮回发,c#,asp.net,C#,Asp.net,嗨,我的GridView有问题。 假设我创建了一个包含4列的GridView |姓名|姓氏|所有者|管理员| 所有者和管理员是可以包含复选框的列。 第二步:以某种方式填充网格。 第三步:根据一些奇怪的方法,我在owner和admin列上动态添加复选框。 四步:当我单击gridview下面的按钮时,click事件将读取选中了多少复选框,并将该数字传递给另一个方法 最后一步相当困难,因为所有复选框都会由于按钮的回发而消失。 我正在寻找从回发中保存复选框的方法 我可以在单击之后、回发之前调用方法吗?

嗨,我的GridView有问题。 假设我创建了一个包含4列的GridView

|姓名|姓氏|所有者|管理员|

所有者和管理员是可以包含复选框的列。 第二步:以某种方式填充网格。 第三步:根据一些奇怪的方法,我在owner和admin列上动态添加复选框。 四步:当我单击gridview下面的按钮时,click事件将读取选中了多少复选框,并将该数字传递给另一个方法

最后一步相当困难,因为所有复选框都会由于按钮的回发而消失。 我正在寻找从回发中保存复选框的方法

我可以在单击之后、回发之前调用方法吗? 我可以避免按钮的回发吗


PS:我不喜欢js解决方案

如果您在Page_Init中调用方法来动态添加复选框,它们在回发时不会被删除

您的问题不清楚为什么需要动态添加复选框控件,而您只需在GridView的RowDataBound事件中设置它们的状态服务器端。以下是一个将您的需求简化到最低限度的工作示例,以说明:

CheckboxGrid.aspx

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="gvResourceUsers" runat="server" AutoGenerateColumns="False" OnRowDataBound="gvResourceUsers_OnRowDataBound">
            <Columns>
                <asp:BoundField HeaderText="Name" DataField="Name"/>
                <asp:BoundField HeaderText="Surname" DataField="Surname"/>
                <asp:TemplateField HeaderText="Owner">
                    <ItemTemplate>
                        <asp:CheckBox ID="cbxOwner" runat="server"/>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Administrator">
                    <ItemTemplate>
                        <asp:CheckBox ID="cbxAdministrator" runat="server"/>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:Button runat="server" ID="btnSubmit" Text="Save" OnClick="btnSubmit_Click"/>
    </div>
    </form>
</body>
</html>
CheckboxGrid.aspx.cs

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

public partial class CheckboxGrid : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Get data and bind the grid
            gvResourceUsers.DataSource = GetData();
            gvResourceUsers.DataBind();
        }
    }

    protected void gvResourceUsers_OnRowDataBound(Object sender, GridViewRowEventArgs e)
    {
        //As each row is data-bound, set the checkbox state.
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var resourceUser = e.Row.DataItem as ResourceUser;
            var cbxOwner = e.Row.FindControl("cbxOwner") as CheckBox;
            var cbxAdministrator = e.Row.FindControl("cbxAdministrator") as CheckBox;

            cbxOwner.Checked = resourceUser.Owner;
            cbxAdministrator.Checked = resourceUser.Administrator;
        }
    }

    protected void btnSubmit_Click(Object sender, EventArgs e)
    {
        var resourceUsers = new List<ResourceUser>();

        //Iterate the gridview rows and populate the collection from the postback data.
        foreach (GridViewRow row in gvResourceUsers.Rows)
        {
            resourceUsers.Add(
                new ResourceUser
                {
                    Name = row.Cells[0].Text,
                    Surname = row.Cells[1].Text,
                    Owner = ((CheckBox)row.Cells[2].FindControl("cbxOwner")).Checked,
                    Administrator = ((CheckBox)row.Cells[3].FindControl("cbxAdministrator")).Checked
                });
        }
    }

    private IEnumerable<ResourceUser> GetData()
    {
        //We just create some data for demo purposes. Here you would normally populate the collection from your database.
        var resourceUsers = new List<ResourceUser>
            {
                new ResourceUser{Name = "Bob", Surname = "Taylor", Owner = true, Administrator = true },
                new ResourceUser{Name = "Ann",  Surname = "Carter", Owner = false, Administrator = true },
                new ResourceUser{Name = "Toni",  Surname = "Wong", Owner = false, Administrator = false}
            };

        return resourceUsers;
    }

    //A data view model to contain our view data for the grid
    private class ResourceUser
    {
        public String Name { get; set; }

        public String Surname { get; set; }

        public Boolean Owner { get; set; }

        public Boolean Administrator { get; set; }
    }
}

网格中填充了一个按钮事件,如果用户不单击按钮,网格将保持为空。是否可以不动态添加复选框?所以总是有复选框,你只是把它们隐藏起来?或者始终填充网格并仅在按钮上显示网格。按此复选框可添加基于姓名和姓氏的特定ID,如:复选框{ROWINDEX}{name}{LASTNAME}{COL}如果您将绑定到网格的方法放在Page_Init中,那么网格及其数据&网格必须在整个生命周期中保持静态,否则事情就会失控。如果数据是动态的,并且在绑定期间创建控件;网格和控件需要在每次回发时反弹/重新应用。听起来您需要注意何时单击加载网格的按钮,以便在回发时可以重新填充网格。