[ASP.Net en Linq] Binding DropDownList

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Beste tweakers,

Misschien een stomme vraag, maar ik zoek een nette manier om een ASP.Net DropDownList aan een Linq entity array te binden, met een twist.

Ik heb een tabel Persoon, met daarin de kolommen PersoonId, Achternaam en Voornaam. Wat ik graag wil, is een lijst waarin het DataValueField gelijk is aan PersoonId, maar het DataTextField gelijk aan "Achternaam, Voornaam".

Normaal gesproken deed ik dit altijd via SQL.. dus dat ik een kolom toevoegde in de query, zoals:

SELECT *, Achternaam + ', ' + Voornaam AS VolledigeNaam FROM Persoon

En dan zette ik het DataTextField altijd naar VolledigeNaam. Maar met Linq kan ik dit niet zomaar doen en stiekem vind ik het ook niet netjes. De data is gewoon Achternaam en Voornaam, de user interface zou het dus anders moeten presenteren. We gaan dus een laag omhoog / naar buiten.

Eerst probeerde ik dit te omzeilen met SQL Views, wat op zich lukte, maar dan werden mijn LinqToSQL classes wel erg rommelig en moet ik voor zo'n beetje elke tabel een view gaan aanmaken. Ik kan er Stored Procedures voor aanmaken, maar die gebruik ik liever alleen voor taken die ook echt iets wijzigen, anders zou je weer een Stored Procedure moeten aanmaken voor elke tabel alleen maar om dingen op te vragen. Wat dus ook weer omslachtig is.

Oftewel, hoe zouden jullie dit netjes aanpakken met Linq? En helemaal in de spirit van Rapid Application Development? Dus geen omslachtige Views, Procedures, handgeschreven code, etc ;) Want anders kan ik net zo goed geen Linq gebruiken..

Alvast bedankt :)

Mijn test code, dusver:

code:
1
2
3
4
5
6
7
8
Public Class DbData
  Public Shared Function GetAllPersoon() As DbTest.Data.Persoon()
    Using db As New DbTest.DbTestDataContext()
      Dim result = From pp As DbTest.Data.Persoon In db.Persoon Order By pp.AchterNaam, pp.VoorNaam
      Return result.ToArray()
    End Using
  End Function
End Class


code:
1
2
3
4
    ddlPersoon.DataSource = DbData.GetAllPersoon()
    ddlPersoon.DataValueField = "PersoonId"
    ddlPersoon.DataTextField = "Achternaam"
    ddlPersoon.DataBind()


Dit laat dus alleen de achternaam zien. Ik heb nog gezocht, maar een ASP.Net DropDownList heeft ook geen ItemDataBound..

[ Voor 16% gewijzigd door Lethalis op 05-11-2008 15:04 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

En waarom maak je dan (in Persoon) geen property VolledigeNaam aan welke gewoon de properties Voornaam, Tussenvoegsel en Achternaam samen voegt?

Vervolgens kun je in de dropdown gewoon deze property toewijzen als display value..


edit: Extension zijn methods en niet geschik voor DisplayMember property.

[ Voor 92% gewijzigd door Niemand_Anders op 05-11-2008 15:19 ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Niemand_Anders schreef op woensdag 05 november 2008 @ 15:11:
En waarom maak je dan (in Persoon) geen property VolledigeNaam aan welke gewoon de properties Voornaam, TussenVoegsel en Achternaam samen voegt?
Klinkt leuk, maar hoe doe je dat dan?

[edit] Ik ga het even proberen.

code:
1
2
3
4
5
6
7
8
9
Namespace DbTest.Data
  Partial Public Class Persoon
    Public ReadOnly Property VolledigeNaam() As String
      Get
        Return Me.AchterNaam + ", " + Me.VoorNaam
      End Get
    End Property
  End Class
End Namespace


Werkt prima! Thanks. Ik weet wel hoe partial classes werken, maar ik dacht er in deze context helemaal niet aan! :D

[ Voor 57% gewijzigd door Lethalis op 05-11-2008 15:23 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Lethalis schreef op woensdag 05 november 2008 @ 15:17:
[...]

Klinkt leuk, maar hoe doe je dat dan?

[edit] Ik ga het even proberen.
Euh, Linq 2 SQL entities zijn allemaal als partial gedeclareerd en is het niet zo lastig om entities te customizen.

C#:
1
2
3
4
5
6
7
8
9
10
public partial class <LinqRootClass>
{
  public partial class Persoon
  {
    public string VolledigeNaam 
    {
       get { return String.Format("{0} {1} {2}", Voornaam, Tussenvoegsel, Achternaam); }
    }
  }
}


Meer over het aanpassen van Linq 2 SQL entities verwijs ik je naar de Microsoft "How Do I" instructie videos: http://www.asp.net/learn/linq-videos/

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Het gaat weer lekker langs elkaar heen ;-)

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Niemand_Anders schreef op woensdag 05 november 2008 @ 15:25:
[...]
Euh, Linq 2 SQL entities zijn allemaal als partial gedeclareerd en is het niet zo lastig om entities te customizen.
Ja, het is achteraf gezien wel logisch :) Maar ik moet af en toe even omdenken, begin alweer achter te lopen haha.. bedankt iig :+

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Je kan het natuurlijk ook met Linq weer aan elkaar plakken:
C#:
1
2
3
4
5
6
7
8
9
10
11
Persoon[] personen = {
   new Persoon() { Voornaam = "Bartje", Achternaam = "Suikerbal" },
   new Persoon() { Voornaam = "Pietje", Achternaam = "Puk" }};

   var temp = from p in personen
              select new { VolledigeNaam = p.Voornaam + ' ' + p.Achternaam };

   foreach (var p in temp)
   {
      Console.WriteLine(p.VolledigeNaam);
   }

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
riezebosch schreef op woensdag 05 november 2008 @ 15:58:
Je kan het natuurlijk ook met Linq weer aan elkaar plakken:
Thanks, is ook wel leuk om te weten.

Partial classes hebben denk ik alleen wel wat meer voordelen (reusability, etc) :)

Ask yourself if you are happy and then you cease to be.

Pagina: 1