循环通过以编程方式创建的文本框时“无法转换对象”

时间:2012-11-27 16:47:49

标签: c# asp.net .net c#-4.0

我有一些动态创建的文本框 -

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;
}

这很好(至少我敢肯定 - 他们应该如何表现)。但是当我尝试遍历它们以启用它们或获取它们的值时,我得到一个“无法将类型为'System.Web.UI.LiteralControl'的对象转换为'System.Web.UI.WebControls'。 TextBox'。“错误。

这就是我一直在努力的方法 -

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

谢谢!

6 个答案:

答案 0 :(得分:4)

你循环遍历panel.Controls,它将遍历面板中的每个控件。这与循环您添加的所有内容不一定相同。如果在您开始时面板中存在其他内容,您最终也会得到它。

你可能想要的是:

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

答案 1 :(得分:3)

您将每个文本框放在一个“div”控件(HtmlGenericControl)内,然后放在面板控件中。首先,您必须在HtmlGenericControl

内搜索panelId.Controls

可能对您有帮助的示例代码:

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 :(得分:1)

Panel中有一个控件,它不是TextBox,无法投射到它。您应该在循环之前放置一个断点,并在调试模式下检查panel.Control集合内容。

如果您未在foreach循环中指定类型并自行进行安全投射,则可以避免此问题。

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

答案 3 :(得分:0)

您应该检查控件是否为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;
    }
}

答案 4 :(得分:0)

将文本框添加到div元素,将div元素添加到面板。因此,您需要在面板中选择控件,然后找到文本框。

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

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

答案 5 :(得分:0)

Controls集合将包含面板中所有控件的集合 - 而不仅仅是TextBoxes。您可以遍历所有控件并使用as运算符执行类型转换。如果类型转换成功,则可以启用文本框。

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;
        }    
    }
}