Флажок asp.net datalist получает уникальный выбор

У меня есть элемент управления datalist, в котором есть один флажок в каждом ItemTamplate. Наряду с флажком есть также гиперссылка для отображения некоторых документов. Пользователи должны иметь возможность щелкнуть флажок, который отобразит соответствующий документ в элементе управления Label с помощью StringBuilder. Код ниже почти работает, но он показывает дубликаты: например, если я выбираю флажок в строке 1, а затем выбираю другой флажок в строке 2, то элемент управления Label дважды отобразит документ из строки 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;

                }
            }
        }
    }
}

person IrfanClemson    schedule 10.04.2012    source источник
comment
displayselected вызывается из ниоткуда.   -  person Tim Schmelter    schedule 10.04.2012
comment
он вызывается косвенно: displayselectedinit вызывает displayselected; причина, по которой я использую displayselected, заключается в том, что он также вызывается из другого флажка «Выбрать все»; Спасибо!   -  person IrfanClemson    schedule 10.04.2012


Ответы (2)


 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;
person KRichardson    schedule 10.04.2012
comment
Наджент: Думаю, просто переместить lbl_currselection.Text = docselected; до конца displayselected() делает свое дело; позвольте мне подтвердить это... - person IrfanClemson; 10.04.2012
comment
Наджент: Ваш код работает нормально. Обмани меня, кстати. Большое тебе спасибо! - person IrfanClemson; 10.04.2012

Это работает:

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);
}
person Tim Schmelter    schedule 10.04.2012
comment
Привет, Тим: я думаю, что попробовал Nugent, и он работает; Я думаю, что ваш, вероятно, будет работать, а также. Но я хочу понять этот код в var selected: я не видел такого использования предложений «где» и «выбрать» в С#. Что происходит в этом коде? Спасибо! - person IrfanClemson; 10.04.2012
comment
Это LINQ. Возможно, вы захотите взглянуть на 101 очень полезный пример LINQ: code .msdn.microsoft.com/101-LINQ-Samples-3fb9811b - person Tim Schmelter; 10.04.2012