Pohyb v datagrid   zodpovězená otázka

VB.NET, Komponenty, .NET

Může mi prosím někdo poradit, jak se mohu programově pohybovat v datagridu ?

Jde mi o to, že proběhne načtení dat a následně jejich kontrola a já se poté potřebuji dostat programově na určitou pozici.

Tu pozici mám uloženou v hodnotě x a y.

A ještě mám jeden dotaz ohledně datagridu. Jaká událost (název) se dá použít pro ověření dat ještě před opuštěním buňky ? Prostě nějaká náhrada jako byla událost ve VB6 "BeforeUpdate"

Řekněmě, že uživatel zadá do buňky písmeno a já chci udělat kontrolu ještě před opuštěním buńky s tím, že nechci aby uživatel buňku při chybném zadání opustil.

Předem děkuji za pomoc

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

Index aktuálního řádku a sloupce nastavíte pomocí vlastností DataGrid1.CurrentRowIndex (aktuální číslo řádku) a DataGrid1.CurrentCell (aktuálně vybraná buňka, ta má vlastnosti RowIndex a ColumnIndex).

Pokud chcete kontrolovat, jestli tam uživatel zadal povolenou hodnotu, doporučuji spíš událost CellValidating. Pokud nastane chyba a uživatel zadá nepovolenou hodnotu, pak jest nutno nastavit e.Cancel na True, aby se změna neuložila. Příklad je na stránce http://msdn.microsoft.com/en-us/library/... .

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

Skvělý, díky.

A když znám oba indexy, jak mohu programově nastavit hodnotu buňky, např. smazat chybné zadání (písmeno) ?

Vypadá to, že Datagrid1.CurrentCell.value nelze používat ?

Private Sub Datagrid1_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles Datagrid1.CellValidating
If IsNumeric(e.FormattedValue) Or e.FormattedValue = Nothing Then
Else
Datagrid1.CurrentCell.Value = Nothing ' nereaguje
MsgBox("Je nutné zadat kladnou číselnou hodnotu", MsgBoxStyle.Information, "Chybné zadání")
e.Cancel = True
End If
End sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nastavit programově hodnotu buňky je poměrně snadné:

'y je číslo řádku, x je číslo sloupce, čísluje se od nuly
DataGrid1.Rows(y).Cells(x).Value

Ale mělo by to jít i přes tu CurrentCell, nevím, co tam může být za problém.

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

e.cancel = true, zamezí opuštění buňky. Tím sice zamezím opuštění v případě chyby ale nemohu zadanou chybnou hodnotu nejdříve smazat.

DGW_PSO.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = 0

prostě vb.net ignoruje pokud se jedná o aktuální právě editovanou buńku. Stejně tak i vlastnost currentcell.

Takže pokud bych chtěl ošetřit chybu při zadání např. písmene místo čísla. Musel bych e.cancel = true zrušit resp. povolit opuštění buňky změnit hodnotu předchozí chybně zadané buňky na 0 nebo "" nebo nothing ? a vrátit se do ní.

Jenže pořád nemůžu najít metodu jako byl ve VB6 select, která mi vybere aktuální buňku na základě mnou zvolené indexové adresy, kterou sitřeba uložím do dvou proměnných x a y. Můžu změnit hodnotu v libovolné buňce, ale jak z ní "udělat" aktuální vybranou buňku na to nemohu přijít ?

Pak mě napadá to řešit přes textbox, kde se dá perfektně kontrolovat na úrovni jednotlivých znaků zadání uživatele. Např. povolit jen zadání číselných hodnot, případně použít NumericUpDown, ale to bych zase musel před datagridview "podstrkávat" jiné ovládací prvky a přijde mi to zbytečné pokud tedy podobné problémy umí řešit i buňka v datagridview. Jenže to zase nevím co se dá s buńkou v datagridview dělat. Přijdou mi zatím možnosti buňky velice omezené a na MSDN jsem o tom taky moc nenašel

    Private Sub DGW_PSO_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DGW_PSO.CellValidating
            If e.ColumnIndex > 1 Then
                If IsNumeric(e.FormattedValue) Or e.FormattedValue = Nothing Then
                    Me.DGW_PSO.Rows(e.RowIndex).ErrorText = ""
                Else
                    Me.DGW_PSO.Rows(e.RowIndex).ErrorText = "Chybné zadání"
                    DGW_PSO.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "" 'nereaguje na změnu !!!
                    MsgBox("Je nutné zadat kladnou číselnou hodnotu", MsgBoxStyle.Information, "Chybné zadání")
                    e.Cancel = True
                End If
            End If
    End Sub

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

Já bych spíš řekl, že komponenta DataGridView je strašně komplexní a složitá, umí prakticky všechno, ale málokdo ví, jak se ta a ta funkce využije.

Příklad, jak validaci používat, je třeba tady, stačí hledat: http://msdn.microsoft.com/en-us/library/...

Přiřazení do buňky samozřejmě funguje a hodnota buňky se inkriminovaným řádkem krásně nastaví, problém je v něčem jiném. Když editujete buňku v DataGridView, tak se při zahájení editace vytvoří tzv. EditingControl (je to většinou TextBox), do kterého se zkopíruje hodnota buňky. V okamžiku, kdy chcete buňku opustit, se zavolá několik událostí (mimo jiné CellValidating), a jakmile validace projde, hodnota z editovací komponenty se uloží do buňky. Vy tedy v události CellValidating krásně změníte řádkem, o němž se domníváte, že nefunguje, hodnotu buňky, ale nad tou buňkou je právě EditingControl, které hodnotu nezměníte. Je tedy třeba místo nastavování hodnot přímo buňce nastavit prázdný text do EditingControl:

DataGridView1.EditingControl.Text = ""

Pokud potřebujete vybrat programově nějakou buňku, není nic jednoduššího, než ji přiřadit do CurrentCell:

DataGridView1.CurrentCell = DataGridView1.Rows(5).Cells(2)
nahlásit spamnahlásit spam 0 odpovědětodpovědět

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