2016-05-02 16 views
0

PlaceHolderを持つマスターページがあります。 メニュー項目を選択すると、ユーザーコントロールascxが動的に読み込まれます。Fire Buttonクリックすると動的にロードされるユーザーコントロール

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が呼び出されることはありません..私は何を参照してください、「レッグ」ボタンのクリックしたときに、マスターページのちょうどリロードです。

+0

あなたはリサイズやC++で、またはASP.NETのWebフォームおよびC#でいますか? – ConnorsFan

+0

ASP.NET。ありがとう –

答えて

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(); 
} 
+0

ViewStateで同じことが分かりました。さて、PlaceHolderの場合に正確に答えたので、あなたの投稿を答えとしてチェックします。しかし、私はPlaceHolderを取り除き、コントロールのVisibleプロパティを使うことにしました... –

1

解決策も公開する必要があります。

私にとって、私はよりよい解決策を見つけたと思う。

ユーザーコントロールの考え方は、パネルに多くの基本コントロールを配置して1つとして使用できるようにすることです.2番目は基本コントロールの値をユーザーが入力しても保持する必要があります。ユーザーコントロールのセット

今すぐ解決してください。 私はすべてのコントロールを作成しましたが、PlaceHolderを使う代わりに、それらを明示的にメインページの同じ場所に配置しましたが、プロパティ "Visible"はFalseに設定しました。 次に、メニュー項目が選択されると、適切なコントロールのVisibleプロパティをTrueに設定します。 したがって、それはタグレジスタを使用するページのコントロールを配置するには。..へはず

として動作します。

<%@ 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" %> 
: 私の例では2つのについてのコントロールと MainPage.aspxでRegInitがあります

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

そして馬で:コード内でその場所の上

以下inPage.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; 
    } 
} 

入力されているすべてのユーザーデータが保持されるので、はるかに優れている、とユーザーがコントロールを切り替えることにより、それらを続けることができます。

私はコナーのソリューションをチェックしますが、私はプレースホルダを取り除くことにしました...

関連する問題