Object reference not set to an instance of an object. ListView

Status
Niet open voor verdere reacties.

ChrisjuhB

Gebruiker
Lid geworden
8 jan 2012
Berichten
17
Hallo ik ben bezig met een kassa systeem voor school.
Alleen krijg ik 1 error er niet uit, namelijk : 'Object reference not set to an instance of an object'

Dit krijg ik bij: lvMain.Items[Product.Text].SubItems[1].Text = "Hello";

Het zou moeten betekenen dat er geen waarde is geselecteerd.
Is er misschien een andere manier om een waarde te updaten van een bepaalde colom in dit geval 'Product.Text' wat leidt naar de text van de button. En de 2e sub rij in dit geval het aantal artikelen.

Code:
Code:
        private void productClick(object sender, EventArgs e)
        {
            Button Product = sender as Button;

            ListViewItem lvi = new ListViewItem(Product.Text);
            lvi.Name = Product.Text;
            
            if (lvMain.FindItemWithText(Product.Text) != null) // Hier kom je wanneer de waarde al bestaat
            {
                Waarde++;
                Int32 AantalItems = lvMain.Items.Count - 1;
                lvMain.Items.RemoveAt(AantalItems); // Verwijder laatst toegevoegd

               [B] lvMain.Items[Product.Text].SubItems[1].Text = "Hello";  [/B]
                




                    // lvi.SubItems.Add(Convert.ToString(Waarde)); // Aantal
                    //lvi.SubItems.Add("3"); // prijs
                    //lvi.SubItems.Add("4"); // bedrag
                    //lvMain.Items.Add(lvi);

            }
            else // Hier kom je als de waarde nog niet bestaat
            {
                Waarde = 1;
                lvi.SubItems.Add(Convert.ToString(Waarde)); // Aantal
                lvi.SubItems.Add("3"); // prijs
                lvi.SubItems.Add("4"); // bedrag
                lvMain.Items.Add(lvi);

                MessageBox.Show("Else");
            }

        }



Alvast bedankt! Ik ga ondertussen ook nog even verder zoeken.
 
Is het niet zo dat je met 'lvMain.Items.RemoveAt(AantalItems)' toevallig het item met de key 'Product.Text' verwijdert (aangezien je dat punt enkel kunt bereiken als 'lvMain.FindItemWithText(Product.Text)' niet gelijk is aan null, oftewel alleen als deze bestaat)? Wat gebeurt er bijvoorbeeld als je deze regel niet uitvoert?

Verder ziet een aanpak als het onderstaande er mijns inziens netter uit :p
[cpp]
ListViewItem item = lvMain.FindItemWithText(Product.Text);

if (item != null) {
item.SubItems[1].Text = "Hallo";
}
[/cpp]
 
Heb de code ondertussen aangepast in dit:

Code:
private void productClick(object sender, EventArgs e)
        {
            Button Product = sender as Button;

            ListViewItem lvi = new ListViewItem(Product.Text);
            lvi.Name = Product.Text;

            Double Prijs = 1.99, Bedrag;

            if (lvMain.FindItemWithText(Product.Text) != null) // Hier kom je wanneer de waarde al bestaat
            {
                Int32 AantalItems = lvMain.Items.Count - 1;
                lvMain.Items.RemoveAt(AantalItems); // Verwijder laatst toegevoegd

                Bedrag = (Waarde + 1) * Prijs; // Waarde +1 anders slaat hij 2 over

                Waarde++;
                lvi.SubItems.Add(Convert.ToString(Waarde)); // Aantal
                lvi.SubItems.Add(Convert.ToString(Prijs)); // Prijs
                lvi.SubItems.Add(Convert.ToString(Bedrag)); // Bedrag
                lvMain.Items.Add(lvi); //Artikel
            }
            else // Hier kom je als de waarde nog niet bestaat
            {
                Waarde = 1;
                Bedrag = Waarde * Prijs;

                lvi.SubItems.Add(Convert.ToString(Waarde)); // Aantal
                lvi.SubItems.Add(Convert.ToString(Prijs)); // Prijs
                lvi.SubItems.Add(Convert.ToString(Bedrag)); // Bedrag
                lvMain.Items.Add(lvi); //Artikel
            }
        }

Het programma werkt alleen is dit niet de juiste manier van doen lijkt mij. En er zit nog steeds dezelfde fout in die ik in eerste instantie probeerde op te lossen.
Als ik nu namelijk 3x op button 1 klik krijg ik in mijn listview waarde 1 afgedrukt met aantal = 3. Goed dus.
Wanneer ik vervolgens 2 keer button 2 klik krijg ik in mijn listview 1 keer waarde 1 afgedrukt met aantal = . en 1 keer waarde 2 met aantal = 2.

Zover alles goed, maar als ik dan vervolgens button 1 weer 2 keer aanklik dan krijg ik niet:
1 keer waarde 1 afgedrukt met aantal = 5
1 keer waarde 2 afgedrukt met aantal = 2

Maar dan krijg ik
1 keer waarde 1 afgedrukt met aantal = 3
1 keer waarde 1 afgedrukt met aantal = 4

Ipv dat hij waarde 1 update, update hij de laatste en verandert gelijk de waarde.

Ik hoop dat ik het zo een beetje duidelijk uitleg, anders upload ik wel het hele programma en kun je het met eigen ogen zien.



Is het niet zo dat je met 'lvMain.Items.RemoveAt(AantalItems)' toevallig het item met de key 'Product.Text' verwijdert (aangezien je dat punt enkel kunt bereiken als 'lvMain.FindItemWithText(Product.Text)' niet gelijk is aan null, oftewel alleen als deze bestaat)? Wat gebeurt er bijvoorbeeld als je deze regel niet uitvoert?

Verder ziet een aanpak als het onderstaande er mijns inziens netter uit :p
[cpp]
ListViewItem item = lvMain.FindItemWithText(Product.Text);

if (item != null) {
item.SubItems[1].Text = "Hallo";
}
[/cpp]
 
Ik hoop dat ik het zo een beetje duidelijk uitleg, anders upload ik wel het hele programma en kun je het met eigen ogen zien.

Dat zou inderdaad wel handig zijn. Je uitleg is mijns inziens namelijk behoorlijk vaag. :p
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan