Počet zobrazených řádků - datagrid   otázka

VB.NET, WinForms, Databáze

Mám smyčku, která načítá záznamy z mySQL databáze a pomocí Rows.Add je přidává do datagridu. Najednou mi to začalo načítat pouze prvních zhruba 15 řádků (viditelných) + 1 "neviditelný", těch řádků by to ale mělo načíst a zobrazit přes 1500. Ještě nedávno to fungovalo. Čím to může být, co jsem nastavil špatně ? Díky.

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

Doporučoval bych použít DataBinding, potom máte po starostech se synchronizací uživatelského rozhraní (DataGridView) a datového zdroje (MySQL).

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

S databinding jsem kdysi něco zkoušel, pak jsem něco špatně smazal a už jsem nebyl schopen projekt rozchodit. A vzhledem k tomu, že si svůj pracovní software vyrábím už rok a půl, tak by mě případný problém stál hodně. Navíc s databinding nemám zkušenosti, zkuste sem napsat ukázkový kód. Díky.

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

DataBinding je při správném použití to nejlepší a nejbezpečnější řešení. Binding dat je poměrně komplexní téma, na které jeden ukázkový kód nestačí a je potřeba nastudovat i dost souvisejících věcí, takže odkazuji do MSDN. Při vývoji samozřejmě nepřichází v úvahu pracovat s ostrými daty, to dá rozum, takže byste o nic nepřišel. DataBinding funguje téměř u všech ovládacích prvků a zdroj dat nemusí být jen databáze, takže skutečně doporučuji ho použít místo nějakého proprietárního řešení u kterého je mnohem větší pravděpodobnost že uděláte spoustu chyb.

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

Jestliže data načítáš manuálně mohlo dojít k chybě (po patnáctém záznamu), kterou máš ošetřenou v try. Zkus z načítání dat odstranit try jestli ti to popíše chybu, nebo chybu vyhledej standardním nástroji.

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

Chyba žádná...

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

Napiš více kódu, který používáš. Hlavně prosím ověř, že má tabulka opravdu 1500 záznamů :). Chybu v gridu nečekám.

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

Tabulka má opravdu 1500 záznamů. Na beton.


        seznam.Rows.Clear()

        ' Načtení seznamu na základě filtru...

        Dim Pocet As Integer, Kolo As Integer

        db = CreateObject("ADODB.Connection")
        db.Open("Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=access;User=kez;Password=kez;Option=3;")

        rs = CreateObject("ADODB.Recordset")
        rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs.Open("SELECT * FROM Zvirata WHERE Status = '" & Filtr & "' Order By Cislo", db, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

        If rs.BOF And rs.EOF Then GoTo Zavrit_rs

        Pocet = rs.RecordCount
        Kolo = 1

        Info_okno.labelinfo.Text = "Načítání seznamu..."
        Info_okno.Refresh()

Smycka_f:

        If rs.EOF Then GoTo Zavrit_rs

        Info_okno.progress.Value = Kolo / Pocet * 100

        seznam.Rows.Add(rs("Zeme").Value, Mid(rs("Cislo").Value, 1, 9) & " - " & Mid(rs("Cislo").Value, 10, 3), rs("Kategorie").Value, rs("Majitel").Value, rs("Chovatel").Value)

Posun_zv:

        ' Posun na další zvíře v databázi...

        Kolo = Kolo + 1

        rs.MoveNext()
        GoTo Smycka_f

Zavrit_rs:

        Call Zavrit_rs()

        seznam.ClearSelection()

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

tenhle kód jsem v ryclosti oškubal, je obsažen ve funkci, do které cpu proměnnou "Filtr"

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

No abych se přiznal moc se v tom neorientuju, ale pokud jsem to pochopil správně tak si z databáze vytáhnete data (a to pouze jedním dotazem) a výsledek který je kdesi v recordSetu přihazujete po řádcích do dataGridViewu.

Pokud to je tak jak říkám bylo by lepší si vytvořit dataTable a dataAdapter. Porovedete dotaz, výsledek pomocí dataAdapteru nacpete do dataTable a tu napojíte na dataGridView (doporučuji si přečíst stopařův průvodce po databázích na tomto webu zde je první díl: http://www.vbnet.cz/clanek--60-stoparuv_...

Je to jednoduché a rychlé. A nemusíte nic procházet cyklem.

Jo a když potřebujete něco procházet cyklem, používejte k tomu příkazy pro cykl (např. cykl For-Next) přeskakování v kódu pomocí Goto dělá kód značně nepřehledným. Vím o čem mluvím, když jsem začínal programovat dělal jsem to taky. Teď když potřebuji něco v nějáké miniaplikaci z té doby upravit nebo přidat novou funkci, radši než abych to luštil napíšu to celé znova.

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

Z mého pohledu je to teda brutální kód, ale proti gustu žádný dišputát :) Nevím proč tam není cyklus For a proč se dotazuje na konec recordsetu metodou rs.EOF (to je to nejpomalejší) lepší udělat cyklus for (a "goto" bych snad už nepoužival )

Ukázka:

for n=1 AS Int32 To VelikostRecordsetu
     Try
       'zde pridavat radky

     Catch ex As Exception
           exit for
     End Try

     rs.movenext
next n

K tvému problému: Tak jak je to napsáno může existovat spousta chyb, které nemusíš ani vidět: Jen tak zběžně, když se podívám nevidím ošetření Null hodnot při čtení z pole z tabulky databáze

např.

if isnull(rs("Majitel").Value)=false then

end if

Ve vb6 (nevím jestli to funguje v net - musel bych to vyzkoušet) jste nemuseli kontrolovat Null řetězce v případě, že jste je interpretovali jako string tnz. stačilo napsat:

"" & rs("Majitel").Value (ale vb to převedl na string)

Dále bych asi nepužíval (If rs.BOF And rs.EOF Then GoTo Zavrit_rs) když už bych šel touto cestou tak alespoň: If rs.BOF AndAlso rs.EOF Then GoTo Zavrit_rs

Promiň já bych to celé přepsal mohl bych o tom psát celý večer.

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

Díky za rady, zkusím to předělat. Nejsem profík a nikdy nebudu (respektive ani nechci být). Asi tak před 2 roky jsem si přečetl jednu z těch publikací typu "Visual Basic v kostce" a na základě toho jsem vyrobil program na vedení lékárny (ve spojení s Access databází a čtečkou čárových kódů) tehdy ještě ve VB6. Bylo to řešení z nouze, máti to potřebovala jako zdravotní sestra do práce. Tohle je druhý sofware, který vytvářím (pouze pro svojí potřebu případně pro potřeby kolegyně v práci) a svojí "rychlostí" mi plně stačí. Hned po výzvě zveřejnit svůj kód mi bylo jasné, že se těch chyb najde mrak. Živit se programováním nikdy nebudu, takže programátorská komunita v ČR může klidně spát. Neznamená to ale, že se nechci zlepšit, akorát to bude asi na úroveň nezbytně nutnou. Čas od času, jak objem programu roste, narazím na nějaký limit, v tomhle případě to odskákal datagrid a způsob jeho plnění. Všechna nabízená vylepšení určitě využiju, díky všem za odpovědi, tenhle dotaz považujte za vyřízený. Díky.

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