TargetInvocationException   zodpovězená otázka

VB.NET

Dobrý večer,

rád bych Vás poprosil o radu.

Zde je testovací příklad:

VS 2010

.NET 3.5

Mějme formulář Form1, na něm dvě tlačítka Button1 a Button2, a ListView1. U ListView jsou nastaveny vlastnosti View = Details a CheckBoxes = True

Imports System.ComponentModel

Public Class Form1

    Private Sub BackgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        Dim currentXml_ As New XDocument
        currentXml_.Add(New XElement("Root"))
        currentXml_.Element("Root").Add(New XElement("Item", New XElement("Name", "value 1")))
        currentXml_.Element("Root").Add(New XElement("Item", New XElement("Name", "value 2")))
        currentXml_.Element("Root").Add(New XElement("Item", New XElement("Name", "value 3")))

        Dim items As New List(Of ListViewItem)
        For Each node As XElement In (From nodes As XElement In currentXml_.Descendants("Root").Descendants("Item") Select nodes)
            Dim item As New ListViewItem
            item.Text = node.Element("Name")
            items.Add(item)
        Next
        e.Result = items.ToArray
    End Sub

    Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
        Dim result As ListViewItem() = CType(e.Result, ListViewItem())
        ListView1.Items.Clear()
        ListView1.Items.AddRange(result)
    End Sub

    Private Sub GenerateXML()
       Dim appThread As New BackgroundWorker
        AddHandler appThread.DoWork, AddressOf BackgroundWorker_DoWork
        AddHandler appThread.RunWorkerCompleted, AddressOf BackgroundWorker_RunWorkerCompleted

        appThread.RunWorkerAsync()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        GenerateXML()
    End Sub

    Private Sub ListView1_ItemChecked(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles ListView1.ItemChecked
        Button2.Enabled = ((From lvi As ListViewItem In ListView1.Items Where lvi.Checked Select lvi).Count > 0)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        GenerateXML()
    End Sub
End Class

Jedná se o silně zjednodušený příklad, ale problém je zde patrný. Spuštění aplikace proběhne správně. Chyba nastane v metodě ListView1_ItemChecked po stisku tlačítka Button1, ale pouze v případě, kdy jsou v metodě BackgroundWorker_RunWorkerCompleted odstraněny položky ListView.

ListView1.Items.Clear()

Možná jsem něco přehlédnul, ale nevím si s tím rady. Za každou radu budu vděčný.

Díky a přeji příjemný večer

Dufek

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Daná položka může být mazána zrovna v momentě, kdy vyvolala událost ItemChecked. Podívejte se, co vězí v podrobnostech vyjímky, konkrétně InnerException.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zřejmě máte pravdu. Text chyby je:

InnerException: System.NullReferenceException

Message=Odkaz na objekt není nastaven na instanci objektu.

Každopádně mě nenapadá jak resp. kde to ošetřit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už jsem to vyřešil.

Tento kód:

    Private Sub ListView1_ItemChecked(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles ListView1.ItemChecked
        Button2.Enabled = ((From lvi As ListViewItem In ListView1.Items Where lvi.Checked Select lvi).Count > 0)
    End Sub

jsem nahradil tímto:

    Private Sub ListView1_ItemChecked(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles ListView1.ItemChecked
        Dim count As Integer = 0
        For Each item As ListViewItem In ListView1.Items
            If item IsNot Nothing Then count += 1
        Next

        Button2.Enabled = (count > 0)
    End Sub

Díky za postrčení správným směrem.

JD

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback