2012-07-19 116 views
0

找到ASP複選框,我無法找到的asp:使用FindControl方法我的asp web應用程序複選框。我把一個複選框,我的形式使用:無法通過ID

<asp:CheckBox ID="test" Text="Test checkbox" runat="server" /> 

在我隱藏我有以下幾點:

Control checkbox = FindControl("test"); 
if (checkbox != null) Debug.Print("checkbox found"); 
else Debug.Print("checkbox not found"); 

if (test.Checked) Debug.Print("checkbox is checked"); 
else Debug.Print("checkbox is unchecked"); 

但是我的輸出(與複選框選中): 複選框未找到 複選框被選中

有人能告訴我什麼,我做錯了什麼?

+1

出於好奇,爲什麼你不能只是參考你的複選框沒有使用FindControl? – AaronS 2012-07-19 16:50:26

+0

如果你可以使用Firebug,並設法找到該複選框 – 2012-07-19 16:52:48

+0

@heatStroke請你可以把實際的代碼從代碼隱藏 – HatSoft 2012-07-19 17:01:54

回答

3

FindControl方法不是遞歸,只會覺得你的控制,如果你把它的複選框的直接父。例如,如果複選框被放置在頁面內的UpdatePanel內部;您需要在UpdatePanel上撥打FindControl,而不是像您那樣撥打Page.FindControl

你輸出的原因是:checkbox not found checkbox is checked是因爲你直接調用test.checked,它會一直工作,因爲這是你給複選框的ID。

再次,FindControl不是遞歸和我肯定這就是爲什麼它的失敗。你可以編寫你自己的「RecursiveFindControl」方法,但這幾乎總是過度殺傷,效率低下。

+0

謝謝,我會試試看! – heatStroke 2012-07-19 17:10:35

+0

謝謝,我把我所有的控件放在asp:表中,我的問題解決了! – heatStroke 2012-07-19 18:25:51

0

您可以使用遞歸方法來查找下列方式控制:

private Control RecursiveFindControl(Control root, string id) 
{ 
    if (root.ID == id) return root; 
    foreach (Control c in root.Controls) 
    { 
     Control t = RecursiveFindControl(c, id); 
     if (t != null) return t; 
    } 
    return null; 
} 

使用上述遞歸方法,找到控制:

CheckBox checkbox = RecursiveFindControl(Page, "test") as CheckBox; 
if (checkbox != null) Debug.Print("checkbox found"); 
else Debug.Print("checkbox not found"); 

if (test.Checked) Debug.Print("checkbox is checked"); 
else Debug.Print("checkbox is unchecked"); 
+0

準確地說,我認爲這是一種不好的方法,你提出了它!大聲笑在控制樹中真正深入的一個控件開始使用這種方法的那一刻,最終你的頁面慢慢變成了烏龜。我不得不使用這種技術來分析一個頁面,而遞歸函數的調用數量有時會超過成千上萬。超過70%的時間花費在試圖找到最多可以在一個或兩個函數調用中找到的控件。 – Icarus 2012-07-19 17:16:23

+0

@Icarus:我並不認爲OP使用abvoe遞歸方法,但只是給了他一個替代找到通過遞歸控制.... – 2012-07-19 17:25:57

+0

@LolCoder:感謝您的幫助,我相信這會派上用場的未來! – heatStroke 2012-07-19 18:28:22