Fire按钮单击动态加载的用户控件

时间:2016-05-02 06:44:58

标签: asp.net

有一个包含PlaceHolder的母版页。 选择菜单项时,它会动态加载用户控件ascx。

PlaceHolder1.Controls.Clear();
PlaceHolder1.Controls.Add("pages/MyControl.ascx");

但MyControl上有一个按钮,其源代码中有一条记录

 <asp:Button ID="reg" runat="server" OnClick="reg_Click" Text="Reg" Width="207px" />

此外,回调是MyControl的代码隐藏。

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

    }

    protected void reg_Click(object sender, EventArgs e)
    {
        // never comes here
    }
}

但是从不调用reg_Click ..我看到的,只是在点击“Reg”按钮时重新加载母版页。

2 个答案:

答案 0 :(得分:1)

我也必须发布我的解决方案。

至于我,我认为我找到了更好的解决方案。

用户控制的想法是能够在面板上放置许多基本控件并将它们用作一个,第二个 - 基本控件中的值应该保留,无论用户输入什么,而他切换集合用户控件。

现在的解决方案。 我刚刚创建了所有控件,但是我没有使用PlaceHolder,而是将它们明确地放在Main Page的同一个地方,但是将“Visible”属性设置为False。 然后,当选择菜单项时,我只是将适当控件的属性Visible设置为True。 因此,它应该工作..

要放置页面控件,请使用标记注册: 在我的示例中, MainPage.aspx 中有2个控件关于和RegInit:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MainPage.aspx.cs" Inherits="MyApp.MainPage" %>
<%@ Register TagPrefix="uc" TagName="About" Src="~/controls/About.ascx" %>
<%@ Register TagPrefix="uc" TagName="RegInit" Src="~/controls/RegInit.ascx" %>

以下是他们在代码中的位置:

        <uc:About id="about" runat="server" Visible="true" />
        <uc:RegInit id="regInit" runat="server" Visible="false" />

MainPage.aspx.cs

protected void MainMenu_ItemClick(object sender, MenuEventArgs e)
{
    if (e.Item.Text == "ABOUT")
    {
        about.Visible = true;
        regInit.Visible = false;
    }
    if (e.Item.Text == "REGISTER")
    {
        regInit.Visible = true;
        about.Visible = false;
    }
}

它要好得多,因为保留了输入的所有用户数据,用户可以通过切换控件来继续使用它们。

我会勾选Connor的解决方案,但我决定摆脱PlaceHolder ......

答案 1 :(得分:0)

选择菜单命令后,必须在每次回发时在PlaceHolder中加载用户控件。如果已选择菜单命令,您可以在Session变量中记住。

// Property giving the show/hide status of the user control
private bool ShouldLoadMyControl
{
    get { return Session["LoadMyControl"] != null && (bool)Session["LoadMyControl"]; }
    set { Session["LoadMyControl"] = value; }
}

// Load the control on every postback (if option selected)
protected void Page_Load(object sender, EventArgs e)
{
    if (ShouldLoadMyControl)
    {
        LoadMyControl();
    }
}

// Utility function to load the user control
private void LoadMyControl()
{
    PlaceHolder1.Controls.Add(LoadControl("pages/MyControl.ascx"));
}

// Event handler for the command to show the control
protected void mnuLoadMyControl_Click(object sender, EventArgs e)
{
    if (!ShouldLoadMyControl)
    {
        ShouldLoadMyControl= true;
        LoadMyControl();
    }
}

// Event handler for a command to hide the control
protected void mnuHideMyControl_Click(object sender, EventArgs e)
{
    ShouldLoadMyControl= false;
    PlaceHolder1.Controls.Clear();
}