29. januar 2007 - 14:31Der er
9 kommentarer og 1 løsning
Gruppere elementer/servercontrols
Hej,
Jeg er sikker på dette er muligt, men ved ikke helt hvordan. Kan jeg, hvis jeg har forskellige tabeller på min side med tekstboxe og andre servercontrols, så tilføje de forskellige komponenter til "grupper" eller noget lignende. Og så i en event sige f.eks.
group1.visible = False
Ligesom man kan smide det i en Panel og så sige panel1.visible = false. I mit tilfælde ligger det forskellige bare spredt på siden, så jeg kan ikke komme det i et panel.
For at skjule flere kontroller af gangen, er du nok nødt til at placere dem inden for et Panel eller et View. Men hvis de er spredt ud over siden, kan jeg godt se problemet.
Du kan evt. lave noget med en liste hvor du parer et kontrol ID med et gruppenavn, og så lave nogle metoder der tager et gruppenavn som parameter, og løber listen af kontroller i den gruppe igennem.
Hej - okay, den med listen lyderlidt komplex. Kan man egentlig ikke bare sætte ID og runat="server" på sine table eller td og så sige td1.visible="false"?
Hvis du vil lave en generel løsning - så kunne du lave en extender kontrol der kunne udvide standard kontrollerne med muligheden for at give dem f.eks. et VisibilityGroupId - og så kunne du sætte noget Show/Hide funktionalitet på extenderen. På den måde kunne du benytte den i designeren.
Det kan også laves med en liste som allerede nævnt, men det giver dig ikke designermuligheden.
Listemodellen kunne du lave som noget i denne stil (ikke at jeg tror det giver dig så rasende meget, men det kan da være det er lidt rarere på den måde).
public class VirtualPanel { private Dictionary<string, List<Control>> groupsAndControls;
public VirtualPanel() { groupsAndControls = new Dictionary<string, List<Control>>(); }
public void Add(string groupName, Control control) { if(!(groupsAndControls.ContainsKey(groupName))) { groupsAndControls.Add(groupName, new List<Control>()); } if (!(groupsAndControls[groupName].Contains(control))) { groupsAndControls[groupName].Add(control); } }
public void Remove(string groupName, Control control) { if (!(groupsAndControls.ContainsKey(groupName))) return; if (groupsAndControls[groupName].Contains(control)) { groupsAndControls[groupName].Remove(control); } }
public void Show(string groupName) { foreach (WebControl c in groupsAndControls[groupName]) { c.Visible = true; } }
public void Hide(string groupName) { foreach (WebControl c in groupsAndControls[groupName]) { c.Visible = false; } } }
Du skal jo så proppe de kontroller du vil arbejde med ind i listen - du kan have sådan en her på din page-klasse:
private VirtualPanel grouper = new VirtualPanel();
Og smide de kontroller du vi arbejde med ind i listen: grouper.Add("g1", TextBox1); grouper.Add("g1", Button1); grouper.Add("g2", Button2);
Og du kan så lave en grouper.Show("g1"); og grouper.Hide("g2); Og den slags.
Du kan også basere det på WebControls istedet - så får du muligheder som: c.Style[HtmlTextWriterStyle.Visibility] = "visible"; istedet for c.Visible = true;
Men hvis du bedst kan lide den sidste - skulle du nok overveje at lave det hele clientside.
Jeg vil gerne sige undskyld for den sene respons, jeg kan bruge din løsning, men kom lige væk fra den da jeg havde travlt.. Det er super du gad at udspecificere den så meget. Smid gerne et svar her :-)
Jeg bliver nødt til at lukke ned her. Men skriv hvis du vil have points...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.