Gå til innhold

Anbefalte innlegg

Heisan folkens.

Jeg sliter litt med repeater controllen for jeg får ikke dette helt til. Jeg har sett et eksempel på nettet som bruker følgende teknikk for å fylle en nestet repeater.

	public void ShowMenuItems(Object sender, RepeaterItemEventArgs e)
{
	if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
	{
		((Repeater)e.Item.FindControl("RepeaterLeftMenuItems")).DataSource =
			((DataRowView)e.Item.DataItem).CreateChildView("MenuItemRelations");
		((Repeater)e.Item.FindControl("RepeaterLeftMenuItems")).DataBind();
	}
}

Er det ikek en litt bedre måte å gjøre dette på? Dette krever jo at teksten som skrives i "" er korrekt i forhold til det som står i HTML dokumentet. Rimelig håpløst. Må da være mulig å gjøre dette på en annen måte?

Lenke til kommentar
Videoannonse
Annonse

Vel... du kan finne den første repeateren og bruke den istedenfor den navngitte....

 

public void ShowMenuItems(Object sender, RepeaterItemEventArgs e)
{
	if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
			return;

	Repeater rep = RecursiveFindControl(e.Items,typeof(Repeater)) as Repeater;
	if( rep == null ) throw new ArghException("Argh! En eller annen håpløs designer har fucket opp og fjernet repeateren!!!!  :@   ");
	rep.DataSource = etc.....;
}

private Control RecursiveFindControl(Control ctrl, Type t)
{
	foreach(Control c in ctrl.Controls)
			if( c.GetType().Equals(t) )
					return c;
	foreach(Control c in ctrl.Controls)
	{
			Control res = RecursiveFindControl(c, t);
			if( res.GetType().Equals(t) )
					return res;
	}
	return null;
}

 

Ikke testet, men om det er noen småfeil klarer du nok å fikse dem selv.... :thumbup:

 

btw; Se på koden min og se at jeg snur om på den første IF setningen og bruker return. Ved å gjøre det på denne måten vil du få mer ryddig og lesbar kode.

Endret av jorn79
Lenke til kommentar
Vel... du kan finne den første repeateren og bruke den istedenfor den navngitte....

 

public void ShowMenuItems(Object sender, RepeaterItemEventArgs e)
{
	if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
			return;

	Repeater rep = RecursiveFindControl(e.Items,typeof(Repeater)) as Repeater;
	if( rep == null ) throw new ArghException("Argh! En eller annen håpløs designer har fucket opp og fjernet repeateren!!!!  :@   ");
	rep.DataSource = etc.....;
}

private Control RecursiveFindControl(Control ctrl, Type t)
{
	foreach(Control c in ctrl.Controls)
			if( c.GetType().Equals(t) )
					return c;
	foreach(Control c in ctrl.Controls)
	{
			Control res = RecursiveFindControl(c, t);
			if( res.GetType().Equals(t) )
					return res;
	}
	return null;
}

 

Ikke testet, men om det er noen småfeil klarer du nok å fikse dem selv.... :thumbup:

 

btw; Se på koden min og se at jeg snur om på den første IF setningen og bruker return. Ved å gjøre det på denne måten vil du få mer ryddig og lesbar kode.

Uhm - dette er en snedig rutine, men hjelper ikke for meg siden jeg er ute etter en repeater som er inne i en annen repeater. Jeg kan jo selvsagt slenge inn et flagg som forteller at man er i den ytterste repeateren. Det vilkansje gå. Det må jeg teste!!

Lenke til kommentar
Uhm - dette er en snedig rutine, men hjelper ikke for meg siden jeg er ute etter en repeater som er inne i en annen repeater. Jeg kan jo selvsagt slenge inn et flagg som forteller at man er i den ytterste repeateren. Det vilkansje gå. Det må jeg teste!!

 

Det er jo akuratt det den gjør jo :-P

Finner første repeateren som er inni hver RepeaterItem'n...

 

Akuratt samme som din kode gjør, bare uten å spesifisere navnet på repeateren.

Endret av jorn79
Lenke til kommentar
Uhm - dette er en snedig rutine, men hjelper ikke for meg siden jeg er ute etter en repeater som er inne i en annen repeater. Jeg kan jo selvsagt slenge inn et flagg som forteller at man er i den ytterste repeateren. Det vilkansje gå. Det må jeg teste!!

 

Det er jo akuratt det den gjør jo :-P

Finner første repeateren som er inni hver RepeaterItem'n...

 

Akuratt samme som din kode gjør, bare uten å spesifisere navnet på repeateren.

Vist påkker. Ser det nå. Takker...

Lenke til kommentar

Hmm. Var nok ikke så enkelt alikevel :-(

Her er koden jeg har:

	public partial class MasterPage : System.Web.UI.MasterPage
{
	protected UserSecurityManager ThisSecurity = new UserSecurityManager();
	protected MenuDBDataContext mDB = new MenuDBDataContext();
	//protected MenuManager ThisMenu = new MenuManager();

	protected void Page_Load(object sender, EventArgs e)
	{
		if (Page.IsCallback == false)
		{
			// Initiated page loading
	  //	  ThisMenu.RefreshMenu();
	  //	  RepeaterLeftMenu.DataSource = ThisMenu.MenuList;
	  //	  RepeaterLeftMenu.DataBind();
			var LeftMenues = from m in mDB.Menus
							 select m;

			RepeaterLeftMenu.DataSource = LeftMenues;
			RepeaterLeftMenu.DataBind();

		}
	}

	protected void RepeaterLeftMenu_ItemDataBound(object sender, RepeaterItemEventArgs e)
	{
		// Adding items to the current menu
		if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
			return;

		Repeater r = Helpers.RecursiveFindControl(e.Item, typeof(Repeater)) as Repeater;
		if (r == null) throw new Exception("Argh! The repeater design is destroyed!!!");

		r.DataSource =  HVA SKAL STÅ HER MÅN TRO?

	}

}

Som du ser så sliter jeg litt med å finne ut hva DatasSource skal være

edit: Glemte å si at det er en relasjon til Menu_Items i denne Linq greia, slik at Menus->>Menu_Items

Endret av HDSoftware
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...