【问题标题】:Load UserControls in a table cell after button click单击按钮后在表格单元格中加载用户控件
【发布时间】:2012-02-16 03:58:34
【问题描述】:

在我的 aspx 页面中有一个只有一行 2 列的表格,例如:

<table runat="server" id="MainTable">
<tr>
<td>

<asp:Button runat="server" Text="Button 1" ID="btn1" OnClick="btn1_Click" />
<asp:Button runat="server" Text="Button 2" ID="btn2" OnClick="btn2_Click" />
<asp:Button runat="server" Text="Button 3" ID="btn3" OnClick="btn3_Click" />

</td>

<td>
<%-- place the user control here -->
</td>

</tr>

</table>

是否可以在单击每个按钮时在第二个单元格中加载用户控件?

例如,如果我单击 Button1,则必须在第二个单元格中加载 UserControl1。 如果我单击 Button2,则必须对 userControl1 进行放电并加载 userControl2,依此类推。

提前致谢。

路易吉

【问题讨论】:

    标签: c# asp.net user-controls


    【解决方案1】:

    在这种情况下,您不应动态加载 UserControl。最好只切换所有控件的Visibility。因此,将三个 UserControl 静态添加到表格单元格中,并最初将它们设为 Visible="false"。然后在每个按钮的单击事件中相应地更改这些属性。

    【讨论】:

      【解决方案2】:

      将用户控件添加到页面非常简单,您可以像加载任何其他控件一样将其加载到页面:

      MyUserControl myControl = (MyUserControl) Page.LoadControl("MyUserControl.ascx");
      
      Page.Controls.Add(myControl);
      

      【讨论】:

      • 应该在何时何地完成(最迟),是只添加一次还是在每次回发时添加,你怎么知道它已经添加了,....?只要这些问题都没有得到回答,就不是很有帮助。除此之外,OP 明确要求将其添加到表格单元格而不是页面中。
      【解决方案3】:

      我非常感谢动态加载它的想法。

      但是您应该仅在需要时加载它,并在完成或第二次单击按钮时将其丢弃,将其丢弃并删除控件,然后再次加载...否则它将始终保留在您的 RAM 中。 ..并且可能导致内存泄漏..

      示例 HTML

      <asp:Table runat="server" ID="MainTable">
          <asp:TableRow>
               <asp:TableCell ID="cell1" runat="server">
                   <asp:Button runat="server" Text="Button 1" ID="btn1" OnClick="btn1_Click" />
                   <asp:Button runat="server" Text="Button 2" ID="btn2" OnClick="btn2_Click" />
                   <asp:Button runat="server" Text="Button 3" ID="btn3" OnClick="btn3_Click" />
               </asp:TableCell>
               <asp:TableCell  ID="cell2" runat="server">
               </asp:TableCell>
          </asp:TableRow>
      </asp:Table>
      

      点击按钮

      cell2.Controls.Add(Your User Control ID);
      

      编辑 - 1

      cell2.Controls.Clear();
      cell2.Controls.Add(Your User Control ID);
      

      【讨论】:

      • 一个页面的所有对象都在Page-Lifecycle结束时被释放,所以没有内存泄漏。动态创建的控件没有任何好处,它让生活变得更加困难。在这种情况下,这是错误的方法,因为用户无法向页面添加控件。他只能让它们可见。 stackoverflow.com/questions/5046101/…
      • 是的,你是对的@Tim,但是控制内存将是活动的(从页面加载后的开始)并且在你的情况下,直到并且除非用户不导航到另一个页面。所以最好按需加载...并在第二次或另一个按钮单击时将其删除并再次加载...
      • 否,属于页面的所有对象(成员变量、控件等)都在页面的生命周期结束时被释放。因此,当用户看到呈现的页面时,它不再存在于服务器的内存中。这就是为什么必须在回发时重新创建每个 控件(甚至是aspx 标记上的静态控件,但这会自动发生)。 HTTP 是无状态的!
      • 我已经同意处置的事项。感谢知识分享。 但是如果你想检查表格单元格中的控件 ID,它已经呈现,你可以使用代码来做到这一点...cell2.Controls[0] 这会给你控件的内存。你可以试一试:)。
      • @Pankaj:我只想澄清不清除 ControlCollection 导致的内存泄漏是不可能的,因为它在回发后已经被清除。所以当用户点击 f.e. bt2 之前由btn1 添加的 UserControl 不存在。
      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      相关资源
      最近更新 更多