[C#] Databinding DataGridView op basis van CustomCollection

Pagina: 1
Acties:
  • 736 views sinds 30-01-2008
  • Reageer

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12:14
Nou de titel zegt het eigenlijk al maar ik zal het met een klein stukje code proberen te duiden. Ik zoek in een collectie naar een aantal klanten. Elke klant is een object (Customer) en de collectie is een List<Customer>. De class ziet er vereenvoudigd zo uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
    public class Customer
    {
        
        public int customerID;
        // Personal
        public string christianname;
        public string initials;
        public string tussenvoegsel;
        public string familyname;

        //etc...
    }


Na het zoeken stel een Collectie (List<Customer>) samen van de resulaten wil ik deze koppelen aan de datagridview in mijn form.

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
            
            List<Customer> searchResult;
            searchResult = doSomeSearch();
            
            dataGridView2.Columns.Clear();

            BindingSource bindingSourceCustomers1 = new BindingSource();
            bindingSourceCustomers1.DataSource = searchResult;

            /*
            foreach (Customer c in searchResult)
            {
                bindingSourceCustomers1.Add(c);
            }
            */

            dataGridView2.DataSource = bindingSourceCustomers1;

            dataGridView2.AutoGenerateColumns = false;
            
            DataGridViewColumn Column;

            Column = new DataGridViewTextBoxColumn();
            Column.HeaderText = "Achternaam";
            Column.DataPropertyName = "familyname";
            Column.Name = "familiyname";
            Column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridView2.Columns.Add(Column);

Zoals je kan zien, heb ik ook geprobeert of het "handmatig" vullen van de bindingsource ook werkt maar dat had ook geen resultaat. Wat ik dus wil een een collectie koppelen aan de datagridview en dan een aantal kolommen defineren, waarbij ik de kolom wil koppelen aan een property van het object Customer.

Ik heb msdn, codeproject en GoT al afgezocht en ben nu al twee avonden kwijt. De collectie wordt prima gevuld, want tijdens het debuggen zie ik gewoon 8 resultaten, en dat klopt ook.

Hieronder een lijstje van gebruikte zaken op o.a. msdn:
http://msdn2.microsoft.com/en-us/library/ms171600.aspx
http://msdn2.microsoft.co....forms.bindingsource.aspx
http://msdn2.microsoft.com/en-us/library/y0wfd4yz.aspx
\[C# / WinForms] DataGridView refresht niet *
http://www.google.com/sea...official&client=firefox-a

Hoe los ik dit op en/of hoe kan ik achterhalen waarom de binding niet gebeurt?

buit is binnen sukkel


Verwijderd

Paar andere opmerkingen:

A) Gebruik altijd Properties in business classes, die fields horen private te zijn
B) Ik weet niet wat je probeert met dat datagrid, maar dat kun je gewoon doen in de designer, of autogenerate op true zetten of gewoon netjes meerdere datagrids definieren. Alle 3 de opties zijn overzichtelijker dan wat je nu doet.


Je Probleem:
C#:
1
2
dataGridView2.DataSource = bindingSourceCustomers1; 
dataGridView2.DataBind();


Gebruik je WinForms of ASP.NET, bij ASP.NET is het ontbreken van de DataBind() methode het probleem, bij WinForms moet ik ff zoeken voor je hoe dat alweer zat, maar ik dacht daar ook. (WinForms wordt wat roestig :P)

  • BM
  • Registratie: September 2001
  • Laatst online: 12:41

BM

Moderator Spielerij
Bij WinForms heb je geen .DataBind() functie. Ik heb hem nog niet gezien in ieder geval.

In bovenstaand stukje code van de TS zou de regel
C#:
1
dataGridView2.DataSource = bindingSourceCustomers1; 

onderaan zetten.

Dat word dan
C#:
1
2
3
4
5
6
7
8
9
10
11
12
dataGridView2.AutoGenerateColumns = false;
            
DataGridViewColumn Column;

Column = new DataGridViewTextBoxColumn();
Column.HeaderText = "Achternaam";
Column.DataPropertyName = "familyname";
Column.Name = "familiyname";
Column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView2.Columns.Add(Column);

dataGridView2.DataSource = bindingSourceCustomers1;


Kan dit niet beargumenteren, maar het voelt logischer aan, eerst definieren welke kolommen en welke properties je wilt hebben, en daarna pas binden.
Sowieso zou ik de kolommen via de designer definieren, en niet via code, maar neemt niet weg dat het zo volgens mij ook moet werken.



Wat ook nog zou kunnen, en ook al indirect gezegt door de poster boven me, misschien word er bij databinding alleen gekeken naar properties en niet naar public variabelen. Dat is ook wel een puntje van aandacht. Komt bij dat dat sowieso een nettere manier van werken is.

Succes!

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Verwijderd schreef op woensdag 21 februari 2007 @ 23:38:
Paar andere opmerkingen:

A) Gebruik altijd Properties in business classes, die fields horen private te zijn
B)
Dit is offtopic, maar ook voor discussie vatbaar.
Zie bv dit artikel van Eric Gunnerson. Sommigen verkiezen om idd private fields met public properties te gebruiken (ik ook; al is het meer uit gewoonte, en omdat public fields zo raar staan), anderen vinden het op dit momen verloren moeite, als je property niets anders doet dan getten / setten.
Je Probleem:
C#:
1
2
dataGridView2.DataSource = bindingSourceCustomers1; 
dataGridView2.DataBind();


Gebruik je WinForms of ASP.NET, bij ASP.NET is het ontbreken van de DataBind() methode het probleem, bij WinForms moet ik ff zoeken voor je hoe dat alweer zat, maar ik dacht daar ook. (WinForms wordt wat roestig :P)
WinForms heeft geen DataBind method. Gewoon de DataSource zetten.
misschien word er bij databinding alleen gekeken naar properties en niet naar public variabelen.
Dit is in ASP.NET wel idd zo dacht ik; geen idee of het in WinForms ook zo is.
Edit: net ff getest, en WinForms databinding gebeurt idd enkel automatisch mbhv propeties. (Zie ook de laatste comment in dat artikel van Gunnerson).

[ Voor 12% gewijzigd door whoami op 22-02-2007 09:19 ]

https://fgheysels.github.io/


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12:14
whoami schreef op donderdag 22 februari 2007 @ 09:09:
[...]
Dit is offtopic, maar ook voor discussie vatbaar.
Zie bv dit artikel van Eric Gunnerson. Sommigen verkiezen om idd private fields met public properties te gebruiken (ik ook; al is het meer uit gewoonte, en omdat public fields zo raar staan), anderen vinden het op dit momen verloren moeite, als je property niets anders doet dan getten / setten.


[...]
WinForms heeft geen DataBind method. Gewoon de DataSource zetten.


[...]
Dit is in ASP.NET wel idd zo dacht ik; geen idee of het in WinForms ook zo is.
Edit: net ff getest, en WinForms databinding gebeurt idd enkel automatisch mbhv propeties. (Zie ook de laatste comment in dat artikel van Gunnerson).
Oke, thx voor de linkjes. Het gaat inderdaad om WinFroms en niet ASP.NET, dus de BindData() method bestaat dan niet. Ik zal het eens met properties ipv fields proberen.

buit is binnen sukkel


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12:14
BM schreef op donderdag 22 februari 2007 @ 07:49:
[...]
Wat ook nog zou kunnen, en ook al indirect gezegt door de poster boven me, misschien word er bij databinding alleen gekeken naar properties en niet naar public variabelen. Dat is ook wel een puntje van aandacht. Komt bij dat dat sowieso een nettere manier van werken is.

Succes!
En dit was dus de oplossing! Databinding werkt dus alleen voor properties en niet voor fields. :)

buit is binnen sukkel


Verwijderd

whoami schreef op donderdag 22 februari 2007 @ 09:09:
[...]
Dit is offtopic, maar ook voor discussie vatbaar.
Zie bv dit artikel van Eric Gunnerson. Sommigen verkiezen om idd private fields met public properties te gebruiken (ik ook; al is het meer uit gewoonte, en omdat public fields zo raar staan), anderen vinden het op dit momen verloren moeite, als je property niets anders doet dan getten / setten.
Niet dus, want vrijwel alle standaard controls werken met properties ipv fields. Zie ook post hierboven :P c# 3.0 maakt echter een eind aan deze discussie met: http://aspiring-technolog...rchive/2006/11/19/53.aspx

[ Voor 8% gewijzigd door Verwijderd op 22-02-2007 18:01 ]

Pagina: 1