Avatar billede mettegp Nybegynder
15. december 2005 - 16:21 Der er 6 kommentarer

ListViewItem kontrol og property selectedItems

jeg har en listView Item kontrol på min formular lstEMailListe, med 3 subItems dato, afsender og emne.
Det jeg forsøger på, er at udvælge en enkelt linie fra listen, men jeg får hele tiden outofRangeException. Jeg har lagt den på listens egen eventhandler, så det skulle jo være sådan at når man klikkede en gang eller flere så valgte den index på de udvalgte emne. Er der nogen der kan hjælpe, jeg er i det gavmilde hjørne og giver 60 point.

private void lstEMailListe_SelectedIndexChanged(object sender, System.EventArgs e)
{

DateTime tidStempel;
MailDTO mailDTOData;
ListViewItem linie;
tidStempel = DateTime.Now;
linie = new ListViewItem();
int index = 0;
for(int i = 0; i < lstEMailListe.Items.Count; i++)
{
    linie = lstEMailListe.SelectedItems[i];
    if(lstEMailListe.Items.Contains(linie))
    index = lstEMailListe.Items.IndexOf(linie);

        linie = lstEMailListe.Items[index];
}   
   
    //opdater teksboks kontroller og listView
    lstEMailListe.Items.Clear();
    linie.SubItems.Add(mailDTOData.tidStempel);
        linie.SubItems.Add(mailDTOData.mailAdresse_fra);
    linie.SubItems.Add(mailDTOData.emne);
    lstEMailListe.Items.Add(linie);

    txtDestMailAdr.Text = mailDTOData.mailAdresse_til;
        txtAfsendMailAdresse.Text = mailDTOData.mailAdresse_fra;
    txtEmne.Text = "";
    txtTekst.Text = "";
Avatar billede bitsch Nybegynder
16. december 2005 - 11:30 #1
SelectedItems har jo højt sandsynligt færre items end lstEMailListe.Items

Men hvorfor looper du ikke blot på SelectedItems?

            foreach (ListViewItem listViewItem in this.listView1.SelectedItems)
            {
                MessageBox.Show(listViewItem.ToString());
//
           
            }
Avatar billede mettegp Nybegynder
16. december 2005 - 12:51 #2
Hej bitsch (sikke et navn, er det selvironi, man kunne jo tro man fornærmede dig ved at kalde dig det!)
Nå men mit problem er altså, at når jeg har valgt de udvalgte items, skal man så ikke på en eller anden måde putte dem ned kollektionen af selectedItems. Problemet er bare at man ikke kan skrive noget til selectedItems så jeg har forsøgt mig med nedenstående linie.
Det jeg derefter er interesseret i, det er at få fat i index nr.'et på det udvalgte item i selected items. F.eks. kunne det have index nr.'et 3 i den oprindelige kollektion og 0 i den selected kollection. Jeg ved det er 0, fordi jeg vælger kun en linie. Denne ene linie vil jeg gerne have indlæst i den samme ListView control altså lstEMailListe

ListView.SelectedListViewItemCollection selectedItems = new System.Windows.Forms.ListView.SelectedListViewItemCollection(lstEMailListe);

ListViewItem selected = null;
if(lstEMailListe.SelectedItems.Count > 0)
{
    selected = (lstEMailListe.SelectedItems[0]).Tag as ListViewItem;
}
           
selectedItems[0].ListView.Items[0] = selected;    //her ligger problemet
//hvordan får jeg selected over i det nye kollektion selectedItems???
//der er heller ikke nogen add metode.

int index = 0;
foreach(ListViewItem item in selectedItems)
{
    if(selectedItems.Contains(item))
    index = selectedItems.IndexOf(item);
}

linie = new ListViewItem();
linie = lstEMailListe.Items[index];      //index'et her skulle gerne være 0
                                          //og ikke 3 som jeg hele tiden får at vide
                                          //displayindex 3 out of range!!!
Avatar billede bitsch Nybegynder
16. december 2005 - 13:08 #3
vedr. mit alias, det afhænger jo af om man kan læse eller ej.

Vedr. SelectedItems. Nej du skal ikke sætte noget! Selected Items er din selection som du har foretaget dig i listviewet. Så jeg kan forstå at det du vil er at selecte et item fra kode (og altså ikke vha. manuel håndtering i UI). Indexet afspejler blot den aktuelle placering.
Avatar billede bitsch Nybegynder
16. december 2005 - 13:29 #4
Dette lille eksempel sætter alle items selected! (Blot et eksempel, og husk at multiselect skal være true)

        private void button1_Click(object sender, EventArgs e)
        {
            this.listView1.Focus();

            foreach (ListViewItem listViewItem in this.listView1.Items)
            {
                listViewItem.Selected = true;
            }
        }



this.listView1.Focus() kaldes blot for at du lettere kan se resultatet! Alternativt kan du sætte HideSelection til false (Så vises din selection også når kontrollen ikke har focus).
Avatar billede mettegp Nybegynder
16. december 2005 - 13:31 #5
Undskyld nu har jeg fundet ud af det
Man sætter ikke selected men getter dem med property Selected på lstEMailListe
Hvor dum kan man være.
Nu virker det fint!
Avatar billede bitsch Nybegynder
16. december 2005 - 13:40 #6
Fint, men hvis su vil selecte kan du gøre som ovenstående. Index er blot en property som du kan anvende til at referere til det enkelte element. Når du har item i hånden er det blot at sætte de aktuelle properties så som Selected.

Og det er naturligvis ikke forkert at skrive ListView1.Items[MyIndex].Selected = true;

Når blot man sørger for at man har en legal index value.
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