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

时间:2009-04-03 14:04:16

标签: asp.net controls

是否有一种可以“移动”控件的方法。

我的客户希望在页面上的几个不同位置之一放置一定量的标记(代表一些视觉元素)。位置不同,我不能影响CSS的变化(通过浮动它或其他东西)。

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

然而,这个控件的代码并不简单 - 例如,有几个模板部分。不得不在多个地方欺骗它会变得笨拙。另外,出于同样的原因,我不想严格地从代码隐藏中使用此控件。

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

有人有更好的主意吗?这是最好的做法吗?

5 个答案:

答案 0 :(得分:5)

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

例如

// Load a user control
MyControl userCtrl = (MyControl) LoadControl("~/Controls/MyControl.ascx");

// Or create an instance of your control
SubclassedControl subclassedCtrl = new SubclassedControl();

// Do stuff with controls here
userCtrl.LoadData();
subclassedCtrl.Text = "Hello World";

// Check which placeholder to add controls to
PlaceHolder placeHolder = (foo=="bar") ? placeHolder1 : placeHolder2;

// Add the controls
placeHolder.Controls.Add(userCtrl);
placeHolder.Controls.Add(subclassedCtrl);

这样可以避免使用不必要的标记使页面混乱,并且在运行时加载它也可以避免以后出现不必要的混淆,当另一个开发人员查看代码并且无法立即看到控件在标记中的某个位置时,但是在页面的完全不同的部分呈现。

答案 1 :(得分:3)

另一种选择(我以前见过多次)是通过javascript和DOM。在隐藏的div标签内渲染控件。所以你要在这里渲染你的内容:

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

然后,假设你想在这里全部移动(span标签在里面,因为那是我们要替换的):

<div id='newlocation1'><span></span></div>

您将定义以下javascript:

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

答案 2 :(得分:2)

Web部件是否可以执行您想要的操作?

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

答案 3 :(得分:1)

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

您只需要向必须在服务器上进行交互的Controls集合添加控件。您可以将其余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();
}

答案 4 :(得分:0)

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

Dim lblDisplay As Label = New Label()
lblDisplay.ID = "myLabel"
lblDisplay.Text = "Some Text"
pnlDisplay.Controls.Add(lblDisplay)

至于......

  

“另外,我不想工作   用这个控件严格来自   代码抛弃也是出于同样的原因。“

我认为你将不得不在后面的代码中完成大部分工作。

PS ..整个用户控件设置的一个很好的例子可以在这里下载.. http://www.asp.net/downloads/starter-kits/time-tracker/