我有一些动态创建的文本框 -
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;
}
}
谢谢!
答案 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;
}
}
}