Avatar billede peter_svendsen Nybegynder
28. november 2006 - 15:08 Der er 6 kommentarer og
1 løsning

SelectedRows returnere ikke rækkerne sorteret

Jeg skal loope igennem de rækker jeg har valgt i mit datagridview.

Dette gør jeg med:

foreach(DataGridViewRow dgvRow in dg.SelectedRows)
{
  ds.myRow row = (ds.myRow)((DataRowView)dgvRow.DataBoundItem).Row;


Det virker alt sammen meget lovende, men den tager ikke højde for sorteringen af griddet, hvilket er en nødvendighed for min kode.

Er der nogen der har et foreslag til hvordan jeg kan få mine rækker retur i sorteret orden uden at skulle lave kæmpe mængder slam kode.

Jeg bør nok lige nævne at jeg arbejder op mod et dataset der er overført fra VS 2003.
Avatar billede bulgroz Nybegynder
28. november 2006 - 15:51 #1
Selection handleren i DataGridView husker rækkefølgen hvormed rows er blevet selected. Med andre ord, den row som har focus vil figurere først i SelectedRows.

For at undgå dette er du vistnok desværre nødsaget til at loope over alle rows :-(
Jeg mener dog at jeg har set et alternativ et sted, kan dog ikke huske hvor.

            foreach (DataGridViewRow row in this.dataGridView1.Rows)
            {
                if (row.Selected)
                {
                    // TODO: Bla. bla...
                }
            }
Avatar billede bulgroz Nybegynder
28. november 2006 - 15:57 #2
Det er dog naturligvis hurtigere at loope gennem dine SelectedRows og adde rows til en ny collection afhængigt af deres row index. Herefter kan denne traverseres i rette rækkefølge.
(Mener dog stadig at der er et simplere alternativ)
Avatar billede bulgroz Nybegynder
28. november 2006 - 16:34 #3
Altså i stil med dette eksempel:


            SortedDictionary<int, DataGridViewRow> dictionary = new SortedDictionary<int, DataGridViewRow>();

            foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
            {
                dictionary.Add(row.Index, row);
            }

            StringBuilder stringBuilder = new StringBuilder();

            foreach (int index in dictionary.Keys)
            {
                stringBuilder.AppendLine(dictionary[index].ToString());
            }

            MessageBox.Show(stringBuilder.ToString());
Avatar billede peter_svendsen Nybegynder
28. november 2006 - 17:11 #4
Tak for dit hurtige svar.

Jeg har allerede implementeret den øverste løsning, men din alternative løsning lyder tiltalende. Den kigger jeg nærmere på lige om lidt, men no matter what. Du har fortjent dine point, så smid et svar.
Avatar billede bulgroz Nybegynder
28. november 2006 - 17:32 #5
Valget af løsning afhænger jo meget af dine data. Hvis du har mange rows er den første løsning dyr at anvende. Løsning nr. 2 er nok den billigste, hvis der altså ikke findes et tredje alternativ som er "billigere".
Avatar billede peter_svendsen Nybegynder
29. november 2006 - 09:50 #6
Jeg havde helt sikkert håbet at der var en løsning der brugte dg.SelectedRows på en lidt mere naturlig måde.

Min data kan godt ende med mange rækker over lang tid, og der burde ikke være valgt så mange rækker. Når det er sagt, så er der altid muligheden for at en eller anden synes det er sjovt at bruge CTRL + A under test eller lignende.

Det er dog ikke så hastighedskritisk et område af programmet, så begge løsninger vil virke.
Avatar billede bulgroz Nybegynder
29. november 2006 - 10:45 #7
Du kan jo lave et simpelt check på størrelsen af din selection for at vælge mellem de to løsninger.
Personligt ville jeg dog altid holde mig til løsning 2. Er det du skal udføre noget som tager mange ressourcer, og derved tid, kan du jo altid udføre dette arbejde f.eks. med en BackgroundWorker,så dit UI ikke bliver låst, men jeg formoder at dette er at skyde lidt over målet i dette tilfælde.
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