Avatar billede Skynet Mester
25. april 2008 - 20:58 Der er 15 kommentarer og
1 løsning

DateTime listeToArray, problem med Items.AddRange

Når jeg i min windowsform kalder mit GetAllDatoSublist får jeg følgende fejl som jeg håber nogen kan hjælpe mig med at forstå?


Error    5    Argument '1': cannot convert from 'System.DateTime[]' to 'System.Windows.Forms.ListBox.ObjectCollection'   
Error    4    The best overloaded method match for 'System.Windows.Forms.ListBox.ObjectCollection.AddRange(System.Windows.Forms.ListBox.ObjectCollection)' has some invalid arguments   

her er min windows form:
private void button8_Click(object sender, EventArgs e)
        {
            Reservering r1 = new Reservering("silas", new DateTime(2008, 04, 22));
            Reservering r2 = new Reservering("kurt", new DateTime(2008, 04, 23));
            Reservering r3 = new Reservering("Peter", new DateTime(2008, 04, 24));
            Flaske f1 = new Flaske(r1, "ok", 43);
            f1.addReservartion(r2);
            f1.addReservartion(r3);

            f1.datoer_makeDatoSublist("kurt");
         
          //this is the problem. AddRange
          listBox2.Items.AddRange(f1.datoer_GetAllDatoSublist());
         

        }

og her er GetAllDatoSublist fra klassen:
public DateTime[] datoer_GetAllDatoSublist()
            {
                return sublistNavne.ToArray();

            }


og her er hvordan sublisten bliver lavet:

public List<DateTime> sublistNavne = new List<DateTime>();
         
            public DateTime[] datoer_makeDatoSublist(string navn)
          {
              foreach (Reservering en_reservering in reserveringsliste)

                  if (en_reservering.PropertyReserveringsnavn == navn)
                   
                   
                  {
                      sublistNavne.Add(en_reservering.PropertyDato);
                     
                  }

              return sublistNavne.ToArray();
          }
Avatar billede Syska Mester
26. april 2008 - 02:05 #1
wow ... den kan jeg ikke lige dreje ... kan også se du er andre steder på nettet for at finde svar på det ...

Indtil du finder andne løsning kan du gøre sådan her:
listBox1.BeginUpdate();
foreach (DateTime dt in list)
{
listBox1.Items.Add(dt);
}
listBox1.EndUpdate();

Langt fra optimal ...
Avatar billede nielle Nybegynder
26. april 2008 - 07:54 #2
Hvis du programmere i VS 2008 kan du gøre det med LINQ.

Du skal bare ændre:

listBox2.Items.AddRange(f1.datoer_GetAllDatoSublist());

- til:

listBox2.Items.AddRange(f1.datoer_GetAllDatoSublist().Cast<object>().ToArray());
Avatar billede Skynet Mester
26. april 2008 - 10:26 #3
Dejligt, det virker med LINQ.. hvad er det egentlig at den gør i praksis med Cast<object>()?
Avatar billede nielle Nybegynder
26. april 2008 - 11:11 #4
Problemet er at AddRange() forventer at få et object[] som argument. Du forsøgte at give den et DataTime[] argument i stedet - og det brokker den sig for.

Normalt ville man klare dette ved at caste. Men selvom en enkelt DateTime sagtens kan castes til object (kaldes boxing) så kan et array imidlertid ikke.

Løsningen er altså at lave din DateTime[] om til en object[]. Det er det Cast<object> gør: Den løber igennem DateTime[] arrayet et element af gangen og caster det til typen object. Desværre er resultatet ikke et object[] men noget der næsten ligner - det er en IEnumarable<object> - det er i hvert fald tilstrækkelig godt til at et enkelt kald til ToArray() gør resten.
Avatar billede Skynet Mester
26. april 2008 - 11:30 #5
ok, tak for forklaringen..
Avatar billede Syska Mester
26. april 2008 - 13:33 #6
ohhh, så var det nok derfor mit ikke virkede ... fattede nada af det, men nu er det ikke et scenarie jeg har været ude for endnu ...

Men behind the scenes ... hvad laver den så præcist? Samme som at cast hvert DateTime i en løkke til et object ?

og er det altid at man ikke kan cast arrays? ...
Avatar billede Skynet Mester
26. april 2008 - 13:40 #7
er lige i gang med at bruge det omvendt, at bruge en aflæsning fra en liste som en DateTime i min metode, kan jeg der også bruge LINQ eller skal jeg gøre noget helt andet.

her er hvordan jeg kalder metoden
listBox2.Items.Add(f1.getDato(listBox1.SelectedItem)); //(virker ikke)

kunne det gøres sådan:
listBox2.Items.Add(f1.getDato.Cast<object>(listBox1.SelectedItem)); //(virker måske?)

her er metoden fra klassen
public string getDato(DateTime dato1)
              {
                  foreach (Reservering en_reservering in reserveringsliste)

                      if (en_reservering.PropertyDato == dato1)
                      {
                          return en_reservering.PropertyReserveringsnavn;
                      }
                  return "datoen er fri";
              }
Avatar billede Syska Mester
26. april 2008 - 14:23 #8
OMG ...

Hvad er det du vil ?

getDato method navnet er _MEGET_ misvisende hvad det gør ...

public bool IsDateAvailble(DateTime dato1) // og så kigger jeg på koden igen ... og k an ikke helt se sammenhængen ... tror du skal ombøbe nogen af dine varibler, method's, etc. Mest så vi andre bedre kan nemmemskue hvad der sker, når det ikke er vores kode. Det bliver også nemmere for dig selv hvis det bliver lagt på bordet i 2 måneder og du skal tilbage og arbejde med det igen ...

Du burde få nogle compile fejl på overstående ...

Du har ikke en method der har sammen method header ( f1.getDato bruger du som en property )

Det ser lidt ud som om du gætter ... SelectedItem er vist af typen "ListItem" ... der skal du så tage din Value ud som du vil bruge ... og caste den til en DateTime .. og derefter sende den til funktionen

// ouT
Avatar billede Skynet Mester
26. april 2008 - 15:01 #9
jeg får disse fejl

Error    3    The best overloaded method match for 'Software4divers.SuperResurser.getDato(System.DateTime)' has some invalid arguments   
Error    4    Argument '1': cannot convert from 'object' to 'System.DateTime'   

problemet er bare at jeg skal have castet min value så den kan bruges i min funktion, men hvordan caster jeg en værdi fra listen til en DateTime
Avatar billede Syska Mester
26. april 2008 - 15:52 #10
private void Form1_Load(object sender, EventArgs e)
        {
            List<DateTime> list = new List<DateTime>();
            for(int i = 0; i < 8; i++)
            {
                list.Add(DateTime.Now.AddDays(i));
            }
            listBox1.Items.AddRange(list.Cast<object>().ToArray());
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem == null)
                return;

            MessageBox.Show(((DateTime)listBox1.SelectedItem).Date.ToString());
        }

Fra visual studio i et windows forms project ...

Men vi er vist ved at være ovre i andre spm :-)
Avatar billede Skynet Mester
26. april 2008 - 16:22 #11
yes du har ret, jeg har netop oprettet spørgsmålet her
http://www.eksperten.dk/spm/829303 så andre også kan få noget ud af at læse det :)

mht. din løsning synes jeg ikke helt det løser mit problem, da jeg får en string retur med Date.ToSring og skal bruge en DateTime i min funktion.
Avatar billede Syska Mester
26. april 2008 - 16:52 #12
For at vide at det virkede ...

Svaret kommet i den anden tråd
Avatar billede nielle Nybegynder
26. april 2008 - 20:46 #13
26/04-2008 13:40:56> Nej.
Avatar billede Skynet Mester
26. april 2008 - 21:09 #14
jeg svarede nej her, fordi jeg har svaret ja http://www.eksperten.dk/spm/829303

i denne tråd vil jeg mene at det er dig som bør have points
Avatar billede Syska Mester
26. april 2008 - 21:20 #15
klart ... no harm done, nielle har bestemt mere erfaring, og den cast ting havde jeg ikke lige gennemskuet ... selvom jeg egentlig godt vidste den var der ....

nielle: Nu er LINQ jo først med fra 3.5, men hvordan ville overstående bliver gjort i .NET 2.0 ?

// ouT
Avatar billede nielle Nybegynder
26. april 2008 - 22:41 #16
I 3.0 og tidliger er der vist kun den metode du har skitseret i 26/04-2008 02:05:34.
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