“Unable to cast object” while looping through programatically created textboxes

百般思念 提交于 2020-01-05 05:35:30

问题


I have some Textboxes that are created dynamically --

int i = 1;
while (reader.Read())
{
    System.Web.UI.WebControls.TextBox textBox = new System.Web.UI.WebControls.TextBox();
    textBox.ID = reader["field_id"].ToString();
    textBox.Enabled = false;
    HtmlGenericControl div = new HtmlGenericControl("div");

    if(i%2 != 0)
        div.Attributes.Add("style", "margin-right:120px;padding-bottom:20px;");

    if (i % 2 == 0)
        div.Attributes.Add("style", "padding-bottom:20px;");

    div.Attributes.Add("class", "inline fourcol");
    div.InnerHtml = "<label>" + reader["field"] + "</label>"; 
    div.Controls.Add(textBox);
    panelId.Controls.Add(div);
    textBox.Text = reader["field_value"].ToString();
    ++i;
}

That works fine (at least i'm sure -they show up how they should). But when i try to loop through them to enable them, or get their values, i get an "Unable to cast object of type 'System.Web.UI.LiteralControl' to type 'System.Web.UI.WebControls.TextBox'. " error.

This is how i've been trying to do it --

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (System.Web.UI.WebControls.TextBox t in panel.Controls)
    {
        t.Enabled = true;
    }
}

Thanks!


回答1:


You are putting each textbox inside a "div" control which is HtmlGenericControl, then inside the panel control. So first you must search for the HtmlGenericControl inside panelId.Controls

A sample code that might help you:

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (Control c in panelId.Controls)
            {
                if (c is HtmlGenericControl)
                {
                    foreach (var textbox in c.Controls.OfType<TextBox>()) //ofType returns IEnumerable<TextBox>
                        textbox.Enabled = true;
                }
            }
} 



回答2:


You're looping over panel.Controls, which will loop over every control in the panel. This is not necessarily the same thing as looping over everything you've added. If there was something else inside the panel that existed when you started, you will end up getting that too.

What you probably wanted was this:

foreach (var t in panel.Controls.OfType<System.Web.UI.WebControls.TextBox>())
{
    t.Enabled = true;
}



回答3:


There is a control inside your Panel, that is not a TextBox and could not be cast to it. You should place a breakpoint before the loop and check the panel.Control collection contents in debug mode.

You can avoid the issue if you don't specify a type in the foreach loop and do the safe cast yourself.

foreach (var t in panel.Controls)
{
    var textbox = t as System.Web.UI.WebControls.TextBox;
    if(textbox != null)
    {               
        textbox.Enabled = true;
    }
}



回答4:


You should check if control is TextBox

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (var t in panel.Controls)
    {
        if (t is System.Web.UI.WebControls.TextBox)
            ((System.Web.UI.WebControls.TextBox)t).Enabled = true;
    }
}



回答5:


The Controls collection will contain a collection of all the controls in the panel - not just TextBoxes. You can iterate through all of the controls and use the as operator to perform a type cast. If the type cast succeeds then you may enable the textbox.

public void EditPanel(System.Web.UI.WebControls.Panel panel)
{
    foreach (var control t in panel.Controls)
    {
        System.Web.UI.WebControls.TextBox textBox = control as System.Web.UI.WebControls.TextBox;
        if (textBox != null)
        {
            control.Enabled = true;
        }    
    }
}



回答6:


you add the textbox to the div element and the div element to the panel. therefore you need to select the controls in the panel and then find the textbox.

foreach (var t in panel.Controls.Cast<Control>().SelectMany(c => c.Controls))
{
    if (t is TextBox == false) continue;

    ((TextBox)t).Enabled = true;
}


来源:https://stackoverflow.com/questions/13589008/unable-to-cast-object-while-looping-through-programatically-created-textboxes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!