Avatar billede lasserasch Juniormester
13. september 2010 - 00:36 Der er 11 kommentarer og
1 løsning

Spørgsmål vedr. DataGridView funktionalitet i Winforms

Hejsa.

Jeg har følgende metode, som ikke virker.

På min Winform har jeg 3 datagridviews som ligger i et tab panel.

Et for hhv.
Private kunder
Virksomheds kunder
og restauranter.

Alt efter hvilket gruppe id (int værdi som kan være 1, 2 eller 3) metoden får, skal data fyldes i de forskellige grids.

Men for ikke at skulle skrive samme kode 3 gange opretter jeg et datagridview i runtime og giver det værdien af det gridview som jeg har lavet i design mode. Ergo burde de 2 objekter være samme objekt.

Skulle man så ikke kunne tilføje rækker til det datagridview som er oprettet i runtime (hvor de så blev vist på det datagridview som det dynamiske er en "dobbeltgænger" af?)


Måske det er nemmere at forstå ved at vise koden herunder.


  private void LoadCustomers(int groupid)
        {
            DataGridView dgv = null;
            switch (groupid)
            {
                case 1: dgv = Grid_privatecustomers; break;
                case 2: dgv = Grid_companies; break;
                case 3: dgv = Grid_restaurants; break;
            }


            foreach (Data.Customer c in Customers)
            {
                if (c.Customergroup.Id == groupid)
                {
                    dgv.Rows.Add();
                    dgv.Rows[dgv.Rows.Count - 1].Cells[0].Value = c.Fullname;
                    dgv.Rows[dgv.Rows.Count - 1].Cells[1].Value = c.Street;
                    dgv.Rows[dgv.Rows.Count - 1].Cells[2].Value = c.Phonenumber;
                }
            }
        }


Får en 'Exception has been thrown by the target of an invocation.' exception.


/Lasse
Avatar billede Syska Mester
13. september 2010 - 00:56 #1
På hvad linje ?

og hører der mere til den exception? Eventuelt inner exception ?
Avatar billede lasserasch Juniormester
13. september 2010 - 01:08 #2
Dooohhh..... Havde ikke fået kigget i innerexception.

Det ene af mine datagridviews var databound til en generisk liste. UPS... Fejl 40 :-)

Virker nu.

Nemme 60 points. Smid svar, så lukker vi igen.


Mvh.
Lasse
Avatar billede Syska Mester
13. september 2010 - 01:30 #3
super ... jeg har også stiret mig blind på inner exception ...

svar.

mvh
Avatar billede janus_007 Nybegynder
13. september 2010 - 10:49 #4
Hvorfor databinder du ikke?

Vil det ikke være nemmere, istedet for:
foreach (Data.Customer c in Customers)
            {
                if (c.Customergroup.Id == groupid)
                {
                    dgv.Rows.Add();
                    dgv.Rows[dgv.Rows.Count - 1].Cells[0].Value = c.Fullname;
                    dgv.Rows[dgv.Rows.Count - 1].Cells[1].Value = c.Street;
                    dgv.Rows[dgv.Rows.Count - 1].Cells[2].Value = c.Phonenumber;
                }
            }

Og gøre sådan her:
dgv.DataSource = Customers.Where(x => x.Customergroup.Id == groupid);
dgv.DataBind();
Avatar billede lasserasch Juniormester
13. september 2010 - 11:33 #5
Jo, jeg databindede også til at starte med. Deraf min dumme fejl 40 :-)

Men hvis jeg gjorde det, så oprettede den kolloner i griddet for alle properties på mit customer objekt.

Jeg ønsker kun at få vist nogle få informationer omkring kunderne i griddet.

Men jeg kunne bare ikke finde noget sted hvor man kunne slå det fra, så den ikke autogenererede kollonerne.

Så derfor gik jeg over til denne løsning.

Men hvis du ved hvor pokker man gør det, så vil det klart være en mere optimal løsning.

Mvh.
Lasse
Avatar billede janus_007 Nybegynder
13. september 2010 - 12:58 #6
Så skal du lave det som anonym type, noget alá, hvor du selv bestemmer hvilke properties du vil have med ud :)

dgv.DataSource = Customers.Where(x => x.Customergroup.Id == groupid)
.Select(x => new{FullName = x.FullName, Street = x.Street});

osv...
Avatar billede lasserasch Juniormester
13. september 2010 - 13:39 #7
Jeg vil gerne sætte hvilke properties der skal i de forskellige kolloner i design time, så jeg kan style som jeg gerne vil.

Jeg prøver at få dette til at virke:

private void LoadCustomers(int groupid)
        {
            DataGridView dgv = null;
            switch (groupid)
            {
                case 1: dgv = Grid_privatecustomers; break;
                case 2: dgv = Grid_companies; break;
                case 3: dgv = Grid_restaurants; break;
            }

            dgv.AutoGenerateColumns = false;
            dgv.DataSource = Customers.Where(x => x.Customergroup.Id == groupid);
        }

Men griddet er tomt når jeg gør det sådan.

Hvis jeg fjerner ".Where(x => x.Customergroup.Id == groupid)" så er der masser af rækker i griddet.

Jeg tror ikke helt jeg forstår ".Where(x => x.Customergroup.Id == groupid)".

Kan du forklare funktionen?
Avatar billede lasserasch Juniormester
13. september 2010 - 14:34 #8
Fandt en løsning.

Der skal åbenbart en .ToList<objekttype>(); på efter .Where(). Ellers virker det ikke.


Mvh.
Lasse
Avatar billede janus_007 Nybegynder
13. september 2010 - 18:34 #9
ahh ja.. det er sandt, ellers er det en IEnumerable, sorry :) godt du løste det.

Where(x => x.Customergroup.Id == groupid) er en lambda expression som for hver af dine Customer-entiteter kigger på entiten/ relationen til Customergroup som er en property i dit Customer-objekt og Id. Da du allerede havde gjort sådan c.Customergroup.Id , så kendte jeg lidt til objectgrafen :)
Avatar billede Syska Mester
13. september 2010 - 21:41 #10
#lasse
Eller bare ToList() burde også virke ... det er nok et spm om at få lave din IQueryable om ( vil jeg tro ) og den kan så selv via inference( tror jeg nok det hedder ) regne typen ud :-)

mvh
Avatar billede janus_007 Nybegynder
14. september 2010 - 12:16 #11
.
Avatar billede janus_007 Nybegynder
14. september 2010 - 12:16 #12
.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester