我有一套非常复杂的HTML,我想拖网寻找符合各种标准的输入。我希望使用以下内容:
private void setup()
{
masterContainer.InnerHtml = @"
<div>crazy
<div>unknown
<div>html layout
<select id='crazySelectIdentifier_id1' runat='server'>
<option value='1'>Item1</option>
<option value='2'>Item2</option>
</select>
</div>
</div>
</div>
<div>
<div>
<select id='crazySelectIdentifier_id2' runat='server'>
<option value='1'>Item1</option>
<option value='2'>Item2</option>
</select>
</div>
</div>
<div>
</div>";
}
private void recursiveTrawl(HtmlGenericControl currentOuterControl)
{
for (int i = 0; i < currentOuterControl.Controls.Count; i++)
{
HtmlGenericControl currentControl = (HtmlGenericControl) currentOuterControl.Controls[i];
if(currentControl.HasControls())
{
recursiveTrawl(currentControl);
}
else
{
String[] controlArr = currentControl.ID.ToString().Split('_');
String currentId = controlArr[1];
if (currentId.Equals("somethingspecific"))
{
//THE PROBLEM IS HERE
DropDownList dropdown = (DropDownList)currentControl;
然而,我得到错误 - 无法将类型'System.Web.UI.HtmlControls.HtmlGenericControl'转换为'System.Web.UI.WebControls.DropDownList'
我也尝试过使用HtmlSelect并出现类似的错误。我只需要知道如何在我感兴趣的下拉列表中访问所选值。
提前致谢。
答案 0 :(得分:2)
这个强制转换在编译时总是会出错,因为HtmlGenericControl和HtmlSelect之间没有继承关系。对象不能同时存在。一旦一个对象成功转换为HtmlGenericControl(作为函数参数),编译器肯定知道它也不能是HtmlSelect,所以它甚至不会让你尝试演员。
即使编译工作正常,您也会在运行时收到错误,因为&lt; select&gt;不是HtmlGenericControl。
您的解决方案不是为了向HtmlGenericControl投射任何东西。只需使用Control类,它来自Controls集合。当你知道你正在看正确的物体时,你应该做的唯一一次演出就是HtmlSelect。
答案 1 :(得分:1)
试试这个:
<强> web窗体强>
<asp:PlaceHolder ID="PlaceHolder1" runat="server" />
扩展方法
public static class ControlExtensions
{
public static void FindControlByType<TControl>(this Control container, ref List<TControl> controls) where TControl : Control
{
if (container == null)
throw new ArgumentNullException("container");
if (controls == null)
throw new ArgumentNullException("controls");
foreach (Control ctl in container.Controls)
{
if (ctl is TControl)
controls.Add((TControl)ctl);
ctl.FindControlByType<TControl>(ref controls);
}
}
}
<强>代码强>
string html = @"<div>
<select id='Sel1' runat='server'>
<option value='1'>Item1</option>
<option value='2'>Item2</option>
<option value='3'>Item3</option>
</select>
</div>
<div>
<select id='Sel2' runat='server'>
<option value='4'>Item4</option>
<option value='5'>Item5</option>
<option value='6'>Item6</option>
</select>
</div>";
Control ctl = TemplateControl.ParseControl(html);
PlaceHolder1.Controls.Add(ctl);
List<HtmlSelect> controls = new List<HtmlSelect>();
PlaceHolder1.FindControlByType<HtmlSelect>(ref controls);
foreach (HtmlSelect select in controls)
{
}
答案 2 :(得分:0)
如果您将 id =“title”提供给页面上的任何控件并在后面的代码中执行操作,也会发生
示例:
<强>的.aspx:强>
<asp:Label ID="TitleName" runat="server" Text="this will change"></asp:Label>
<强>的.cs:强>
Title.Text = Session["ClientName"].ToString();