Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[ASP.NET] Custom control vraagje

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 14:06
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.

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
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.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Razr
  • Registratie: September 2005
  • Niet online
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?

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

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 { Text, Number, Date }

public class CustomProperty : WebControl, IPostbackDataHandler
{
   public string Name { get; set; }
   public object Value { get; set; }
   public CustomerPropertyType Type { get; set; }
}

public class PropertyGrid
{
   protected List<CustomProperty> customProperties = 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 isn't broken, fix it until it is..


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 14:06
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.

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 14:06
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.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

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 isn't broken, fix it until it is..


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

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.

[ Voor 7% gewijzigd door gorgi_19 op 10-07-2008 19:14 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1