2012-03-29 49 views
2

如何以編程方式從cs文件訪問aspx頁面上的控件?例如,如果我有一套asp:Panel控件,每個控件都有一個由城市命名的ID(id =「atlanta」,id =「chicago」,id =「pittsburgh」等),然後在cs我從數據庫中獲取一個值以匹配控件名稱我將使用什麼?如何以編程方式從cs文件訪問aspx頁面上的控件

我試圖使用FindControl(),如圖所示,它返回null。

aspx頁面:

<asp:Panel ID="atlanta" runat="server" Visible="false"></asp:Panel> 

CS文件:

controlName = storeLocation.City.ToLower(); 
Panel cityPanel = (Panel)FindControl(controlName); 
cityPanel.Visible = true; 

我想的FindControl()是真的在等,其中您在ItemTemaplate通過中繼器或網格的情況下使用。在我的情況下,它只是一個簡單的內容頁面,裏面有一堆內容標籤。

感謝先進! :)

+0

你檢查了我的答案嗎?我在我的機器上試過了,它似乎工作。我很好奇... – daniloquio 2012-03-29 23:03:33

回答

3

FindControl()不遞歸,這可能是你的問題。但是,遞歸版本有許多實現,例如this one

如果要動態創建面板,並且您希望稍後在頁面生命週期中訪問它們,則可以將它們全部添加到以ID爲關鍵字的Dictionary<string, Panel>

+0

謝謝,這絕對有效。正如其他人所指出的那樣,遞歸可能會導致稅收,但目前狀態下的aspx頁面的結構應該不成問題。如果它發生變化並變得更加複雜,這可能是一個問題,但我不認爲這個頁面的變化不是複製/文本。 – Dmase05 2012-03-30 15:14:59

+0

很高興它的作品。如果你知道所有項目的直接父項,你可以避免遞歸,但否則我不會擔心它。通過幾個級別的控制遞歸是非常便宜的。 – 2012-03-30 17:31:10

2

您可以使用該擴展方法遞歸地找到控制:

public static class ControlExtension 
{ 

    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control child in control.GetAllControls()) 
      { 
       yield return child; 
      } 
     } 
    } 
} 

然後在你的代碼頁的背後,如果你前綴的標籤,你可以做這樣的事情:

IEnumerable<Control> city_controls = this.GetAllControls().Where(x => x.Id.Contains("city_")) 

或單控:

var city = this.GetAllControls().Single(x => x.Id = "atlanta"); 

this是你的ASPX代碼背後頁面。

它也適用於如面板控制,所以如果你想找到一個面板中的所有控件等

1

如果您知道包含控制您可以使用該控件的FindControl()功能查找它。這種方法比使用遞歸方法更快更安全。

由於某種原因,Microsoft不包括遞歸的FindControl()函數,隨着更多控件添加到頁面,它會隨着時間的推移而減慢頁面的速度。如果這不起作用,請使用像其他建議一樣的遞歸函數。

+0

我也有這個問題。試圖在包含內容佔位符上執行FindControl()也返回null。 – Dmase05 2012-03-30 15:11:43

1

這應該適合你,因爲面板嵌套在asp:Content控件中。

Panel cityPanel = 
(Panel)Master.FindControl("ContentPlaceHolderId").FindControl(controlName); 

當然,ContentPlaceHolderId是您正在實施的母版頁中相應ContentPlaceHolder的Id。

+0

我無法得到這個工作。 所以,如果我有這在ASPX: '的' 我應該在CS具有這樣的: '面板concentrationPanel =(面板)Master.FindControl(「cphInteriorBody」)。FindControl(controlName);' – Dmase05 2012-03-30 15:04:27

+0

@ DMase05是的,這是我用它的方式,它爲我工作,我很抱歉它不適合你。正如你在其他答案中所說的那樣,遞歸肯定會起作用。 – daniloquio 2012-03-30 15:33:40

+0

是的,我真的很困惑,因爲我期望它也能工作。不管怎麼說,還是要謝謝你! – Dmase05 2012-03-30 17:37:05

相關問題