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.

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
        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:

1
2
3
4
5
6
7
8
9
10
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ř.

1
2
3
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

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