webForumDet fria alternativet

Ladda UserControl ifrån ascx

.NET

11 svar · 439 visningar · startad av Vide

Medlem sedan dec. 19998 577 inlägg
Frågan#1

Hur laddar jag in en UserControl ifrån en UserControl?

Alltså:
Jag har default.aspx som har en PlaceHolder i sig, där laddar jag inte olika UserControls, nu vill jag ifrån en sådan UserControl ladda en annan.

Måste jag på något speciellt sätt skapa en referens till denna PlaceHolder på något annat sätt än när man står på själva sidan som innehåller den?

Nu refererar jag till den såhär (även i en UserControl):

protected System.Web.UI.WebControls.PlaceHolder module;
Medlem sedan dec. 19998 577 inlägg
#2

Jag kanske förklarade lite dåligt, här kommer en mer detaljerad beskrivning av mitt problem:

I default.aspx har jag en PlaceHolder med ID="module":

<asp:PlaceHolder ID="module" Runat="server" />

I CodeBehind refererar jag till kontrollen såhär:

protected System.Web.UI.WebControls.PlaceHolder module;

... och ändrar dess innehåll såhär:

module.Controls.Add(Page.LoadControl( "sidan.ascx" ));

Nu till problemet, jag vill i denna sidan få access till min PlaceHolder "module", hur skriver jag referensen i sidan.ascx?

Detta fungerar ju inte eftersom det inte ligger på samma sida:

protected System.Web.UI.WebControls.PlaceHolder module;

Någon som har någon idé om hur man kan lösa detta?

Medlem sedan juni 20022 599 inlägg
#3

Nu kan jag inte ASP.NET så bra, så med viss risk för att göra bort mig:

this.Parent.FindControl(" ..

Eller nåt liknande?

Medlem sedan mars 20023 561 inlägg
#4
(([i]<klass>[/i])Page).FindControl("[i]<kontroll>[/i]");

Tror jag. ;)

Medlem sedan dec. 19998 577 inlägg
#5

Tack för svaren, nu börjar jag komma närmare, men jag har fortfarande problem, med denna kod får jag felmeddelandet:

ASP.NET skrev:

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

	  protected [url][i]mynamespace[/i]._default[/url] _default;
	  protected System.Web.UI.WebControls.Label testlabel;

		private void Page_Load(object sender, System.EventArgs e)
		{
			testlabel.Text = _default.FindControl( "module" ).ToString();
		}

Den pekar på raden där jag försöker att accessa "module", den verkar alltså inte hitta kontrollen.

Medlem sedan dec. 20003 887 inlägg
#6

Tja... jag gör så här - för att svara lite på din första fråga. Inte för att vi verkar göra på samma sätt, men här är ett sätt (har inte hunnit byta metod än ;)) att göra det hela på.

default.aspx

<%@ Page Src="default.aspx.cs" Inherits="cPage" %>

<body>
  <asp:PlaceHolder id="phID" runat="server/>
</body>

default.aspx.cs

using System;
using System.Web.UI.WebControls;

public class cPage : Page
{
  protected PlaceHolder phID;

  public void Page_Load(object objSrc, EventArgs e)
  {
    phID.Controls.Add(Page.LoadControl("usercontrol.ascx"));
  }
}

usercontrol.ascx

<%@ Control Src="usercontrol.ascx.cs" Inherits="cPage" %>

<asp:UserControl id="objPH" runat="server"/>

usercontrol.ascx.cs

using System;
using System.Web.UI.WebControls;

public class cPage : System.Web.UI.UserControl
{
  protected PlaceHolder objPH;

  public void Page_Load(object objSrc, EventArgs e)
  {
    objPH.Controls.Add(Page.LoadControl("somecontrol.ascx"));
  }
}

Hur du sedan accessar kontrollerna är upp till dig ;) men i stort så är det "bara" att stoppa in dina kontroller som protected-variabler i klassen - ungefär som min protected PlaceHolder objPH;

Förövrigt funderar jag på om jag höll tungan rätt i munnen nu... :)

Medlem sedan dec. 19998 577 inlägg
#7

Så skulle man kunna göra, men då tappar man funktionaliteten att sköta inladdningar ifrån default.aspx, att en sånhär operation skall skötas i flera steg känns helt enkelt fel.

Men jag tror jag är inne på rätt spår som jag skriver ovan, det är bara det lilla att den inte hitta objektet. ;)

Medlem sedan dec. 20003 887 inlägg
#8

Jag sköter inladdningarna från default.aspx.cs och har några placeholders i default.aspx. Resten är codebehind och usercontrols, som det ser ut nu och det var så jag uppfattade att du hade det. Men det kanske har ändrat sig en del sedan första inlägget... :) Iofs bestod mitt svar i att nästla usercontrols...

Medlem sedan dec. 19998 577 inlägg
#9

Du laddade ju UserControls ifrån UserControls, det var precis det jag ville bort ifrån. ;)

Det enda jag vill är att få en referens till default-klassens kontroller för att kunna ladda in kontroller direkt ifrån toppen, utan att behöva nästla eller gå via annan funktionalitet.

Medlem sedan dec. 20003 887 inlägg
#10

Ok... jag tror jag missuppfattade en mening :)

Vide skrev:

Jag har default.aspx som har en PlaceHolder i sig, där laddar jag inte olika UserControls, nu vill jag ifrån en sådan UserControl ladda en annan.

Den är en aning diffus ;)

Medlem sedan dec. 19998 577 inlägg
#11

Håller med :e

Default.aspx innehåller en PlaceHolder.
Denna PlaceHolder laddar in olika UserControls.
Ifrån en sådan UserControl vill jag "byta ut" den inladdade UserControlen mot en annan.

Medlem sedan dec. 20003 887 inlägg
#12

Ok... då är jag rädd för att du kommer till att sluta ungefär här

Exception Details: System.Web.HttpException: A control cannot modify its parents' control collections.

om du vill "byta ut".

Annars så kan du referera till din placeholder med

[u]usercontrol.aspx.cs[/u]
public class cTjohoo : System.Web.UI.UserControl
{
  private PlaceHolder objPH;

  public void Page_Load(object objSrc, EventArgs e)
  {
    objPH = (PlaceHolder) this.Page.FindControl("[i]yourplaceholdergoeshere...[/i]"))
  }
}
283 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
147 ms — ändringar (db)