repeater里checkbox值问题

时间:2021-07-29 09:52:09
repeater用checkbox全选,repeater外的LinkButton执行删除,代码如下:
 /// <summary> 

    ///批量删除
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lbtnDel_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < this.rptList.Items.Count; i++)
        {
            CheckBox cb = (CheckBox)rptList.Items[i].FindControl("cb_id");
            int id = Convert.ToInt32(((Label)rptList.Items[i].FindControl("lb_id")).Text);

            if (cb.Checked)
            {

                string str = "delete from T_News where Nid=" + id;
                DbHelper.NoResultCommand(str);
            }

            else
            {
                Response.Write("没有选中文本");
            }
        }
        PageCountBind(1, drNewsCatList.SelectedValue);
    }
执行删除事件之后,发现删除不了,直接进else语句
调试发现:checkbox的值一直是false,i,id可以循环到值
进一步调试发现,当执行删除事件之前都要先执行pageload里的事件,但是pageload里面已经!IsPostBack了

求指教

16 个解决方案

#1


任何后台事件执行之前都会进pageload的,想要只在初始化使用一次就加上 !ispostback 判断

#2


初步估计 你在执行删除事件时又重新将repeater 初始化了,那样checkbox 很可能复原了

#3


PageCountBind(1, drNewsCatList.SelectedValue);
你这个地方多次使用到了吧。。估计是这里的问题。应该只需要绑定一次就可以了。

#4


你是不是又重新给repeater做databind了?

#5


引用 4 楼  的回复:
你是不是又重新给repeater做databind了?

没有啊,pageload里面
if(!ispostback)
{
 调用数据绑定
}
下面的绑定是数据变化时重新绑定啊

#6


你需要这样

 EnableViewState="true"是必须的

<%@ Page Language="C#"  EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  protected void Page_Load(object sender, EventArgs e)
  {
    System.Data.DataTable dt = new System.Data.DataTable();
    if (!Page.IsPostBack)
    {
      System.Data.DataRow dr;
      dt.Columns.Add(new System.Data.DataColumn("Id", typeof(System.Int32)));
      dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));
      for (int i = 0; i < 6; i++)
      {
        dr = dt.NewRow();
        dr[0] = i;
        dr[1] = "【孟子E章】" + i.ToString();
        dt.Rows.Add(dr);
      }
      rptList.DataSource = dt;
      rptList.DataBind();
    }
  }

  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    bool hasChecked = false;
    for (int i = 0; i < this.rptList.Items.Count; i++)
    {
      CheckBox cb = (CheckBox)rptList.Items[i].FindControl("cb_id");
      int id = Convert.ToInt32(((Label)rptList.Items[i].FindControl("lb_id")).Text);
      if (cb.Checked)
      {
        Response.Write("<li> delete from T_News where Nid=" + id);
        hasChecked = true;
        //DbHelper.NoResultCommand(str);
      }
    }
    if (!hasChecked)
    {
      Response.Write("没有选中文本");
    }
    else
    {
      //Response.Redirect(Request.UrlReferrer.ToString());
    }
  }
</script>
<body>
  <form id="form1" runat="server">
  <asp:Repeater ID="rptList" runat="server">
    <ItemTemplate>
      <div><asp:CheckBox ID="cb_id" runat="server" /><asp:Label ID="lb_id" runat="server" Text='<%#Eval("Id") %>'></asp:Label>  <%#Eval("Name") %></div>
    </ItemTemplate>
  </asp:Repeater>
  <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">删除</asp:LinkButton>
  </form>
</body>

#7


谢谢楼上回复,你的方法还没用,不过问题暂时解决了,
把全选的js代码禁用了,然后就可以实现了,再用Js进行全选,结果JS不能用了,删除可以用了

#8


本帖最后由 net_lover 于 2012-06-12 16:02:36 编辑
是你代码没写好,js也是可以的

<%@ Page Language="C#" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  protected void Page_Load(object sender, EventArgs e)
  {
    xx.InputAttributes.Add("onclick", "SelectAll(this)");
    System.Data.DataTable dt = new System.Data.DataTable();
    if (!Page.IsPostBack)
    {
      System.Data.DataRow dr;
      dt.Columns.Add(new System.Data.DataColumn("Id", typeof(System.Int32)));
      dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));
      for (int i = 0; i < 6; i++)
      {
        dr = dt.NewRow();
        dr[0] = i;
        dr[1] = "【孟子E章】" + i.ToString();
        dt.Rows.Add(dr);
      }
      rptList.DataSource = dt;
      rptList.DataBind();
    }
  }

  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    bool hasChecked = false;
    for (int i = 0; i < this.rptList.Items.Count; i++)
    {
      CheckBox cb = (CheckBox)rptList.Items[i].FindControl("cb_id");
      int id = Convert.ToInt32(((Label)rptList.Items[i].FindControl("lb_id")).Text);
      if (cb.Checked)
      {
        Response.Write("<li> delete from T_News where Nid=" + id);
        hasChecked = true;
        //DbHelper.NoResultCommand(str);
      }
    }
    if (!hasChecked)
    {
      Response.Write("没有选中文本");
    }
    else
    {
      //Response.Redirect(Request.UrlReferrer.ToString());
    }
  }
</script>
<script type="text/javascript">
  function SelectAll(chkBox) {
    s = document.getElementsByTagName("input");
    for (i = 0; i < s.length; i++) {
      if (s[i].type == "checkbox" && s[i].id && s[i].id.indexOf("cb_id") > -1) {
        s[i].checked = chkBox.checked;
      }
    }
  }
</script>
<body>
  <form id="form1" runat="server">
  <asp:Repeater ID="rptList" runat="server">
    <ItemTemplate>
      <div>
        <asp:CheckBox ID="cb_id" runat="server" /><asp:Label ID="lb_id" runat="server" Text='<%#Eval("Id") %>'></asp:Label>
        <%#Eval("Name") %></div>
    </ItemTemplate>
  </asp:Repeater>
  <asp:CheckBox ID="xx" runat="server" Text="全选" />
  <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">删除</asp:LinkButton>
  </form>
</body>

#9


现在想调试JS呢,结果Js死活不能调用,怎么办

#10


去掉IE选项中的禁止脚本调试,然后重启浏览器才可以

#11


好的,先谢谢

#12


还是不行,启用之后,IE看个csdn都一堆报错
刚用firefox测试了一下,跟IE一样,js全选还是不能用,刚把你js粘贴上去也不能用

#13


你的JS代码不能用啊!
http://topic.csdn.net/u/20110525/13/8cb7c16a-a05f-469b-be0c-8c98a1cfeee3.html
上面文章的JS可以用,但是明明全选了但是只能删除一个

#14


我的代码都是测试过的,怎么不能用了?

你是自己该的还是完全拷贝粘贴我的测试的?:

#15


完全拷贝的,就把Js代码以及checkbox复制的

#16


全选删除自己实现了,具体解决方法http://topic.csdn.net/u/20120613/19/14bf421d-5a86-484b-af79-ba40fff2e183.html,再次感谢大家的热心帮助

#1


任何后台事件执行之前都会进pageload的,想要只在初始化使用一次就加上 !ispostback 判断

#2


初步估计 你在执行删除事件时又重新将repeater 初始化了,那样checkbox 很可能复原了

#3


PageCountBind(1, drNewsCatList.SelectedValue);
你这个地方多次使用到了吧。。估计是这里的问题。应该只需要绑定一次就可以了。

#4


你是不是又重新给repeater做databind了?

#5


引用 4 楼  的回复:
你是不是又重新给repeater做databind了?

没有啊,pageload里面
if(!ispostback)
{
 调用数据绑定
}
下面的绑定是数据变化时重新绑定啊

#6


你需要这样

 EnableViewState="true"是必须的

<%@ Page Language="C#"  EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  protected void Page_Load(object sender, EventArgs e)
  {
    System.Data.DataTable dt = new System.Data.DataTable();
    if (!Page.IsPostBack)
    {
      System.Data.DataRow dr;
      dt.Columns.Add(new System.Data.DataColumn("Id", typeof(System.Int32)));
      dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));
      for (int i = 0; i < 6; i++)
      {
        dr = dt.NewRow();
        dr[0] = i;
        dr[1] = "【孟子E章】" + i.ToString();
        dt.Rows.Add(dr);
      }
      rptList.DataSource = dt;
      rptList.DataBind();
    }
  }

  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    bool hasChecked = false;
    for (int i = 0; i < this.rptList.Items.Count; i++)
    {
      CheckBox cb = (CheckBox)rptList.Items[i].FindControl("cb_id");
      int id = Convert.ToInt32(((Label)rptList.Items[i].FindControl("lb_id")).Text);
      if (cb.Checked)
      {
        Response.Write("<li> delete from T_News where Nid=" + id);
        hasChecked = true;
        //DbHelper.NoResultCommand(str);
      }
    }
    if (!hasChecked)
    {
      Response.Write("没有选中文本");
    }
    else
    {
      //Response.Redirect(Request.UrlReferrer.ToString());
    }
  }
</script>
<body>
  <form id="form1" runat="server">
  <asp:Repeater ID="rptList" runat="server">
    <ItemTemplate>
      <div><asp:CheckBox ID="cb_id" runat="server" /><asp:Label ID="lb_id" runat="server" Text='<%#Eval("Id") %>'></asp:Label>  <%#Eval("Name") %></div>
    </ItemTemplate>
  </asp:Repeater>
  <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">删除</asp:LinkButton>
  </form>
</body>

#7


谢谢楼上回复,你的方法还没用,不过问题暂时解决了,
把全选的js代码禁用了,然后就可以实现了,再用Js进行全选,结果JS不能用了,删除可以用了

#8


本帖最后由 net_lover 于 2012-06-12 16:02:36 编辑
是你代码没写好,js也是可以的

<%@ Page Language="C#" EnableViewState="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  protected void Page_Load(object sender, EventArgs e)
  {
    xx.InputAttributes.Add("onclick", "SelectAll(this)");
    System.Data.DataTable dt = new System.Data.DataTable();
    if (!Page.IsPostBack)
    {
      System.Data.DataRow dr;
      dt.Columns.Add(new System.Data.DataColumn("Id", typeof(System.Int32)));
      dt.Columns.Add(new System.Data.DataColumn("Name", typeof(System.String)));
      for (int i = 0; i < 6; i++)
      {
        dr = dt.NewRow();
        dr[0] = i;
        dr[1] = "【孟子E章】" + i.ToString();
        dt.Rows.Add(dr);
      }
      rptList.DataSource = dt;
      rptList.DataBind();
    }
  }

  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    bool hasChecked = false;
    for (int i = 0; i < this.rptList.Items.Count; i++)
    {
      CheckBox cb = (CheckBox)rptList.Items[i].FindControl("cb_id");
      int id = Convert.ToInt32(((Label)rptList.Items[i].FindControl("lb_id")).Text);
      if (cb.Checked)
      {
        Response.Write("<li> delete from T_News where Nid=" + id);
        hasChecked = true;
        //DbHelper.NoResultCommand(str);
      }
    }
    if (!hasChecked)
    {
      Response.Write("没有选中文本");
    }
    else
    {
      //Response.Redirect(Request.UrlReferrer.ToString());
    }
  }
</script>
<script type="text/javascript">
  function SelectAll(chkBox) {
    s = document.getElementsByTagName("input");
    for (i = 0; i < s.length; i++) {
      if (s[i].type == "checkbox" && s[i].id && s[i].id.indexOf("cb_id") > -1) {
        s[i].checked = chkBox.checked;
      }
    }
  }
</script>
<body>
  <form id="form1" runat="server">
  <asp:Repeater ID="rptList" runat="server">
    <ItemTemplate>
      <div>
        <asp:CheckBox ID="cb_id" runat="server" /><asp:Label ID="lb_id" runat="server" Text='<%#Eval("Id") %>'></asp:Label>
        <%#Eval("Name") %></div>
    </ItemTemplate>
  </asp:Repeater>
  <asp:CheckBox ID="xx" runat="server" Text="全选" />
  <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">删除</asp:LinkButton>
  </form>
</body>

#9


现在想调试JS呢,结果Js死活不能调用,怎么办

#10


去掉IE选项中的禁止脚本调试,然后重启浏览器才可以

#11


好的,先谢谢

#12


还是不行,启用之后,IE看个csdn都一堆报错
刚用firefox测试了一下,跟IE一样,js全选还是不能用,刚把你js粘贴上去也不能用

#13


你的JS代码不能用啊!
http://topic.csdn.net/u/20110525/13/8cb7c16a-a05f-469b-be0c-8c98a1cfeee3.html
上面文章的JS可以用,但是明明全选了但是只能删除一个

#14


我的代码都是测试过的,怎么不能用了?

你是自己该的还是完全拷贝粘贴我的测试的?:

#15


完全拷贝的,就把Js代码以及checkbox复制的

#16


全选删除自己实现了,具体解决方法http://topic.csdn.net/u/20120613/19/14bf421d-5a86-484b-af79-ba40fff2e183.html,再次感谢大家的热心帮助