【问题标题】:asp.net datalist select all checkboxes per categoryasp.net datalist 选择每个类别的所有复选框
【发布时间】:2012-04-20 08:21:15
【问题描述】:

我有一个页面,用户可以在 datalist 控件中选择不同的文档文件。使用 on pre-render 事件处理程序根据类别对文档进行分类。基于复选框控件(不是复选框列表)选择文档。到目前为止,一切都很好。我接下来要做的是在每个类别名称旁边放置一个“全选”复选框,该复选框应仅选择该类别下的复选框。这是datalist控件:

<asp:DataList ID="DataList1" runat="server" RepeatDirection="Vertical" OnPreRender="DataList1_PreRender" DataKeyField="docid" EnableViewState="false">
<ItemTemplate>
    <table cellpadding="0" cellspacing="0" id="tbl_data">
        <tr>
            <td>
                <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Font-Underline="True"></asp:Label>
             <asp:Label runat="server" id="lbl_cb_all" visible="false">Select All <input runat="server" id="cb_selectall" type="checkbox" value='<%# Eval("catid") %>' /> </asp:Label>
            </td>
        </tr>

        <tr runat="server" id="tr_data">
            <td>
                <asp:Label ID="lbl_categoryname" runat="server" Text='<%# Eval("categoryname") %>' Visible="false" /> <!-- Hide this; only used in Code Behind -->
                 <input runat="server" id="cb_docid" type="checkbox" value='<%# Eval("docid") %>' />
                  <asp:Hyperlink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>' Target="_blank"  runat="server" />
                <br />
            </td>
        </tr>
    </table>
</ItemTemplate>

这里是 OnPreRender 代码:

protected void DataList1_PreRender(object sender, EventArgs e)
{
    string strTempLabelCategory = "";
    foreach (DataListItem item in DataList1.Items)
    {



        Label lbl_categoryname = item.FindControl("lbl_categoryname") as Label;


        if (strTempLabelCategory.ToUpper() != lbl_categoryname.Text.ToString().ToUpper())
        {
            strTempLabelCategory = lbl_categoryname.Text.ToString().ToUpper();
            Label lblHeader = item.FindControl("lblHeader") as Label;
            lblHeader.Text = strTempLabelCategory.ToUpper();

            Label lbltempdiv = item.FindControl("lbl_cb_all") as Label;
            lbltempdiv.Visible = true;
        }
    }
}

我一直在寻找可以在我的代码中运行但没有运气的东西。而且我对这段代码投入太多,现在无法尝试 Checkboxlist 控件(不确定这是否会有所帮助)。 有任何想法吗?我以为我可以使用:http://www.dotnetcurry.com/ShowArticle.aspx?ID=77 代码,但不知道如何使它工作?如果我能以某种方式使全选复选框与标签绑定,然后查找所有标签,那么链接的代码可能会有所帮助。 谢谢!

【问题讨论】:

  • 使用 jquery 来检查作为 datalist 元素的子项的复选框。选中“选择”全部“时,它会向jQuery触发才能通过id获取数据项元素,然后通过循环通过输入复选框类型的子项并切换为此。 span>
  • 布莱恩,谢谢。但我的问题是找出'datalist element by id然后循环遍历孩子'......
  • 我试图让每个 ItemTemplate 包含一个具有 tbl_data ID 的表,然后找到父 tbl_data 表以深入到 tr_data 行内的复选框以查找复选框,但表 tbl_data 正在为每个项目呈现.
  • 是的,你想避免这种情况。你是如何创建 asp:datalist 的?那将是您需要识别的内容,或者是一个数据列表中的所有内容,并且仅按类别排序。如果是这样,第一件事就是按类别将其分解,以便每个都包含在一些识别元素中。
  • Brian,相关的 .aspx 和 .cs 代码都在我的帖子中。为了按类别分组,我使用预渲染。甚至 Select All 复选框(如 .aspx 中所示)也按预期显示。我希望我可以分配包含类似于 selectall 复选框的复选框 ID 的 tr 元素,但.net 不允许动态 ID。谢谢!

标签: asp.net checkbox datalist


【解决方案1】:
  1. 使用 HiddenFields 存储 CatIDDocID
  2. 两者都使用 ASP.NET 复选框而不是 HTML 输入
  3. 处理 Check-All Checkbox'CheckedChanged 事件:

protected void CheckAllChanged(Object sender, EventArgs e)
{
    CheckBox checkAll = (CheckBox)sender;
    DataListItem item = (DataListItem)checkAll.NamingContainer;
    HiddenField HiddenCatID = (HiddenField)item.FindControl("HiddenCatID");
    var catCheckBoxes = DataList1.Items.Cast<DataListItem>()
        .Where(li => ((HiddenField)li.FindControl("HiddenCatID")).Value == HiddenCatID.Value)
        .Select(li => li.FindControl("cb_docid"));
    foreach (CheckBox docCheckBox in catCheckBoxes)
    {
        docCheckBox.Checked = checkAll.Checked;
    }
}

在 aspx 上:

<asp:CheckBox runat="server" OnCheckedChanged="CheckAllChanged" AutoPostBack="true"  id="cb_selectall" />
<asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' />
<asp:HiddenField ID="HiddenDocID" runat="server" Value='<%# Eval("DocID") %>' />

您还需要在 DataList 上EnableViewState=true 以维护复选框状态并启用检查/取消检查。


编辑

因为您无法运行它,所以这里有一个完整的工作示例页面。

这是 aspx 上所需的控件(注意 f.e. &lt;tr runat="server" id="tr_category"&gt;):

<ItemTemplate>
    <table cellpadding="0" cellspacing="0" id="tbl_data">
        <tr runat="server" id="tr_category">
            <td>
                <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Text='<%# Eval("categoryname") %>' Font-Underline="True"></asp:Label>
                <asp:Label runat="server" ID="lbl_cb_all">Select All
                <asp:CheckBox runat="server"  OnCheckedChanged="CheckAllChanged" AutoPostBack="true"  id="cb_selectall" />
                </asp:Label>
            </td>
        </tr>
        <tr runat="server" id="tr_data">
            <td>
                <asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' />
                <asp:CheckBox runat="server" id="cb_docid" />
                <asp:HyperLink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>'
                    Target="_blank" runat="server" />
                <br />
            </td>
        </tr>
    </table>
</ItemTemplate>
  1. 确保DataList只绑定if(!IsPostback),否则复选框选择将不会保持:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) BindDataList();
    }
    
  2. 我正在使用ItemDataBound 而不是PreRender,这对于正确重新加载 ViewState 很重要。我也简化了所有:

    protected void DataList1_ItemDataBound(Object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem)
        {
            var row  = (DataRowView)e.Item.DataItem;
            var view = row.DataView;
            var lastRow = e.Item.ItemIndex == 0 ? null : view[e.Item.ItemIndex-1];
            var tr_category = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl("tr_category");
            var sameCategory = lastRow != null && (int)row["catid"] == (int)lastRow["catid"];
            tr_category.Visible = !sameCategory;
        }
    }
    
  3. CheckAllChanged 保持不变。

即使您选择了一个文档复选框并随后选择了一个类别复选框,这也会按预期工作,这会导致回发。

【讨论】:

  • Tim:您的编码工作正常。我稍后会发布更新。仍然需要弄清楚“取消选中”以删除所有复选框以及让数据库处理现在使用 asp:checkbox 而不是之前的 html 复选框。非常感谢!
  • “取消选中”是什么意思?取消选中每个类别的文档复选框的工作方式与检查它们的方式相同,只需取消选中类别复选框即可。
  • 如果我取消选中 cb_selectall 那么它不会导致相应类别的复选框变为未选中
  • 我很确定这是由您在 DataList 上的EnableViewState=false 引起的。
  • 是的,你是对的:我为 Datalist 设置了 ViewState,现在取消选中工作。最后一个问题,我想。 HtmlInputCheckBox cb = li.FindControl("cb_docid") as HtmlInputCheckBox;是我以前从 html 复选框中获取 docid 的“值”的方法。但是自从我更改为 asp:checkboxes 后,我不能再使用它了。我收到关于“价值”不是会员的错误。有什么想法吗?
【解决方案2】:

我想我可以通过对 Tim 的代码稍作修改来实现这一点。几点:我不得不为数据列表禁用 ViewState,否则,全选触发器不会保持选中框。我不明白为什么。此外,page_load 事件中没有 ispostback 检查,并且每次加载时都会绑定数据列表。我不是那是“最佳的”或不是。我还制作了两组 Asp:RadioButtons:CheckAll 和 CheckNone,而不是复选框。无论如何,这里是相关代码:

<asp:DataList ID="DataList1" runat="server" RepeatDirection="Vertical" DataKeyField="docid"
                EnableViewState="false" OnItemDataBound="DataList1_ItemDataBound">
                <ItemTemplate>
                    <table cellpadding="0" cellspacing="0" id="tbl_data">
                        <tr runat="server" id="tr_category">
                            <td>
                                <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Text='<%# Eval("categoryname") %>'
                                    Font-Underline="True"></asp:Label>
                                <asp:Label runat="server" ID="lbl_cb_all">Select: All
                                    <asp:RadioButton runat="server" OnCheckedChanged="CheckAllChanged" AutoPostBack="true"
                                        ID="rb_selectall" GroupName="selectallnone" />
                                    | None
                                    <asp:RadioButton runat="server" OnCheckedChanged="CheckAllChangedNone" AutoPostBack="true"
                                        ID="rb_selectnone" GroupName="selectallnone" />
                                    <asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' />
                                    <asp:HiddenField ID="HiddenDocID" runat="server" Value='<%# Eval("docid") %>' />
                                </asp:Label>
                            </td>
                        </tr>
                        <tr runat="server" id="tr_data">
                            <td>
                                <asp:CheckBox runat="server" ID="cb_docid" Value='<%# Eval("docid") %>' />
                                <asp:HyperLink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>'
                                    Target="_blank" runat="server" />
                                <br />
                            </td>
                        </tr>
                    </table>
                </ItemTemplate>
            </asp:DataList>

 protected void DataList1_ItemDataBound(Object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var row = (DataRowView)e.Item.DataItem;
        var view = row.DataView;
        var lastRow = e.Item.ItemIndex == 0 ? null : view[e.Item.ItemIndex - 1];
        var tr_category = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl("tr_category");
        var sameCategory = lastRow != null && (int)row["catid"] == (int)lastRow["catid"];
        tr_category.Visible = !sameCategory;
    }
}

protected void CheckAllChanged(Object sender, EventArgs e)
{
    RadioButton checkAll = (RadioButton)sender;
    DataListItem item = (DataListItem)checkAll.NamingContainer;
    HiddenField HiddenCatID = (HiddenField)item.FindControl("HiddenCatID");

    var catCheckBoxes = DataList1.Items.Cast<DataListItem>()
        .Where(li => ((HiddenField)li.FindControl("HiddenCatID")).Value == HiddenCatID.Value)
        .Select(li => li.FindControl("cb_docid"))
        .ToList();
    foreach (CheckBox docCheckBox in catCheckBoxes)
    {
       // docCheckBox.Checked = checkAll.Checked;
        docCheckBox.Checked = true;
    }
 }

protected void CheckAllChangedNone(Object sender, EventArgs e)
{
    RadioButton checkAll = (RadioButton)sender;
    DataListItem item = (DataListItem)checkAll.NamingContainer;
    HiddenField HiddenCatID = (HiddenField)item.FindControl("HiddenCatID");

    var catCheckBoxes = DataList1.Items.Cast<DataListItem>()
        .Where(li => ((HiddenField)li.FindControl("HiddenCatID")).Value == HiddenCatID.Value)
        .Select(li => li.FindControl("cb_docid"))
        .ToList();

    foreach (CheckBox docCheckBox in catCheckBoxes)
    {
        docCheckBox.Checked = false;
    }


}

//Order 按钮的部分代码如下;注意 HiddenField 的使用

 CheckBox cb = li.FindControl("cb_docid") as CheckBox;

        if (cb != null)
        {
            if (cb.Checked)
            {
                HiddenField docid = li.FindControl("HiddenDocID") as HiddenField;
                string dbcmd = @"Insert Into [order_details] (orderid,docid) Values (" + orderid + "," + docid.Value.ToString() + ")";

【讨论】:

    【解决方案3】:
     protected void chkAllN_CheckedChanged(object sender, EventArgs e)
        {
            lblSelectedRecord.InnerText = "0";
            /*this Foreach Loop performing for find gridview*/
            foreach (DataListItem dst in dstMulEmpSalInsert.Items)
            {
                GridView grd = (GridView)dst.FindControl("grdMulEmpSalInsert");
                CheckBox chk_All = (CheckBox)grd.HeaderRow.FindControl("chkAllN");
    
                if (chk_All.Checked == true)
                {
                    /*this Foreach Loop performing for find gridview Controls*/
                    foreach (GridViewRow gvr in grd.Rows)
                    {
                        CheckBox chk_One = (CheckBox)gvr.FindControl("ChkSendOne");
                        
    
                        chk_One.Checked = true;
                        txt_Salary.ReadOnly = false;
                        lblSelectedRecord.InnerText = (Convert.ToInt32(lblSelectedRecord.InnerText) + 1).ToString();
                    }
                   
    
                }
                else
                {
                    /*this Foreach Loop performing for find gridview Controls*/
                    foreach (GridViewRow gvr in grd.Rows)
                    {
                        CheckBox chk_One = (CheckBox)gvr.FindControl("ChkSendOne");
                        
    
                        chk_One.Checked = false;
                        
    
                    }
                    
                }
            }
            
    
        }
    

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多