Gathering of Tweakers

Quicksearch
Ik zou graag jullie raad vragen wat betreft het maken van een custom control in ASP.NET. M'n klant wil in een generieke database tabel verschillende typen 'items' opslaan. Er zijn een aantal vooraf gedefinieerde items en de klant krijgt de mogelijkheid om eigen item typen aan te maken. De tabel bevat een aantal generieke velden, maar die zijn niet voor ieder type van toepassing.

Nu wil ik een control maken die de volgende mogelijkheden biedt:
- Selectie van een item type
- Invoer van de relevante velden. Bij de vooraf gedefinieerde typen moet een specifieke interface komen, bij de rest wordt een generieke interface gebruikt met alle invoervelden beschikbaar

Voor het bekijken / bewerken van reeds bestaande items geldt hetzelfde: specifieke lay-out voor bepaalde types, generieke voor de rest.

Vergelijk het bijvoorbeeld met het toevoegen van een item in outlook, waarbij een taak/agenda afspraak ieder hun eigen lay-out hebben maar onderhuids wel van hetzelfde type afstammen.


Nu is dus de vraag: maak ik het beste voor ieder type een eigen control (veel werk en lastig te onderhouden) of is het handiger om alle lay-outs onder te brengen in één control die dan verder a.d.h.v. het type uitzoekt wat ie moet laten zien? Bij die laatstse vraag ik me af wat een handige methode is en vrees ik ervoor dat de lay-out (.ascx) file dan wel ernstig groot / onoverzichtelijk gaat worden.
 
Perception is reality.
Berichten: 2429
Reg. datum: 01 maart 2000

het is hier helemaal niet verkeerd om verschillende usercontrols te hebben. Zo houd je de layout en functionaliteit mooi afgebakend. Ik moet wel zeggen dat er net iets te weinig info is om een goede beoordeling te kunnen maken. Als het alleen layout technisch is kan ik me voorstellen dat er alleen een andere stylesheet nodig is. Of een xml/xslt combinatie. Meerdere wegen dus die naar Rome leiden.
100% Insane
Berichten: 339
Reg. datum: 04 september 2005

Kun je niet een generieke control maken welke al het gemeenschappelijke gedrag/layout bevat? Een soort van superklasse zeg maar. Vervolgens maak je voor de specifieke type sub-controls, welke erven van de generieke control?
 
Maar je hoeft toch helemaal geen aparte controls te maken. Volgens mij is slechts 1 'properties' control voldoende. Je kunt toch aan de hand van een 'specificatie' bestand gewoon wat controls toevoegen. Ik neem aan dat de informatie welke kan worden ingevoerd vrij beperkt zal zijn tot teksten, nummers en datums.

Even 'snel' in code
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public enum CustomPropertyType { TextNumberDate }

public class CustomProperty : WebControlIPostbackDataHandler
{
   public string Name { getset; }
   public object Value { getset; }
   public CustomerPropertyType Type { getset; }
}

public class PropertyGrid
{
   protected List<CustomPropertycustomProperties = new List<CustomProperty>();
   public override void OnPreRender()
   {
         Table t = new Table();
         RenderDefaultControls(t); //<-- deze methode moet je standaard properties in de tabel zetten..
         RenderCustomProperties(t);

         Content2.Controls.Add(t); // add table to ContentPlaceHolder 'MainContent' (Content2)
   }

   private void RenderCustomProperties(Table t)
   {
        foreach(CustomProperty prop in customProperties)
        {
             TableRow tr = new TableRow();
             
             //show name using a label
             Label name = new Label();
             name.Text = prop.Name;
             TabelCell tdName = new TableCell();
             tdName.Controls.Add(name);

             //show input control for property
             TableCell tdInput = new TableCell();
             
             string controlName = String.Format("__customprop_{0}"prop.Name.ToLower());
             switch(prop.Type)
             {
                  case CustomerPropertyType.Text:
                  case CustomerPropertyType.Number:
                      TextBox inputControl = new TextBox();
                      inputControl.ID = controlName;
                      inputControl.Name = controlName;
                      inputControl.Text = prop.Value.Tostring();

                      tdInput.Controls.Add(inputControl);

                      //Op dit punt kun je ook validators toevoegen. 

                      break;
                  case CustomerPropertyType.Date:
                     Calendar cal = new Calendar();
                      cal.ID = controlName;
                      cal.Name = controlName;
                      cal.SelectedDate = Convert.ToDateTime(prop.Value);
                     
                      tdInput.Controls.Add(inputControl);
                     break;
             }
            
             tr.Cells.Add(tdName);
             tr.Cells.Add(tdInput);

             t.Rows.Add(tr);
        }
   }
}

Vervolgens zul je nog IPostbackDataHandler interface moeten implementeren. Je hoeft dan eigenlijk alleen maar de dictionary (postValues) te doorlopen en controleren of de key begint met '__customprop_'.

Kijk in de MSDN voor richtlijnen voor het ontwikkelen van (Web)Controls.

If it ain't broken yet, it might be foolproof for a while.

quote:
Niemand_Anders schreef op donderdag 10 juli 2008 @ 13:58:
Maar je hoeft toch helemaal geen aparte controls te maken. Volgens mij is slechts 1 'properties' control voldoende. Je kunt toch aan de hand van een 'specificatie' bestand gewoon wat controls toevoegen. Ik neem aan dat de informatie welke kan worden ingevoerd vrij beperkt zal zijn tot teksten, nummers en datums.
Maar dan krijg je een dynamisch gegenereerd ding waarvan je de lay-out e.d. niet kunt bepalen, en da's wel de bedoeling. Voor een dynamisch input schermpje kan ik de standaard ASP.NET controls gewoon gebruiken, nog veel makkelijker. Het gaat er juist om dat ik zelf wil kunnen bepalen waar de velden zich bevinden in de verschillende weergaven.
 
quote:
Razr schreef op woensdag 09 juli 2008 @ 18:28:
Kun je niet een generieke control maken welke al het gemeenschappelijke gedrag/layout bevat? Een soort van superklasse zeg maar. Vervolgens maak je voor de specifieke type sub-controls, welke erven van de generieke control?
Dat kan wel, maar dan moet het echt een custom control zijn en ik vind het een groot nadeel dat daar geen ascx file aan vast zit. Dan moet je dus je lay-out helemaal in code gaan definieren en dat is aardig wat werk als je dat netjes wilt doen.
 
quote:
iCe01 schreef op donderdag 10 juli 2008 @ 14:20:
[...]

Maar dan krijg je een dynamisch gegenereerd ding waarvan je de lay-out e.d. niet kunt bepalen, en da's wel de bedoeling. Voor een dynamisch input schermpje kan ik de standaard ASP.NET controls gewoon gebruiken, nog veel makkelijker. Het gaat er juist om dat ik zelf wil kunnen bepalen waar de velden zich bevinden in de verschillende weergaven.
Welke layout? Voor de gebruikte controls kun je gewoon skins gebruiken. Het enigste wat de control doet is slechts een aantal standaard controls in een tabel plaatsen.

Ik zou de 'custom' velden niet gaan mixen met de standaard velden. Wel kun je de volgorde van de velden op zich gemakkelijk aanpassen.

Overigens maakt het niet uit of je dynamisch of via vaste custom controls velden kunt toevoegen. Als jij een control maakt ligt de layout daarvan ook vast.

Een andere oplossing zou zijn dat je zelf een 'designer' maakt en de position opslaat en vervolgens de controls via fixed css op het scherm tekent.

Het enigste wat in mijn voorbeeld vast lag, was dat de velden onder elkaar staan via een twee kolommen tabel. Maar je zou ook per control een Panel kunnen opbouwen, de panels opslaan in een list en deze vervolgens via een repeater gaan renderen, waarmee je ze ook twee-aan-twee kunt renderen.

Weer een andere oplossing is een bbcode achtige constructie:
code:
1
2
3
4
5
6
[table]
[tr]
[td]Afdeling[/td]
[td][input name='sofi' type='text' validation='^[0-9]{10,10}$'][/td]
[/tr]
[/table]

Op zo'n moment geef je de gebruiker de meeste vrijheid. Alleen zul je dan wel moeten controlen dat alle standaard verplichte velden in de template zijn opgenomen..

If it ain't broken yet, it might be foolproof for a while.

Kruimeltjes zijn weer op :9

quote:
iCe01 schreef op donderdag 10 juli 2008 @ 14:23:
[...]


Dat kan wel, maar dan moet het echt een custom control zijn en ik vind het een groot nadeel dat daar geen ascx file aan vast zit. Dan moet je dus je lay-out helemaal in code gaan definieren en dat is aardig wat werk als je dat netjes wilt doen.
Kan best; met LoadControl kan je een ascx inladen en met FindControl kan je wat doen met de elementen die er op staan. Je kan bij een ascx ook nog een Page_Load definieren om de specifieke implementatie die niet in een basis te krijgen is, neer te zetten.

gorgi_19 wijzigde dit bericht 10-07-2008 19:14 (7%)



© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Adrastos

© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Adrastos

[RSS][XML]

Update Tracker

Active Topics
Active Topics
Frontpage Nieuws
Frontpage Nieuws