从代码隐藏添加用户控件
本文关键字:用户 控件 添加 隐藏 代码 | 更新日期: 2023-09-27 17:55:14
我的页面上有一个用户控件(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;
}
}
}
以编程方式添加控件的代码是正确的。尝试做,
tablerow.Cells.Add(tCell);
而不是将其添加到控件中。 这看起来像一个控件呈现问题。
您认为正确,但由于缺少应处理回发的过程,您的控件会丢失。每当定义控件类(如 HtmlTableCell)的变量时,都应自行处理从已发布页面保存和加载数据所需的所有过程,而不是使用运行时引擎提供的预定义过程 asp.net 而不是使用预定义的过程。
最好在回发期间在某些存储位置保存和加载这些控件,例如 PageLoad 上每次回发时的 ViewState,然后在lnkadd_Click方法中处理添加/删除额外控件。