Index out of range   zodpovězená otázka

VB.NET, Algoritmy

Ahoj, mám prolbém se kterým si nevím rady. Mám 1 datagridView do kterého se načtou záznamy podle toho, jaký radiobutton uživatel vybere. Až do dneška to fungovalo bez problémů, ale dnes (a netuším proč) když si načtu do gridu data a pak chci načíst jiná mi vyskočí msgbox s hláškou:

The following exception occurred in the DataGridView:

System.IndexOutOfRangeException: Index 3 does not have a value.

as System.Windows.Forms.CurrencyManager.get_item(Int32 index)

at System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex)

Problém je že to je msgbox (kód se mi ve Visual Studiu nezastaví) a zajímavé je že když kód od začátku krokuju tak i když nasimuluju stejnou situaci tak k této vyjímce nedojde. Nevím tedy ani kde přesně chybu hledat:(

Data načítám z SQL serveru ale v načítání není problém. Do včerejška mi to fungovalo a navíc data se při prvním kliku na radioButton načtou vždy v pořádku.

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

Zvláštní? Nezměnil se kód aplikace, nezměnilo se něco v databázi, nenainstaloval jste nějakou novou aplikaci?

Pokud to při odkrokování nedělá, a jinak jo, nesnažíte se třeba pracovat s daty, která ještě nemusí být načtená z databáze, a problém je, že někdy se to stihne načíst, ale někdy ještě ne?

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

Zvláštní je že to dělá i když zakomentuju veškerý kód, který s daty něco dělá. To znamená že data se pouze načítají a yhazuje mi to tuto vyjímku. Asi to udělám tak že se vrátím ke včerejší verzi kódu a změny které jsem tam provedl budu přidávat postupně. Snad příjdu na to čím to bylo.

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

Takže jsem na to už přišel (teda přišel jen částečně, vím kdy to dělá ale nevím proč). Měl jsem proceduru která zobrazovala vybraná data v textboxu. Tato procedura byla spouštěna při událostech CellClick,KeyDown a KeyUp (prostě vždy když uživatel vybere jiný řádek). přišlo mi to neefektivní, takže jsem tyto 3 události nahradil CurrentCellChanged. A tam mi to právě vyhazuje chybu a to i přesto že zde mám použitý blok Try-Catch...

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

No, jediná možnost, zkuste to odkrokovat, a uvidíte, na kterém řádku to padá. Nebo sem hoďte kus kódu.

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

Z události CurrentCellChanged volám tuto proceduru:

    Sub zobrazeniPoznamekPriKliku()

        Dim poznamka As String 
        Dim dluznik As String 
        Dim stav As String 
        Dim usek As String 
        Dim pravnik As String 
        Dim likvidator As String
        Dim radek As Integer

        Try
            radek = frmaplikace.DataGridViewPredpisy.CurrentCell.RowIndex
        Catch
            radek = 0
        End Try


        '==============================================================

        Try
            If frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(7).Value Is DBNull.Value Or frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(7).Value = "" Then
                likvidator = "..."
            Else
                likvidator = frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(7).Value
            End If
        Catch
            likvidator = "..."
        End Try



        Try
            If frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(9).Value Is DBNull.Value Or frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(9).Value = "" Then
                pravnik = "..."
            Else
                pravnik = frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(9).Value
            End If
        Catch
            pravnik = "..."
        End Try




        Try
            If frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(10).Value Is DBNull.Value Or frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(10).Value = "" Then
                dluznik = ""
            Else
                dluznik = frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(10).Value
            End If
        Catch
            dluznik = ""
        End Try




        Try
            If frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(11).Value Is DBNull.Value Or frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(11).Value = "" Then
                stav = "..."
            Else
                stav = frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(11).Value
            End If
        Catch
            stav = "..."
        End Try



        Try
            If frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(12).Value Is DBNull.Value Or frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(12).Value = "" Then
                usek = "..."
            Else
                usek = frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(12).Value
            End If
        Catch
            usek = "..."
        End Try



        Try
            If frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(13).Value Is DBNull.Value Or frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(13).Value = "" Then
                poznamka = ""
            Else
                poznamka = frmaplikace.DataGridViewPredpisy.Rows(radek).Cells(13).Value
            End If
        Catch
            poznamka = ""
        End Try


        '============================================================


        frmaplikace.textBoxPoznamka.Text = poznamka
        frmaplikace.TextBoxDluznik.Text = dluznik
        frmaplikace.ciselnikStavy.SelectedItem() = stav
        frmaplikace.ciselnikUsek.SelectedItem() = usek
        frmaplikace.ciselnikPravnik.SelectedItem() = pravnik
        frmaplikace.ciselnikLikvidator.SelectedItem() = likvidator

      

    End Sub

Když načtu data do datagridViewu poprvé je vše ok. Pokud je tam ale chci načíst podruhé (tzn. refresh nebo načtení jiných dat do stejného datagridViewu) hodí to výše zmíněnou chybu. Ale pokud kód krokuju proběhne vše v pořádku. Pokud tuto proceduru volám z jiných události (CellClick,KeyDown,KeyUp) proběhne vše bez problémů.

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

Tak to je divné. Zkuste dát breakpoint do půlky a pokud to hodí MsgBox, pak je chyba před ním, jinak za ním. Tím se problém zúží na polovinu. Nic lepšího mě v tuto chvíli nenapadá. Viděl bych to, že problém bude v jednom z posledních 6 řádků.

nahlásit spamnahlásit spam 1 / 1 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