如何在运行时将ASP.Net控件移动到Web窗体上的不同位置?

如何在运行时将ASP.Net控件移动到Web窗体上的不同位置?,asp.net,controls,Asp.net,Controls,是否有可接受的方法“移动”控件 我的客户机希望在页面上的几个不同位置中的一个位置放置特定的标记块(表示某些视觉元素)。位置不同,我无法影响CSS上的更改(通过浮动或其他方式) 我考虑将控件放置在多个位置,将Visible设置为“false”,然后将其显示在特定页面所需的位置 但是,该控件的代码并不简单——例如,有几个模板部分。必须在多个地方重复这一点会变得很麻烦。另外,出于同样的原因,我不想严格地从代码背后使用此控件 所以,我想把它放在Web表单的一个地方,根据我想要的位置移动它。我是否可以将占

是否有可接受的方法“移动”控件

我的客户机希望在页面上的几个不同位置中的一个位置放置特定的标记块(表示某些视觉元素)。位置不同,我无法影响CSS上的更改(通过浮动或其他方式)

我考虑将控件放置在多个位置,将Visible设置为“false”,然后将其显示在特定页面所需的位置

但是,该控件的代码并不简单——例如,有几个模板部分。必须在多个地方重复这一点会变得很麻烦。另外,出于同样的原因,我不想严格地从代码背后使用此控件

所以,我想把它放在Web表单的一个地方,根据我想要的位置移动它。我是否可以将占位符放在不同的位置,将控件放在一个位置,然后将其删除并添加到正确的位置?我怀疑这会奏效


有人有更好的主意吗?这方面有最佳实践吗?

Web部件做了您想做的事情吗


或者,您可以通过编程方式更改控件的父控件,将其移动到单独的区域。

您可以始终将面板放置在预定义的位置,并在运行时将控件添加到特定的面板中。。下面是添加标签的示例(标签可以替换为任何控件)

至于

“还有,我不想工作 有了这个严格的控制,从 出于同样的原因,代码隐藏。”

我认为您将不得不在代码隐藏中完成大部分工作

附言。。整个usercontrol设置的一个很好的例子可以在这里下载。。

您可以覆盖Render方法,并将控件放置在html中任何需要的位置

您只需要将控件添加到必须在服务器上交互的控件集合中。HTML的其余部分可以直接写入响应流。如果覆盖“渲染”,则可以创建您认为合适的html,并按任意顺序放置控件

下面是一个如何写出html的示例

protected override void Render(HtmlTextWriter writer)
{
  AddAttributesToRender(writer);
  writer.RenderBeginTag(TagKey);

  writer.RenderBeginTag(HtmlTextWriterTag.Div);
  _control.RenderControl(writer);
  writer.RenderEndTag();

  writer.RenderEndTag();
}

我建议使用占位符控件,将标记移动到单独的用户控件中,然后在运行时加载该控件并将其添加到相关占位符中

例如

这将避免页面被不必要的标记弄得乱七八糟,并且在运行时加载它也将避免以后出现不必要的混乱,当其他开发人员查看代码时,无法立即看到控件为什么位于标记中的一个位置,而呈现在页面的完全不同的部分时。

另一种方法是(我以前见过多次)是通过javascript和DOM实现的。在隐藏的div标记中呈现控件。因此,您可以在此处呈现内容:

<div id='rendercontent' style='display:none'>
  .. control here ..
</div>

…在这里控制。。
然后,假设您想将其全部移到这里(span标记在里面,因为这是我们要替换的):


您可以定义以下javascript:

<script language="JavaScript">
function replaceNode(newElementID, targetElementID)
{
    var targetElement=document.getElementById(targetElementID);
    var newElement=document.getElementById(newElementID);
    targetElement.replaceChild(newElement, targetElement.firstChild);
}
</script>

函数replaceNode(newElementID、targetElementID)
{
var targetElement=document.getElementById(targetElementID);
var newElement=document.getElementById(newElementID);
targetElement.replaceChild(新元素,targetElement.firstChild);
}
如果要将内容移动到新位置,请拨打:

<script language="JavaScript">
replaceNode('rendercontent','newlocation1');
</script>

replaceNode('rendercontent','newlocation1');

我的意思是我不想从代码隐藏中创建它。我从代码隐藏中以某种形式操作它没有问题,但我希望它的大部分标记在Web表单中。我建议您创建一个带有标记的用户控件,该标记具有您可以获取/设置并加载面板的属性。没有充分的理由让您的标记处于空白状态如果控件是标准ASP.Net控件的扩展名,因此它在App_代码中作为.cs文件存在,我将如何执行此操作?我是否需要将其“包装”到用户控件(一个.ascx文件)中?是的,然后您可以将其加载到占位符或面板中。相同的区别是,只有面板在占位符没有的地方吐出div或span标记。如果您正在对标准ASP.NET控件进行子类化,则可以创建控件的实例,而不是加载控件,然后将其添加到占位符中。我已更新了代码示例以上就是对此的反映。
<div id='newlocation1'><span></span></div>
<script language="JavaScript">
function replaceNode(newElementID, targetElementID)
{
    var targetElement=document.getElementById(targetElementID);
    var newElement=document.getElementById(newElementID);
    targetElement.replaceChild(newElement, targetElement.firstChild);
}
</script>
<script language="JavaScript">
replaceNode('rendercontent','newlocation1');
</script>