C# 选中后GridView上的复选框“丢失状态”

C# 选中后GridView上的复选框“丢失状态”,c#,asp.net,gridview,checkbox,C#,Asp.net,Gridview,Checkbox,我对GridView复选框有问题。 我为我的GridView添加了选择,每次我选择一行,在回发我的复选框后,它们的值都会丢失。有什么建议吗 添加页面加载 My GirdView: ---------------- <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:GridView ID="RulesGridView" runat="server" CellPadding

我对GridView复选框有问题。 我为我的GridView添加了选择,每次我选择一行,在回发我的复选框后,它们的值都会丢失。有什么建议吗

添加页面加载

My GirdView:
----------------
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="RulesGridView" runat="server" CellPadding="8" DataSourceID="RulesDataSource" ForeColor="#333333" GridLines="None" OnRowCreated="RulesGridView_RowCreated" OnSelectedIndexChanged="RulesGridView_SelectedIndexChanged" ViewStateMode="Enabled">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:TemplateField HeaderText="">
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" AutoPostBack="false" OnCheckedChanged="chkSelect_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
</Columns>

C# Code behind:
-------------------
  protected void RulesGridView_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Attributes["onmouseover"] =           "this.style.cursor='pointer';this.style.textDecoration='underline';";
                e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
                e.Row.ToolTip = "Click to select row";
                e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.RulesGridView, "Select$" + e.Row.RowIndex);
            }
        }
protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
            Session["RuleList"] = new List<Rule>();
            Session.Timeout = 180;
            //LstRules.Items.Clear();
            string folder = ConfigurationManager.AppSettings["MovieCreatorGUIRulesFolder"];
            XmlSerializer mySerializer = new XmlSerializer(typeof(List<Rule>));
            StreamReader reader = new StreamReader(folder + "\\DB" + txtdbnum.Text + "Rules.xml");
            List<Rule> RuleList = (List<Rule>)mySerializer.Deserialize(reader);
            reader.Close();
            Session["RuleList"] = RuleList;
        }
        ZoomInCommon.Users.UserInfo userInfo = PublishManager.GetCurrentYoutubeUser(-1);
        if (userInfo == null)
            txtYoutubeLoginUser.Text = "Not Logged In";
        else
            txtYoutubeLoginUser.Text = userInfo.DisplayName;
    }
MyGirdView:
----------------
C#代码隐藏:
-------------------
受保护的无效规则RIDVIEW_RowCreated(对象发送方,GridViewRowEventArgs e)
{
如果(e.Row.RowType==DataControlRowType.DataRow)
{
e、 Row.Attributes[“onmouseover”]=“this.style.cursor='pointer';this.style.textDecoration='underline';”;
e、 Row.Attributes[“onmouseout”]=“this.style.textDecoration='none';”;
e、 Row.ToolTip=“单击以选择行”;
e、 Row.Attributes[“onclick”]=this.Page.ClientScript.GetPostBackClientHyperlink(this.RulesGridView,“Select$”+e.Row.RowIndex);
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(Page.IsPostBack==false)
{
会话[“规则列表”]=新列表();
会话超时=180;
//LstRules.Items.Clear();
string folder=ConfigurationManager.AppSettings[“MovieCreatorGUIRulesFolder”];
XmlSerializer mySerializer=新的XmlSerializer(typeof(List));
StreamReader=新的StreamReader(文件夹+“\\DB”+txtdbnum.Text+“Rules.xml”);
列表规则列表=(列表)mySerializer.Deserialize(读取器);
reader.Close();
会话[“规则列表”]=规则列表;
}
ZoomInCommon.Users.UserInfo UserInfo=PublishManager.GetCurrentYoutubeUser(-1);
如果(userInfo==null)
txtyousubeloginuser.Text=“未登录”;
其他的
txtYoutubeLoginUser.Text=userInfo.DisplayName;
}

尝试包装初始化文本框的代码。在我看来,它只是在你发回时重新初始化控件

if (!Page.IsPostBack)
{
    //code that loads or builds your checkboxes
}

尝试启用回发:

   <asp:CheckBox ID="chkSelect" 
                  runat="server"  AutoPostBack="true" 
                  OnCheckedChanged="chkSelect_CheckedChanged" />

如果要在每个请求上对gridview进行数据绑定,则需要将复选框的状态保存在某个位置,并在数据绑定后立即恢复其以前的状态

更新 请参见下面的简约示例

HTML




页面代码隐藏

    IList<Person> _allPersons;

    protected void Page_Init(object sender, EventArgs e)
    {
        _allPersons = Helper.GetPersons();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            gv.DataSource = _allPersons;
            gv.DataBind();
        }
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        var selectedPersons = GetSelectedPersons();
        lblOutput.Text = string.Join(",", selectedPersons.Select(x => string.Format("{0} {1}", x.FirstName, x.LastName)));
    }

    private IList<Person> GetSelectedPersons()
    {
        var persons = new List<Person>();

        foreach (GridViewRow row in gv.Rows)
        {
            var chkSelect = row.FindControl("chkSelect") as CheckBox;
            var dataKey = row.FindControl("dataKey") as HiddenField;

            if (chkSelect != null && dataKey != null && chkSelect.Checked)
            {
                var person = _allPersons.FirstOrDefault(x => x.FirstName == dataKey.Value);

                if (person != null)
                    persons.Add(person);
            }
        }

        return persons;
    }
IList\u所有人;
受保护的无效页_Init(对象发送方,事件参数e)
{
_allPersons=Helper.GetPersons();
}
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
gv.DataSource=\u所有人;
gv.DataBind();
}
}
受保护的无效btn_单击(对象发送方,事件参数e)
{
var selectedPersons=GetSelectedPersons();
lblOutput.Text=string.Join(“,”,selectedPersons.Select(x=>string.Format(“{0}{1}”,x.FirstName,x.LastName));
}
私人IList GetSelectedPersons()
{
var persons=新列表();
foreach(gv.Rows中的GridViewRow行)
{
var chkSelect=row.FindControl(“chkSelect”)作为复选框;
var dataKey=row.FindControl(“dataKey”)作为HiddenField;
if(chkSelect!=null&&dataKey!=null&&chkSelect.Checked)
{
var person=_allPersons.FirstOrDefault(x=>x.FirstName==dataKey.Value);
if(person!=null)
人。添加(人);
}
}
返回人员;
}
最后,如果您好奇的话,还可以了解Person和data Helper的实现细节

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

public class Helper
{
    public static IList<Person> GetPersons()
    {
        return new List<Person>()
        {
            new Person(){FirstName = "Kanye", LastName ="West", Age = 33},
            new Person(){FirstName = "Justin", LastName ="Timberlake", Age = 18},
            new Person(){FirstName = "Celine", LastName ="Dion", Age = 38},
            new Person(){FirstName = "Samantha", LastName ="Jade", Age = 33},
            new Person(){FirstName = "Marshal", LastName ="Matters", Age = 35},
            new Person(){FirstName = "Armando", LastName ="Perez", Age = 14}
        };
    }
}
公共类人物
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共整数{get;set;}
}
公营助理员
{
公共静态IList GetPersons()
{
返回新列表()
{
新人(){FirstName=“Kanye”,LastName=“West”,年龄=33},
新人(){FirstName=“Justin”,LastName=“Timberlake”,年龄=18},
新人(){FirstName=“Celine”,LastName=“Dion”,年龄=38},
新人(){FirstName=“Samantha”,LastName=“Jade”,Age=33},
新人(){FirstName=“Marshal”,LastName=“Matters”,年龄=35},
新人(){FirstName=“Armando”,LastName=“Perez”,年龄=14}
};
}
}
希望它有意义


Leo

整个要点是,您不加载复选框控件的前一个状态。在postback.e.Row.Attributes[“onclick”]=this.Page.ClientScript.GetPostBackClientHyperlink(this.RulesGridView,“Select$”+e.Row.RowIndex)中保留它;我猜这一行会导致回发,但我不能用if(!Page.IsPostBack)将其包装起来,因为选择不起作用是的,这会导致回发-但这不是您需要处理它的地方。你能提供Page_Load或Page_Init方法的代码吗?听起来不错,但我如何获取复选框数据并重新恢复它?有很多方法可以实现这一点。不看你怎么把事情简单化就从我头上掉下来。您可以在选择发生时回发、保存值和任何其他处理。您还可以使用命令事件。您还可以使用javascript将值保存到隐藏字段等。如果您想要一个示例,我可以为您编写一些代码,但必须等到明天
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

public class Helper
{
    public static IList<Person> GetPersons()
    {
        return new List<Person>()
        {
            new Person(){FirstName = "Kanye", LastName ="West", Age = 33},
            new Person(){FirstName = "Justin", LastName ="Timberlake", Age = 18},
            new Person(){FirstName = "Celine", LastName ="Dion", Age = 38},
            new Person(){FirstName = "Samantha", LastName ="Jade", Age = 33},
            new Person(){FirstName = "Marshal", LastName ="Matters", Age = 35},
            new Person(){FirstName = "Armando", LastName ="Perez", Age = 14}
        };
    }
}