C# ASP.NET:通过编程方式添加html控件后在服务器端查找它们
我想做点什么,却遇到了问题 我得到了一个添加html元素和三个属性的函数。 现在,我想得到服务器端的控件(代码隐藏),这样我就可以用它们做一些事情了 我的问题是: 我找不到他们 这是我用来添加它们的函数的一部分,它有点长,所以我只显示我想在服务器端获得的控件:C# ASP.NET:通过编程方式添加html控件后在服务器端查找它们,c#,asp.net,C#,Asp.net,我想做点什么,却遇到了问题 我得到了一个添加html元素和三个属性的函数。 现在,我想得到服务器端的控件(代码隐藏),这样我就可以用它们做一些事情了 我的问题是: 我找不到他们 这是我用来添加它们的函数的一部分,它有点长,所以我只显示我想在服务器端获得的控件: public string EditPhoto(int x) { using (StringWriter stringWriter = new StringWriter()) { using (HtmlT
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();
}
公共字符串编辑照片(int x)
{
使用(StringWriter StringWriter=new StringWriter())
{
使用(HtmlTextWriter编写器=新的HtmlTextWriter(stringWriter))
{
//属性的一些字符串。
字符串classValue=“thumb”;
//Begin#5您完全可以按字面意思添加控件,但必须将它们添加到页面上已经存在的面板中。如果您尝试在运行时直接将控件添加到页面,则会出现错误
至于查找控件,您可能需要递归搜索。控件通常是嵌套的,我相信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);
}
}
}
我在一个页面上搜索所有webchart控件,并将它们添加到一个数组中供以后使用,但您也可以通过ID轻松搜索,当您找到它时,只需返回;
请注意,按ID搜索时,您可能无法执行“control.ID==”某些字符串
在测试ID匹配之前,您可能必须将其强制转换为所需的数据类型您完全可以按字面意思添加控件,但必须将它们添加到页面上已存在的面板之类的内容中。如果您尝试在运行时直接将控件添加到页面,则会出现错误
至于查找控件,您可能需要递归搜索。控件通常是嵌套的,我相信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);
}
}
}
我在一个页面上搜索所有webchart控件,并将它们添加到一个数组中供以后使用,但您也可以通过ID轻松搜索,当您找到它时,只需返回;
请注意,按ID搜索时,您可能无法执行“control.ID==”某些字符串
在测试ID匹配之前,您可能必须将其转换为所需的数据类型本系列博客可能会有所帮助。
本系列博客可能会有所帮助。
检查一下,伙计
您的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;
}
检查一下,伙计
您的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;
}
还可以使用的占位符控件添加和查找所需的所有控件
添加控件:
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;
还可以使用的占位符控件添加和查找所需的所有控件
添加控件:
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;
你不能按字面意思添加服务器控件。它们不会成为页面控件集合的一部分。你是否被锁定在使用HtmlTextWriter添加控件?当然有更简单和可扩展的方法来实现这一点,这将使在控件树中查找它们变得更容易。哦,我不知道。你在建议什么o do?@KodeKreachor你能给我一些例子来更好地添加和查找控件吗?我很想学习新东西!:)当然,请在下面查看我的答案。你不能按字面意思添加服务器控件。它们不会成为页面控件集合的一部分。你是否被锁定使用HtmlTextWriter添加控件?当然有这是一种更简单、可扩展的方法,可以使在控件树中查找控件变得更容易。哦,我不知道。你建议怎么做?@KodeKreachor你能给我一些例子,让我更好地添加和查找控件吗?我很想学习新东西!:)当然,请查看下面的答案,这对sam有帮助y、 因此,您应该将if((htmltexwriter)c.ID==“Title”+x)替换为if(c是WebChartControl)我尝试将WebChartControl更改为HtmlTextWriter,但我无法获取id属性,只能获取HtmlTextWriter类的to函数。我不知道哪个类代表使用HtmlTextWriter添加的控件。啊,HtmlTextWriter不是控件,它是一种创建html元素而不显式创建html控件的方法。您可以创建一个html输入控件,你可以给它一个ID并添加到一个面板中,就像@KodKreachor向你展示的那样。我不确定你是否在使用HtmlTextWriter,使用aspx文本框等更容易。如果你真的必须使用纯html,请创建一个HtmlInputControl并将其添加到你页面上已经存在的面板中。希望这能帮助samy,so-ins除了if(c是WebChartControl),您应该放置if((htmltexwriter)c.ID==“Title”+x)我尝试将WebChartControl更改为HtmlTextWriter,但我无法获取id属性,只能获取HtmlTextWriter类的to函数。我不知道哪个类代表使用HtmlTextWriter添加的控件。啊,HtmlTextWriter不是控件,它是一种创建html元素而不显式创建html控件的方法。您可以创建一个html输入控件,你可以给它一个ID并将其添加到面板中,就像@KodKreachor向你展示的那样。我不确定你是否在使用HtmlTextWriter,使用aspx文本框等更容易做到这一点。如果你真的必须使用纯html,请创建一个HtmlInputControl并将其添加到你页面上已有的面板中