NET:通过程序添加html控件后,在服务器端查找它们
本文关键字:服务器端 查找 控件 过程 程序 html 添加 NET | 更新日期: 2023-09-27 18:28:48
我试图做一些事情,遇到了一个问题。
我得到了一个添加html元素和thire属性的函数。现在,我想在服务器端(代码背后)获得控件,这样我就可以用它们做一些事情。
我的问题是:我找不到他们。
这是我用来添加它们的功能的一部分,它有点长,所以我只显示我想在服务器端获得的控件:
public string EditPhoto(int x)
{
using (StringWriter stringWriter = new StringWriter())
{
using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
{
// Some strings for the attributes.
string classValue = "thumb";
//Begin #5 <div class=image-title">
writer.AddAttribute(HtmlTextWriterAttribute.Class, "image-title");
writer.AddAttribute("runat", "server"); //--> server side att
writer.AddAttribute(HtmlTextWriterAttribute.Id, "title" + x);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
TextWriter innerTextWriter = writer.InnerWriter;
innerTextWriter.Write(title);
writer.RenderEndTag(); //#End 5 </div>
//Begin #6 <div class="image-desc">
writer.AddAttribute(HtmlTextWriterAttribute.Class, "image-desc");
writer.AddAttribute("runat", "server"); //--> server side att
writer.AddAttribute(HtmlTextWriterAttribute.Id, "desc" + x);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
innerTextWriter = writer.InnerWriter;
innerTextWriter.Write(descreption);
writer.RenderEndTag(); //#End 6 </div>
writer.RenderEndTag();//#End 4 </div>
writer.RenderEndTag(); // End #1 </li>
}
// Return the result.
return stringWriter.ToString();
}
功能完成后,我得到了这个测试代码来尝试寻找它们:
for (int i = 0; i < Controls.Count; i++)
{
if (FindControl("title" + i) != null)
Response.Write("Found 1 title control");
else
Response.Write( i +"There is no control");
}
for (int i = 0; i < Controls.Count; i++)
{
if (FindControl("desc" + i) != null)
Response.Write("Found 1 descreption control");
else
Response.Write(i + "Thre is no control");
}
对不起我的英语
检查一下,伙计。。。。
你的aspx中会有某种容器,比如:
<asp:Panel ID="controlPanel" runat="server"></asp:Panel>
然后在你身后的代码中,你可能会有这样的东西:
protected void Page_Load(object sender, EventArgs e)
{
InsertControls();
}
private void InsertControls()
{
TextBox textBox = new TextBox();
textBox.ID = "textBox1";
textBox.Text = "Cool Beans";
controlPanel.Controls.Add(textBox);
TextBox locatedTextBox = TraverseControlTree(controlPanel, "textBox1") as TextBox;
}
public static Control TraverseControlTree(Control root, string Id)
{
if (root.ID == Id) { return root; }
foreach (Control Ctl in root.Controls)
{
Control control = TraverseControlTree(Ctl, Id);
if (control != null) { return control; }
}
return null;
}
这个博客系列可能会有所帮助。了解动态控制
您绝对可以直接添加控件,但必须将它们添加到页面上已有的面板中。如果您试图在运行时直接将控件添加到页面中,则会出现错误。
至于查找控件,您可能需要递归搜索。控件通常是嵌套的,我相信FindControl不会递归搜索,只在当前的命名容器中搜索。
我通过编写这样的代码解决了这个问题:
private void AddControls(ControlCollection page, ArrayList controlList)
{
foreach (Control c in page)
{
if (c is WebChartControl)
{
WebChartControl chart = c as WebChartControl;
controlList.Add(chart);
}
if (c.HasControls())
{
AddControls(c.Controls, controlList);
}
}
}
我在一个页面上搜索所有的网络图表控件,并将它们添加到一个数组中以供稍后使用,但你也可以很容易地按ID搜索,当你找到它时,只需返回;注意,当按ID搜索时,您可能无法执行"control.ID="some string"在测试ID匹配之前,您可能必须将其强制转换为所需的数据类型
您还可以使用的PlaceHolder控件来添加和查找所需的所有控件。
AddControl:
RadioButtonList wRadioButtonList = new RadioButtonList { ID= "myID" };
wRadioButtonList.Items.Add( new ListItem( "Yes", "yes" ) );
wRadioButtonList.Items.Add( new ListItem( "No", "no" ) );
m_plh_PlaceHolde.Controls.Add( wRadioButtonList );
FindControl:
RadioButtonList wRbl = m_plh_PlaceHolde.FindControl("myID" ) as RadioButtonList;