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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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

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