2011-08-18 93 views
0

我有一個網頁,我在Page_Load事件期間動態地創建控件(這是因爲我不知道需要多少控件,直到會話處於活動狀態並且可以訪問某些變量)通過Web控制循環的問題

我需要能夠遍歷這些控件來查找處理按鈕單擊時的複選框。通過Form.Controls循環似乎是不夠的。我認爲Request.Form可能會工作,但它似乎不能在我的C#塊中訪問?

Request.Form應該是什麼樣子?或

有沒有人用動態創建的控件完成此操作?

任何洞察力是讚賞。

+2

如果你可以避免創建控制,那會更容易。我個人喜歡使用中繼器來「創建」控件。您的問題prolly來自這樣一個事實,即您在嘗試循環之前未重新創建您的控件...動態創建的控件需要在每次回發時重新創建。 – David

+0

您的C#塊的外觀如何?它坐在哪裏?你可以發佈一些嗎? –

+0

感謝有識之士。我有種討論,並與之一起運行,發現我的解決方案對我來說最合適。 foreach(Request.Form中的字符串chk) { if(chk。包含(「chkRemove」)) { int idxFormat = chk.LastIndexOf(「chkRemove」); objectname = chk.Substring(idxFormat); 原來我真正需要的只是名字。該字符串在末尾包含一個數字,用於確定數據表項的位置。 感謝您的建議! – Encryption

回答

0

感謝您的洞察傢伙。我有種討論,並與之一起運行,發現我的解決方案對我來說最合適。

foreach(String chk in Request.Form) 
{ 
    if (chk.Contains("chkRemove")) 
    { 
     int idxFormat = chk.LastIndexOf("chkRemove"); 
     objectname = chk.Substring(idxFormat); 
    } 
} 

原來我真正需要的只是名字。該字符串在末尾包含一個數字,用於確定數據表項的位置。感謝您的建議!

0

簡單的例子來自MSDN:

var myControl = FindControl("NameOfControl"); 
if(myControl != null) 
{ 
    //do something 
} 
else 
{ 
    //control not found 
} 

希望這有助於! ;)

+0

這不適用於在Page_Load事件中創建的控件,因爲它不包含在ViewState中。你會發現一個控制,但控制不會是相同的控制,它的狀態會有所不同。 –

0

您的控件將可通過Controls集合的直接父級訪問。除非你像Page.Form.Controls.Add (myControl);那樣添加它們,否則你不會在Page.Form.Conttrols中找到它。如果您將它們添加到佔位符,則必須在thePlaceHolder.Controls中找到它們。

LinkButton myDynamicLinkButton = new myDynamicLinkButton(); 
myDynamicLinkButton.ID = "lnkButton"; 

myPlaceHolder.Controls.Add (myDynamicLinkButton); 

//........ 

LinkButton otherReferenceToMyLinkButton = myPlaceHolder.FindControl ("lnkButton"); 

正如@大衛說,在他的評論,你應該考慮使用一箇中繼器來代替。這可能會大大簡化你的情況。

0

由於控件可能嵌套在其他控件中,因此需要遞歸搜索。您可以使用此方法來找到控制:

public Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

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

    return null; 
} 

而且可以實現這樣說:

CheckBox check = FindControlRecursive(Page.Form, "CheckBox1"); 
0

你應該有Request["xyz"]在您aspx.cs代碼的任何地方訪問。您可以如上所述查找控件並讀取它的值,或者直接從請求中使用Control.UniqueID屬性讀取值。例如,如果它是一個複選框,在中繼器內,那麼UniqueID看起來像dtgData $ ctl02 $ txtAmount