【问题标题】:CheckBox On GridView Lose State after selectionCheckBox On GridView 选择后丢失状态
【发布时间】:2013-12-29 13:47:33
【问题描述】:

我对 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;
    }

【问题讨论】:

    标签: c# asp.net gridview checkbox


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,重点是您没有加载复选框控件的先前状态。您将其留在回发中。
    • e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.RulesGridView, "Select$" + e.Row.RowIndex);我猜这行会导致回发,但我不能用 if (!Page.IsPostBack) 包装它,因为选择不起作用
    • 是的,这会导致回发——但这不是您需要处理的地方。您能否提供 Page_Load 或 Page_Init 方法的代码?
    【解决方案2】:

    尝试启用 PostBack:

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

    【讨论】:

      【解决方案3】:

      如果您在每个请求上都对您的 gridview 进行数据绑定,那么您需要将复选框的状态保存在某处,并在数据绑定后尽快恢复它们之前的状态

      更新

      请参阅下面的简约示例

      HTML

      <asp:Label ID="lblOutput" runat="server"></asp:Label>
      
      <br /><br />
      
      <asp:Button ID="btn" runat="server" Text="PostBack" OnClick="btn_Click" />
      
      <asp:GridView ID="gv" runat="server" AutoGenerateColumns="false" DataKeyNames="FirstName">
          <AlternatingRowStyle BackColor="White" />
          <Columns>
              <asp:TemplateField HeaderText="">
                  <ItemTemplate>
                      <asp:HiddenField ID="dataKey" runat="server" Value='<%# Eval("FirstName") %>' />
                  <asp:CheckBox ID="chkSelect" runat="server" />
                  </ItemTemplate>
              </asp:TemplateField>
              <asp:BoundField DataField="FirstName" HeaderText="First name" />
              <asp:BoundField DataField="LastName" HeaderText="Last name" />
              <asp:BoundField DataField="Age" HeaderText="Age" />
              </Columns>
      </asp:GridView>
      

      页面代码隐藏

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

      最后,如果你好奇的话,Person 和数据 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}
              };
          }
      }
      

      希望有意义

      狮子座

      【讨论】:

      • 听起来不错,但我如何获取复选框数据并重新启用它?
      • 有很多方法可以实现这一目标。没有看你是如何实现的,我就在我的头上。您可以在选择发生时回发,保存值和任何其他处理。您也可以使用命令事件。您还可以使用 javascript 将值保存到隐藏字段等。
      • 如果你想要一个例子,我可以为你编写一些代码,但必须等到明天
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多