【问题标题】:Load user control dynamically on Button Click在按钮单击时动态加载用户控件
【发布时间】:2013-01-08 02:03:44
【问题描述】:

我在用户控件中添加了一个标签和一个文本框。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AddMultiLoc.ascx.cs" Inherits="CRM_Streamline_Forms.UserControls.AddMultiLoc" %>
<table>
<tr>
    <td style="width:25%">
        <asp:Label ID="lblLocName_UC_G0138" runat="server" Text="Location Name:" />
    </td>
    <td style="width:25%">
        <asp:TextBox ID="txtLocName_UC_G0138" runat="server" Width="200px" />
    </td>
    <td style="width:25%">
        <asp:Label ID="lblLocID_UC_G0138" runat="server" Text="Location ID:" />
    </td>
    <td style="width:25%">
        <asp:TextBox ID="txtLocID_UC_G0138" runat="server" Width="200px" />
    </td>
</tr>

我的一个 aspx 页面中有一个链接按钮,单击该按钮时应填充此用户控件。

<asp:LinkButton ID="lnkAddLoc_AGBI2_G0138" runat="server" Text="+ Add Another Location" onclick="lnkAddLoc_AGBI2_G0138_Click" />

后面的代码,我为按钮点击写了这段代码:

protected void lnkAddLoc_AGBI2_G0138_Click(object sender, EventArgs e)
    {
        AddMultiLoc con = (AddMultiLoc)LoadControl("~/UserControls/AddMultiLoc.ascx");
        pnlMultiInvoiceInfo1_AGBI2_G0138.Controls.Add(con);
        Panel p = new Panel();
        Control uc = (Control)Page.LoadControl("~/UserControls/AddMultiLoc.ascx");
                    p.Controls.Add(uc);
                    p.Width = 200;
                    p.Height = 100;
                    pnlMultiInvoiceInfo1_AGBI2_G0138.Controls.Add(p);
    }

第一次填充用户控件时,我在 aspx 页面中调用它,但第二次单击链接按钮时,它没有第二次填充用户控件。编码新手,请帮忙:(

【问题讨论】:

  • 我在下面提供了一个工作示例。这有什么更新吗?
  • 我回复了您的回答,对不起...我无法使用会话,因为这些页面将托管在 CRM 上,并且 CRM 是无状态的...有人告诉我不要使用会话对象:(跨度>
  • 谢谢。您确实应该最初发布该信息。
  • 我很抱歉..我很抱歉,我是这些论坛的新手,我犯了错误,我现在明白了。下次小心点..:(
  • 无需道歉。您为什么不发布您所说的有效代码并与我们其他人分享信息。此外,当您收到正确答案时,您应该标记您的问题已回答!

标签: asp.net html c#-4.0


【解决方案1】:

我认为问题是当控件加载到 ViewState 时,您在回发过程中丢失了控件。

这是一个示例,您可以在其中将控件加载到 Session 中,这不是很好的做法,但它可以满足您的目的:

AddMultiLocPage.aspx

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:LinkButton ID="lnkAddLoc_AGBI2_G0138" runat="server" Text="+ Add Another Location" OnClick="lnkAddLoc_AGBI2_G0138_Click" />
        </div>
        <asp:PlaceHolder runat="server" ID="Placeholder1"></asp:PlaceHolder>
    </form>
</body>
</html>

AddMultiLocPage.aspx.cs

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

    private List<AddMultiLoc> ViewStateControls
    {
        get { return (List<AddMultiLoc>) Session["ViewStateControls"]; }
        set { Session["ViewStateControls"] = (List<AddMultiLoc>)value; }
    }

    private void LoadControlsFromSession()
    {
        if (ViewStateControls != null)
        {
            Placeholder1.Controls.Clear();

            foreach (var c in ViewStateControls)
            {
                Placeholder1.Controls.Add(c);
            }
        }
    }

    protected void lnkAddLoc_AGBI2_G0138_Click(object sender, EventArgs e)
    {
        var con = (AddMultiLoc)LoadControl("~/AddMultiLoc.ascx");
        con.ID = Guid.NewGuid().ToString();

        List<AddMultiLoc> tmpList = ViewStateControls;
        if(tmpList == null) tmpList = new List<AddMultiLoc>();
        tmpList.Add(con);
        ViewStateControls = tmpList;

        LoadControlsFromSession();
    }
}

用户控件标记

<table>
    <tr>
        <td style="width: 25%">
            <asp:Label ID="lblLocName_UC_G0138" runat="server" Text="Location Name:" />
        </td>
        <td style="width: 25%">
            <asp:TextBox ID="txtLocName_UC_G0138" runat="server" Width="200px" />
        </td>
        <td style="width: 25%">
            <asp:Label ID="lblLocID_UC_G0138" runat="server" Text="Location ID:" />
        </td>
        <td style="width: 25%">
            <asp:TextBox ID="txtLocID_UC_G0138" runat="server" Width="200px" />
        </td>
    </tr>
</table>

【讨论】:

  • 我的问题是我无法使用会话,因为这些页面将托管在 CRM 中并且 CRM 是无状态的...请解释...
  • @user1742152 该信息应该在您的原始帖子中!
  • 对此我很抱歉。我有一个解决方法,很快就会发布。
【解决方案2】:

无需在会话中存储控制,您的问题的解决方案是:

ASPX 代码:

< asp:LinkButton ID="lnkAddLoc_AGBI2_G0138" runat="server" Text="+ Add Another Location" onclick="lnkAddLoc_AGBI2_G0138_Click" />
    <asp:Panel ID="Panel1" runat="server">

代码背后:

protected void lnkAddLoc_AGBI2_G0138_Click(object sender, EventArgs e)
    {
        Control uc = (Control)Page.LoadControl("~/AddMultiLoc.ascx");
        Panel1.Controls.Add(uc);
    }

任何时候您点击链接按钮 lnkAddLoc_AGBI2_G0138 它都会将用户控件的新实例添加到 Panel1。

【讨论】:

  • 鉴于您的代码和他的组合,这对我不起作用。你测试过这个吗?你能举一个完整的工作例子吗?
  • 这是一个完美的例子。在我的代码中,用户控件是在应用程序的根目录中创建的。您需要在 LoadControl("~/AddMultiLoc.ascx") 调用中更改用户控件的路径,并且不要将我发布的代码与它必须在此处正常工作的任何其他代码合并。
  • 好的。然后发布所有代码。即您的网络表单、代码隐藏和用户控制以及代码隐藏,让我们看看这个工作示例。
  • 您好,它工作得很好,但只是第一次。第二次我点击添加另一个位置链接按钮,它没有做任何事情......
  • @Seany84 : 我认为没有必要发布完整的 webform 代码,因为除了框架生成的默认代码之外没有额外的代码,只有我发布的代码足以解决问题该用户控件在第二次单击后消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2018-02-14
  • 2014-08-10
相关资源
最近更新 更多