将HtmlGenericControl转换为DropDown

时间:2009-12-23 05:13:50

标签: c# asp.net casting

我有一套非常复杂的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并出现类似的错误。我只需要知道如何在我感兴趣的下拉列表中访问所选值。

提前致谢。

3 个答案:

答案 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();