从代码后台添加用户控件

4

我在页面上有一个用户控件(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);
}

我认为我在做某些事情时出了问题,我应该根据页面生命周期添加用户控件,但是怎么做呢? 有人能指导我或提供一些有用的链接吗? 每次单击“添加”按钮并稍后检索所有值并保存到数据库时,我应该遵循什么方法来添加用户控件?

3个回答

5
我更喜欢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;     
        }
    }
}

你能给我一些链接帮助我找到 AJAX/Jquery 的解决方案吗? - user3379116

0

你想得没错,由于缺少应该处理回发的过程,你的控件会丢失。每当你定义一个控件类的变量,比如HtmlTableCell,你都应该自己处理保存和加载数据所需的所有过程,而不是使用asp.net运行时引擎提供的预定义过程。

最好在每次Postback期间将这些控件保存在一些存储位置中,例如ViewState,在PageLoad上进行处理,然后在lnkadd_Click方法中处理添加/删除额外的控件。


0

您编写的通过编程方式添加控件的代码是正确的。可以尝试执行以下操作:

tablerow.Cells.Add(tCell);

而不是将其添加到控件中。这看起来像是一个控件渲染问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接