我有一個網頁,我在Page_Load
事件期間動態地創建控件(這是因爲我不知道需要多少控件,直到會話處於活動狀態並且可以訪問某些變量)通過Web控制循環的問題
我需要能夠遍歷這些控件來查找處理按鈕單擊時的複選框。通過Form.Controls循環似乎是不夠的。我認爲Request.Form
可能會工作,但它似乎不能在我的C#塊中訪問?
Request.Form
應該是什麼樣子?或
有沒有人用動態創建的控件完成此操作?
任何洞察力是讚賞。
我有一個網頁,我在Page_Load
事件期間動態地創建控件(這是因爲我不知道需要多少控件,直到會話處於活動狀態並且可以訪問某些變量)通過Web控制循環的問題
我需要能夠遍歷這些控件來查找處理按鈕單擊時的複選框。通過Form.Controls循環似乎是不夠的。我認爲Request.Form
可能會工作,但它似乎不能在我的C#塊中訪問?
Request.Form
應該是什麼樣子?或
有沒有人用動態創建的控件完成此操作?
任何洞察力是讚賞。
感謝您的洞察傢伙。我有種討論,並與之一起運行,發現我的解決方案對我來說最合適。
foreach(String chk in Request.Form)
{
if (chk.Contains("chkRemove"))
{
int idxFormat = chk.LastIndexOf("chkRemove");
objectname = chk.Substring(idxFormat);
}
}
原來我真正需要的只是名字。該字符串在末尾包含一個數字,用於確定數據表項的位置。感謝您的建議!
簡單的例子來自MSDN:
var myControl = FindControl("NameOfControl");
if(myControl != null)
{
//do something
}
else
{
//control not found
}
希望這有助於! ;)
這不適用於在Page_Load事件中創建的控件,因爲它不包含在ViewState中。你會發現一個控制,但控制不會是相同的控制,它的狀態會有所不同。 –
您的控件將可通過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");
正如@大衛說,在他的評論,你應該考慮使用一箇中繼器來代替。這可能會大大簡化你的情況。
由於控件可能嵌套在其他控件中,因此需要遞歸搜索。您可以使用此方法來找到控制:
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");
你應該有Request["xyz"]
在您aspx.cs代碼的任何地方訪問。您可以如上所述查找控件並讀取它的值,或者直接從請求中使用Control.UniqueID
屬性讀取值。例如,如果它是一個複選框,在中繼器內,那麼UniqueID
看起來像dtgData $ ctl02 $ txtAmount
如果你可以避免創建控制,那會更容易。我個人喜歡使用中繼器來「創建」控件。您的問題prolly來自這樣一個事實,即您在嘗試循環之前未重新創建您的控件...動態創建的控件需要在每次回發時重新創建。 – David
您的C#塊的外觀如何?它坐在哪裏?你可以發佈一些嗎? –
感謝有識之士。我有種討論,並與之一起運行,發現我的解決方案對我來說最合適。 foreach(Request.Form中的字符串chk) { if(chk。包含(「chkRemove」)) { int idxFormat = chk.LastIndexOf(「chkRemove」); objectname = chk.Substring(idxFormat); 原來我真正需要的只是名字。該字符串在末尾包含一個數字,用於確定數據表項的位置。 感謝您的建議! – Encryption