c# - 从后面的代码添加用户控件

标签 c# jquery asp.net user-controls asp.net-4.0

<分区>

我的页面上有一个用户控件(UserControl1)和一个添加更多按钮。单击“添加更多”按钮再次添加相同的用户控件。当我单击第一次用户控件,它添加了第二个用户控件,但第二次它没有添加其他控件。我认为控件丢失了。 我在单击链接按钮时添加了这样的控件:-

protected void lnkadd_Click(object sender, EventArgs e)
{
    HtmlTableCell tCell = new HtmlTableCell();
    UserControl uc = (UserControl)Page.LoadControl("~/Controls/DirectionalPricingCtrl.ascx");
    tCell.Controls.Add(uc);
    tablerow.Cells.Add(tCell);
}

我认为我做错了什么,我应该在页面生命周期方面添加用户控件,但是如何呢? 有人可以指导我或提供一些有用的链接吗? 当我每次单击“添加”按钮然后检索所有值并将其保存到数据库时都必须添加用户控件时,我应该遵循什么方法?

最佳答案

我更喜欢 javascript/ajax 解决方案,但我认为您的代码没有任何问题。

我做了一个小例子。这是与您相同的解决方案。优点是控件仅在单击时加载。

public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnLink_Click(object sender, EventArgs e)
        {
            var uc = (UserControl)Page.LoadControl("~/WebUserControl1.ascx");
            pnl.Controls.Add(uc);            
        }
    }

这是在 Page_Load 事件中加载用户控件的示例,如果单击 (btnLink_Click),则将用户控件添加到面板。它的工作原理与您的解决方案相同,但即使不需要,也可以加载用户控件(在内存中处理而不是重新处理)。

public partial class Default : System.Web.UI.Page
    {
        UserControl uc; 
        protected void Page_Load(object sender, EventArgs e)
        {
           if(IsPostBack) // This condition is not needed but we know that click is always postback
            uc = (UserControl)Page.LoadControl("~/WebUserControl1.ascx");
        }

        protected void btnLink_Click(object sender, EventArgs e)
        {

            pnl.Controls.Add(uc);            
        }
    }

这是我更喜欢的解决方案,它基于可见属性。如果用户控件不可见,则不会呈现为输出。当然,如果表格有很多单元格作为控制容器而不是面板,这不是很实用。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<%@ Register Src="~/WebUserControl1.ascx" TagName="ucrCtrl" TagPrefix="ctr"  %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button ID="btnLink" runat="server" Text="Add" OnClick="btnLink_Click" />
        <asp:Panel runat="server" ID="pnl">
            <ctr:ucrCtrl runat="server" ID="usrCtrl" Visible="false" />
        </asp:Panel>
    </div>
    </form>
</body>
</html>

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnLink_Click(object sender, EventArgs e)
        {
            usrCtrl.Visible = true;     
        }
    }
}

关于c# - 从后面的代码添加用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22729020/

相关文章:

c# - 对已加载到应用程序域中的文件使用反射,而不是(再次)加载每个文件

javascript - 尝试动态设置 MetaTag

JavaScript 在 span 元素上循环,检查它们的值并替换其他节点 border-color

javascript - jQuery GetCity 未定义

asp.net - RegularExpressionValidator 在多行文本框(文本区域)上运行缓慢

c# - 替换字符串中最后一次出现的单词 - C#

c# - 为什么在获取访问 token 时在 C# 中出现 AADSTS50196 请求循环?

c# - 以编程方式获取所有存储过程的简单方法

c# - DotnetCore 1.0.x 中的 TcpListener.BeginAcceptTcpClient I/O 模型是什么

c# - 正确运行 SerializeObject 方法?