【问题标题】:asp.net datalist checkbox get unique selectedasp.net datalist 复选框获得唯一选择
【发布时间】:2012-04-22 20:35:52
【问题描述】:

我有一个 datalist 控件,其中每个 ItemTamplate 中有一个复选框。除了复选框之外,还有一个超链接可以显示一些文档。用户应该能够单击一个复选框,该复选框将使用 StringBuilder 在标签控件中显示相应的文档。下面的代码几乎可以工作,但它显示重复:例如,如果我在第 1 行中选择一个复选框,然后在第 2 行中选择另一个复选框,则标签控件将显示第 1 行的文档两次,然后显示第 2 行的文档一次。这是相关的代码。谢谢!

<tr runat="server" id="tr_data">
                                    <td>
                                        <asp:CheckBox runat="server" ID="cb_docid" Value='<%# Eval("docid") %>' OnCheckedChanged="displayselectedinit"
                                            AutoPostBack="true" />
                                        <asp:HyperLink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>'
                                            Target="_blank" runat="server" />
                                        <br />
                                    </td>
                                </tr>

protected void displayselected()
{
    //return;
    lbl_currselection.Text = "";
    StringBuilder docselected = new StringBuilder();

   foreach (DataListItem li in DataList1.Items)
    {
        if (li.ItemType == ListItemType.Item || li.ItemType == ListItemType.AlternatingItem)
        {
            CheckBox cb = li.FindControl("cb_docid") as CheckBox;
            if (cb != null)
            {
                if (cb.Checked)
                {
                    HyperLink hpl_docfile = li.FindControl("hpl_docfileencr") as HyperLink;
                    docselected.Append(hpl_docfile.Text + "<br />");
                    lbl_currselection.Text += docselected;

                }
            }
        }
    }
}

【问题讨论】:

  • displayselected 不知从何而来。
  • 间接调用:displayselectedinit调用displayselected;我使用 displayselected 的原因是因为它也被另一个“全选”复选框调用;谢谢!

标签: asp.net checkbox datalist


【解决方案1】:
 docselected.Append(hpl_docfile.Text + "<br />");
 lbl_currselection.Text += docselected;

您正在附加字符串生成器,以及添加标签。

目前,代码是这样执行的:

第一个循环:

Adding: Text1
docselected = Text1<br/>
lbl_currselection = Text1<br/>

第二个循环:

Adding: Text2
docselected = Text1<br/>Text2<br/>
lbl_currselection = Text1<br/>Text1<br/>Text2<br/>

我会将 lbl_currselection.Text 移到末尾(循环外)并使用:

foreach (DataListItem li in DataList1.Items)
{
    if (li.ItemType == ListItemType.Item || li.ItemType == ListItemType.AlternatingItem)
    {
        CheckBox cb = li.FindControl("cb_docid") as CheckBox;
        if (cb != null)
        {
            if (cb.Checked)
            {
                HyperLink hpl_docfile = li.FindControl("hpl_docfileencr") as HyperLink;
                docselected.Append(hpl_docfile.Text + "<br />");                    
            }
        }
    }
}
lbl_currselection.Text = docselected;

【讨论】:

  • Nugent:我认为只是移动 lbl_currselection.Text = docselected;到 displayselected() 的结尾是诀窍;让我确认一下……
  • Nugent:您的代码运行良好。骗我,顺便说一句。非常感谢!
【解决方案2】:

这行得通:

protected void DisplaySelected(Object sender, EventArgs e)
{
    var selected = DataList1.Items.Cast<DataListItem>()
        .Where( li => ((CheckBox)li.FindControl("cb_docid")).Checked)
        .Select(li => ((HyperLink)li.FindControl("hpl_docfileencr")).Text);
    lbl_currselection.Text = String.Join("<br />", selected);
}

【讨论】:

  • 嘿蒂姆:我想我已经尝试过 Nugent,它正在工作;我认为你的可能也会起作用。但我想了解 var selected 中的这段代码:我还没有在 c# 中看到过这样使用 'where' 和 'select' 子句。这段代码发生了什么?谢谢!
  • 那是LINQ。您可能想查看 101 个非常有用的 LINQ 示例:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
猜你喜欢
  • 2012-04-20
  • 2021-03-22
  • 2021-12-27
  • 2010-11-23
  • 2010-11-29
  • 2018-03-31
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多