HDSoftware Skrevet 31. juli 2008 Del Skrevet 31. juli 2008 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
j000rn Skrevet 31. juli 2008 Del Skrevet 31. juli 2008 (endret) 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.... 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 31. juli 2008 av jorn79 Lenke til kommentar
HDSoftware Skrevet 1. august 2008 Forfatter Del Skrevet 1. august 2008 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.... 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
j000rn Skrevet 1. august 2008 Del Skrevet 1. august 2008 (endret) 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 1. august 2008 av jorn79 Lenke til kommentar
HDSoftware Skrevet 2. august 2008 Forfatter Del Skrevet 2. august 2008 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
HDSoftware Skrevet 3. august 2008 Forfatter Del Skrevet 3. august 2008 (endret) 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 3. august 2008 av HDSoftware Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå