Chyba aktualizace Data GridView   otázka

VB.NET

Opět zdravím,

potřebuji aktualizovat DataGridView, ale aktualizace vyhodí chybu:

"Index je mimo rozsah. Index musí být nezáporný a musí být větší než velikost kolekce. Název parametru: index"

Podobný kód mi už kdysi běžel (aktualizace), takže bych si tipl, že mám něco špatně nastaveno v properities pro DataGridView

Private Sub SaveToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripButton1.Click
        Dim SQLDotaz As String
        Dim ConnectionString As String
        ConnectionString = "Server=localhost\SQLEXPRESS;Initial Catalog=LCS;Trusted_Connection=yes;"
        Dim Conn As New SqlConnection(ConnectionString)
        Dim Cmd As SqlCommand

        SQLDotaz = " INSERT INTO Contacts (Jmeno, Prijmeni, Spolecnost, Ulice, PSC, Mesto, Email, tel, web) VALUES ('" & NameTB.Text & "',' " & SurnameTB.Text & "',' " & SpolecnostTB.Text & "',' " & UliceTB.Text & "',' " & PSCTB.Text & "',' " & MestoTB.Text & "',' " & EmailTB.Text & "',' " & TelefonTB.Text & "',' " & WebTB.Text & "')"

        Try
            'Pridani zaznamu do tabulky OK
            Conn.ConnectionString = ConnectionString
            Conn.Open()
            Cmd = New SqlCommand(SQLDotaz, Conn)
            Cmd.ExecuteNonQuery()
        Catch ex As Exception
            'MessageBox.Show(ex.Message.ToString())
        End Try

        'aktualizace tabulky

        Dim da As New SqlDataAdapter("SELECT * FROM Contacts", Conn)
        ' Create DataSet, fill it and view in data grid
        Dim ds As New DataSet("zakaznici")
        da.Fill(ds, "zakaznici")
        DataGridView1.DataSource = ds.Tables("zakaznici").DefaultView



        Dim CisloRadku, PocetZaznamu, KolikRadku As Integer
        LabelUpdate(CisloRadku, PocetZaznamu, KolikRadku)

        'zamceni policek
        NameTB.Enabled = False
        SurnameTB.Enabled = False
        SpolecnostTB.Enabled = False
        UliceTB.Enabled = False
        PSCTB.Enabled = False
        MestoTB.Enabled = False
        EmailTB.Enabled = False
        TelefonTB.Enabled = False
        WebTB.Enabled = False
        SaveToolStripButton1.Enabled = False

        

        If KolikRadku > 1 Then
            MsgBox("Vícenásobný výběr!")

        Else
            NameTB.Text = DataGridView1.Rows(CisloRadku).Cells(1).Value.ToString()
            SurnameTB.Text = DataGridView1.Rows(CisloRadku).Cells(2).Value.ToString()
            SpolecnostTB.Text = DataGridView1.Rows(CisloRadku).Cells(8).Value.ToString()
            UliceTB.Text = DataGridView1.Rows(CisloRadku).Cells(3).Value.ToString()
            PSCTB.Text = DataGridView1.Rows(CisloRadku).Cells(5).Value.ToString()
            MestoTB.Text = DataGridView1.Rows(CisloRadku).Cells(4).Value.ToString()
            EmailTB.Text = DataGridView1.Rows(CisloRadku).Cells(6).Value.ToString()
            TelefonTB.Text = DataGridView1.Rows(CisloRadku).Cells(7).Value.ToString()
            WebTB.Text = DataGridView1.Rows(CisloRadku).Cells(9).Value.ToString()
        End If


    End Sub

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

V DataGridView se zřejmě odkazujete na řádek (popř. sloupec), který neexistuje...

Pro indexování řádků používáte proměnnou CisloRadku, kterou ale nikde nenastavujete, takže tady bych viděl problém.

Dim CisloRadku Integer
CisloRadku = DataGridView1.SelectedIndex

Další věcí je odkazování se na konkrétní sloupec... Zkontrolujte si, zda indexy odpovídají a hlavně zda máte v DataGridView minimálně deset sloupců (první sloupec má index 0).

Jinak doporučuji indexovat sloupce pomocí jejich názvů. Je to přehlednější a při přehození sloupců nemusíte hledat, kde všude se na ten a ten index odkazujete.

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

Indexovat podle názvu je dvousečná zbraň. Sice to je o něco málo přehlednější, ale pak když si na konci vzpomenete že je potřeba sloupec přejmenovt (např. je v něm překlep) musíte to opravovat v kódu. Ale co je hlavní, pokud budete chtít procházet tabulku v nějákém cyklu, stejně budete používat index sloupce a ne jeho jméno.

A u toho přehození, pokud myslíte to, že v dotazu změníte pořadí sloupců tak to ano, budete to muset upravit. Pokud ale máte na mysli situaci, kdy se načtou data a uživatel si v dataGridViewu přehází sloupce, tak zde problém nenastane, protože sloupce si i po přesunutí zachovají svůj původní index.

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

Procházet tabulku se dá přece i přes názvy sloupců...

Dim dr As DataGridViewRow
For Each dr In DataGridView1.Rows
  MessageBox.Show(
  String.Format("{0}", dr.Cells("EmployeeName").Value))
Next

Každopádně upravovat po někom projekt, ve kterém jsou jen indexy (a o komentářích ani nemluvím), musí být hodně pracné a většinou se tím vyrobí spousta dalších chyb i na jiných místech. Ale také pokud uvidíte svůj projekt třeba po roce, tak budete v určitých místech tápat, co jste tím a tím řádkem vlastně myslel.

Jinak v tom indexování rozdíl není :-)

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

CisloRadku načítám z modulu:

Module Module_kontakty

    Sub LabelUpdate(ByRef RadekCislo As String)
        '****************CO ZNAM
        'AppForm.DataGridView1.GetCellCount(DataGridViewElementStates.Selected) 'Yjisti kolik radku je vzbrano
        'AppForm.DataGridView1.GetCellCount(DataGridViewElementStates.Selected) 'vrati pocet sloupecku
        'AppForm.DataGridView1.SelectedCells(0).RowIndex                        'vrati cislo radku-1

        RadekCislo = AppForm.DataGridView1.SelectedCells(0).RowIndex
        'KolikRadku = AppForm.DataGridView1.GetCellCount(DataGridViewElementStates.Selected)
        'PocetZaznamu = AppForm.DataGridView1.GetCellCount(DataGridViewElementStates.Selected)
    End Sub
End Module

pomůže tohle v řešení???

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

Ošetřete si situaci, kdy dotaz nevrací žádné záznamy...

If DataGridView1.SelectedCells.Count > 0 Then
  ...
End If 

V tom případě bych ani nevolal LabelUpdate() a TextBoxům na konci bych nenastavoval hodnoty z DataGridView (třeba jen vymazat nebo ponechat).

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