1

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

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

谢谢!

4

6 回答 6

4

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

你可能想要的是这样的:

foreach (var t in panel.Controls.OfType<System.Web.UI.WebControls.TextBox>())
{
    t.Enabled = true;
}
于 2012-11-27T16:54:37.957 回答
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;
                }
            }
} 
于 2012-11-27T18:35:37.537 回答
1

你的 里面有一个控件Panel,它不是 aTextBox并且不能被转换为它。您应该在循环之前放置一个断点并panel.Control在调试模式下检查集合内容。

如果您没有在foreach循环中指定类型并自己进行安全转换,则可以避免该问题。

foreach (var t in panel.Controls)
{
    var textbox = t as System.Web.UI.WebControls.TextBox;
    if(textbox != null)
    {               
        textbox.Enabled = true;
    }
}
于 2012-11-27T16:51:13.447 回答
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;
    }
}
于 2012-11-27T16:51:29.900 回答
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;
}
于 2012-11-27T16:53:54.847 回答
0

Controls集合将包含面板中所有控件的集合——不仅仅是文本框。您可以遍历所有控件并使用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;
        }    
    }
}
于 2012-11-27T16:59:15.210 回答