我有一个网页,我在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