【发布时间】:2012-02-27 15:26:29
【问题描述】:
我正在使用转发器来创建一个动态的、数据库驱动的表单。
所需功能的一部分是能够动态驱动下拉列表,这些下拉列表依赖于先前选择的下拉列表中的值来生成它们的值。
所以如果我正在创建一个下拉列表控件并将其添加到一行并为其分配一个 id,然后我转到下一行,我如何从上一行的控件中获取值?
这是我正在尝试的,但 .FindControl 每次都返回 null。
DropDownList toParentDDL = (DropDownList)rptDynamicForm.FindControl("ParentControlID");
ID 设置正确,放置在 find 控制方法中的 id 也正确。
只是另一个想法...当我将控件添加到中继器时,我这样做是这样的:
e.Item.FindControl("pnlQuestionAnswer").Controls.Add(toDropDown);
会不会是嵌套在面板里面?
消除任何混乱。这些控件是在 ItemDataBound 上创建的。
解决方案:
感谢蒂姆的帮助。我终于意识到问题所在了。我正在寻找转发器内的控件,而转发器本身不包含控件,ITEMS 包含我正在寻找的控件,即使项目在转发器中,它也不会在项目中查找。 (我认为 .findcontorl 的工作方式与 jquery 中的 .find 类似,但事实并非如此)
解决我刚刚做的问题:
foreach (RepeaterItem toItem in rptDynamicForm.Items)
{
DropDownList toParentDDL = (DropDownList)toItem.FindControl("ParentControlID");
}
所以现在只要它不返回 null,它就会包含正确的控件。
【问题讨论】:
-
您能否确保您的 FindControl("") 中的控件名称拼写正确 C# 大小写很重要..
-
分配给 id 并在查找控件中使用的值是从数据库中提取的...我在运行时验证了这些值是相同的。
-
您必须检查您的视图源并确定两个 ID 之间的差异
-
什么是
rptDynamicForm?如果是中继器本身,那么这不起作用的原因很明显:动态控件的 NamingContainer(在 ItemTemplate 中)是 RepeaterItems 而不是中继器。你肯定应该添加更多的源代码,否则很难看到你在做什么(ParentControlID等是什么)。 -
@Patrick:那么你需要获取上一个RepeaterItem 的引用才能找到嵌套控件。但是您无法通过中继器找到它。
标签: c# repeater web-controls