2012-04-10 50 views
0

我有一個datalist控件,每個ItemTamplate中有一個複選框。隨着複選框,還有一個超鏈接來顯示一些文件。用戶應該能夠點擊一個複選框,該複選框將使用StringBuilder在標籤控件中顯示相應的文檔。下面的代碼幾乎可以工作,但它顯示重複:例如,如果我選中第1行中的複選框,然後選擇第2行中的另一複選框,則Label控件將顯示第1行中的文檔兩次,然後顯示第2行中的文檔一旦。這是相關的代碼。謝謝!asp.net datalist複選框獲得唯一選擇

<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; 

       } 
      } 
     } 
    } 
} 
+0

'displayselected'從無處調用。 – 2012-04-10 14:34:29

+0

它被間接調用:displayselectedinit調用displayselected;我使用displayselected的原因是因爲它也是從另一個「全選」複選框中調用的;謝謝! – IrfanClemson 2012-04-10 14:36:38

回答

1
docselected.Append(hpl_docfile.Text + "<br />"); 
lbl_currselection.Text += docselected; 

要附加StringBuilder的,以及添加的標籤。

目前,該代碼執行的是這樣的:

第一個循環:

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; 
+0

Nugent:我想簡單地移動lbl_currselection.Text = docselected;到displayselected()的結尾是做伎倆;讓我確認它... – IrfanClemson 2012-04-10 14:40:44

+0

Nugent:你的代碼工作正常。假的我,順便說一句。非常感謝你! – IrfanClemson 2012-04-10 14:48:20

1

這個作品:

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); 
} 
+0

嘿Tim:我想我已經嘗試過Nugent,它正在工作;我認爲你的可能會工作。但是我想在var中理解這段代碼:我沒有看到在c#中使用'where'和'select'子句。這段代碼中發生了什麼?謝謝! – IrfanClemson 2012-04-10 14:46:30

+0

這就是['LINQ'](http://msdn.microsoft.com/zh-cn/library/bb397933.aspx)。您可能需要查看101 LINQ示例,這些示例非常有用:http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – 2012-04-10 14:55:42

+0

感謝蒂姆!我會爲您的鏈接添加書籤。 – IrfanClemson 2012-04-10 14:58:56