gpt4 book ai didi

asp.net datalist 选择每个类别的所有复选框

转载 作者:行者123 更新时间:2023-12-02 21:25:21 25 4
gpt4 key购买 nike

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

<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代码,但不确定如何使其工作?如果我可以以某种方式使全选复选框与标签绑定(bind),然后查找所有标签,那么链接的代码可能会有所帮助。谢谢!

最佳答案

  1. 使用 HiddenFields 存储 CatIDDocID
  2. 使用 ASP.NET 复选框而不是 HTML 输入
  3. 处理全选复选框'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") %>' />

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

<小时/>

编辑:

因为您在运行它时遇到问题,所以这里有一个完整的工作示例页面。

以下是 aspx 上所需的控件(注:<tr runat="server" id="tr_category">):

<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 仅进行数据绑定(bind) 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保持不变。

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

关于asp.net datalist 选择每个类别的所有复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10048170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com