Avatar billede ebita Nybegynder
15. maj 2004 - 15:41 Der er 4 kommentarer

ListBox kontrol, 'Index was out of range' når DataSource ændres

Hej

jeg har et lille program hvor jeg benytter ListBox kontroller.
DataSource'en til kontrollerne er en ArrayList.

I programet skal man kunne fjerne items fra listerne.

Jeg har en knap der fjerne det valgt element i ListBox'en fra min ArrayList og derefter giver det som DataSource til ListBox'en.

Mit problem er når jeg fjerne et element fra listen(det sidste), og derefter klikke det (nye) sidste element får jeg en fejl
"Index was out of range".

Nedenfor er koden til min knap og til ListBox'ens MouseDown evet
----------------oOo----------------
        private void button2_Click(object sender, System.EventArgs e)
        {
            int ii = a.Count;
            if (this.listBox1.SelectedIndex == -1)
            {
                MessageBox.Show("Select an item in the listbox first before do the operation.");
                return;
            }
            for (int i = 0; i < ii; i++)
            {
                if (a[i].ToString() == this.listBox1.SelectedItem.ToString())
                {
                    a.RemoveAt(i);
                    break;
                }
            }
            ArrayList t = new ArrayList();
            this.listBox1.DataSource = t;
            this.listBox1.DataSource = a;

        }

        private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (this.listBox1.SelectedIndex == -1)
            {
                return;
            }
                                                 
            MessageBox.Show(this.listBox1.SelectedItem.ToString());
        }
----------------oOo----------------

Jeg har nu forsøgt i en dags tid og er ved at være lidt træt af det :-)
Avatar billede finger Nybegynder
17. maj 2004 - 15:19 #1
Jeg har lige pastet din kode ind i en form og det virker fint.
Så fejlen må ligge ete andet sted.
Avatar billede ebita Nybegynder
17. maj 2004 - 20:28 #2
Hej finger,

gælder det også hvis du først sletter den sidste og dernæst klikke på 2. item?
Avatar billede finger Nybegynder
18. maj 2004 - 12:42 #3
Har fundet fejlen nu.

Fejlen er at du sletter det sidste element. Når du gør det så bliver listbox'ens SelectedItem sat til null. Når du så prøver dette:
if (this.listBox1.SelectedIndex == -1)
            {
                return;
            }
                                                 
            MessageBox.Show(this.listBox1.SelectedItem.ToString());

så giver det en exeption fordi du bruger den forkete event. På mousedown er selectedItem og SelectedIndex ikke sat endnu. SelectedIndex er stadig sat til den gamle værdi.

Brug istedet eventen SelectedIndexChanged
Avatar billede finger Nybegynder
18. maj 2004 - 12:56 #4
hmmm. nu har jeg prøvet lidt for mig selv og det ser squ ud til at der er en fejl i .NET listbox'en.... højst besynderligt.
Her er min kode.... og den fejler...

private void button1_Click(object sender, System.EventArgs e)
{
    if (this.listBox1.SelectedItem != null)
    {
        a.Remove(listBox1.SelectedItem);
        ArrayList b = new ArrayList();
        listBox1.DataSource = b;
        listBox1.DataSource = a;
    }
    listBox1.Update();
}

private void Form1_Load(object sender, System.EventArgs e)
{
    for(int i = 0;i<10;i++)
    {
              a.Add(i.ToString());
    }
    this.listBox1.DataSource = a;
}

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
    if (this.listBox1.SelectedItem != null)
    {
        label1.Text = listBox1.SelectedItem.ToString();
    }
}
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