Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[VB 2019] Odczyt komórki datagridview w trakcie wpisywania

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio: C#, VB, VC++, …
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Bleks



Dołączył: 27 Wrz 2012
Posty: 22

PostWysłany: Sro Sty 27, 2021 3:19 pm  OP    Temat postu: [VB 2019] Odczyt komórki datagridview w trakcie wpisywania Odpowiedz z cytatem Pisownia

Witam

Potrzebuj? odczyta? zawarto?? komórki DGV, ale w trakcie wpisywania, tzn. edytuj? konkretn? komórk? i w momencie wpisania liczby np.1 musz? wykona? pewne obliczenie z wpisan? liczb? (1) i wy?wietli? w labelu.Nast?pnie wpisuj? np.2 i znowu musz? wykona? obliczenie z liczb? (teraz ju? 12) i wy?wietli? w labelu.
Nie mog? znale?? zdarzenia ,które by to obs?u?y?o i g?owi? si? nad tym ju? kilka dni.
Zdarzenie CellValueChanged dzia?a dopiero po sko?czeniu edycji komórki tzn. po przej?ciu do innej.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8376
Skąd: Toru?

PostWysłany: Sro Sty 27, 2021 6:37 pm      Temat postu: Odpowiedz z cytatem Pisownia

Poni?ej wersja z zdarzeniem CellValueChanged DataGridView :

Kod:
Private Sub DataGridView1_CellValueChanged(sender As Object, e As
System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged

        Dim NW As Integer = 0, NK As Integer = 0, Wpis As String = "", Wynik As Single = 0

        If Not IsNothing(DataGridView1.CurrentCell) Then
            NW = DataGridView1.CurrentCell.RowIndex
            NK = DataGridView1.CurrentCell.ColumnIndex
            Wpis = DataGridView1.Rows(NW).Cells(NK).Value
            If IsNumeric(Wpis) Then
                Wynik = CInt(Wpis) ^ 2
                MessageBox.Show("Kwadrat liczby =" & Wynik.ToString)
            End If
        End If

    End Sub

Po dopisaniu ka?dej cyfry wyliczany jest kwadrat tej liczby.
Jego wad? jest to, ?e reakcja na zmiany tekstu w komórce nast?puj? dopiero po klikni?ciu w inn? komórk? siatki.

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Bleks



Dołączył: 27 Wrz 2012
Posty: 22

PostWysłany: Czw Sty 28, 2021 8:36 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dzi?ki za szybk? odpowied?

Niestety nie o to mi chodzi, bo jak sam napisa?e? wyliczenie nast?puje dopiero po klikni?ciu w inn? komórk?.
Ja potrzebuj? wykona? operacj? wyliczenia ju? w momencie wpisania liczby.
Zastanawiam si? czy jest to w ogóle mo?liwe do wykonania?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8376
Skąd: Toru?

PostWysłany: Czw Sty 28, 2021 8:51 pm      Temat postu: Odpowiedz z cytatem Pisownia

Nie s?dz? by w zdarzeniach dotycz?cych pojedynczej komórki siatki da?o si? to zrobi?. Jednak nie mia?em takiej potrzeby wiec by? mo?e jakie? wyj?cie jest, tylko trzeba pokombinowa? ze zdarzeniami. Trzeba by napisa? testowy kod sprawdzaj?cy kolejno?? zdarze?, których DataGrigView ma kilkadziesi?t, ale przeci?tnie zna si? i u?ywa kilku.
A poza tym gdyby? dok?adniej napisa?, co chcesz osi?gn??, to by? mo?e mo?na cel osi?gn?? inaczej. Na przyk?ad ja wpisywa?bym cyfry do osobnego pola tekstowego i w nim w zdarzeniu textChange pobiera? bym zmieniaj?cy si? tekst i poddawa? go "obróbce" przed wstawieniem do komórki siatki. Ta "obróbka tekstu" to co? w rodzaju sprawdzania pisowni w locie. Na przyk?ad edytory tekstu to robi? "w locie" wi?c z tego wida?, ?e jest to mo?liwe. Je?li ci? to sprawdzanie zaintryguje to mog? poszuka? mój stary kod, kiedy ?wiczy?em sobie takie sprawdzanie pisowni. Nawet dzia?a?o, tyle, ?e pracy by?o przy tym sporo.

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Bleks



Dołączył: 27 Wrz 2012
Posty: 22

PostWysłany: Pią Sty 29, 2021 9:28 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

Wydawa?o mi si?, ?e napisa?em dok?adnie o co mi chodzi:
W trakcie edycji komórki w DGV, w momencie wpisania liczby ma by? wykonane pewne obliczenie na podstawie
warto?ci w komórce i wynik wy?wietlony w osobnym Labelu.Za ka?dym razem gdy zmienia si? warto?? w komórce ma by? wykonywane to obliczenie i wynik wy?wietlony w tym Labelu.
Wpisywanie w osobnym TextBoksie mnie nie urz?dza, bo chc? to zrobi? w trakcie edycji komórki.

Mo?e wiesz, gdzie przechowywana jest zawarto?? komórki w trakcie wpisywania?
Tak sobie my?l?, ?e mo?e tam spróbowa?, bo do tej pory wszystkie zdarzenia jakie próbowa?em s?
wykonywane po klikni?ciu w inn? komórk?.Próbowa?em te? z KeyPress, ale nie dzia?a w trakcie edycji.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8376
Skąd: Toru?

PostWysłany: Pią Sty 29, 2021 7:10 pm      Temat postu: Odpowiedz z cytatem Pisownia

Cytat:
Mo?e wiesz, gdzie przechowywana jest zawarto?? komórki w trakcie wpisywania?
Nie wiem. Zapewne w "pami?ci podr?cznej programu/kompilatora?. Pewnie jakim? API to da si? zrobi?. Ja nie próbowa?em.

Cytat:
Wydawa?o mi si?, ?e napisa?em dok?adnie o co mi chodzi:

Pyta?em nie tyle "o co ci chodzi" w sensie edycji komórki ,bo chodzi ci o to, jak zrobi? ci edycj? komórki w locie" - to rozumiem. Lecz pyta?em "co chcesz osi?gn???" tymi obliczeniami, bo intuicyjnie czuj?, ?e z góry zak?adasz, ?e wybrany przez ciebie sposób osi?gni?cia celu jest s?uszny. Mo?e s? inne sposoby?

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Bleks



Dołączył: 27 Wrz 2012
Posty: 22

PostWysłany: Sob Sty 30, 2021 9:14 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

A wi?c,mam DGV z dwiema kolumnami.
Kolumna 1 to opis czynno?ci(wprowadzany tekst)
Kolumna 2 to koszt(wprowadzana liczba), jest ona w formacie "C2"(waluta) i wy?wietla dane w formie waluty (z?).DGV jest powi?zany z DataTable i w momencie ?adowania formy dane z DataTable s? wstawiane do DGV.
W osobnym Labelu (Koszt ca?kowity) sumowane s? wszystkie dane z Kolumny 2.
Po klikni?ciu na pust? komórk? np.w Kolumnie 2 przechodzi ona w stan edycji i chc?, aby w trakcie wpisywania
(w locie) w wy?ej wymienionym Labelu zmienia? si? ca?kowity koszt z uwzgl?dnieniem wpisanej w danym momencie liczby.My?l?, ?e wyczerpuj?co wyja?ni?em zagadnienie.
Musi to by? raczej DGV, bo nie znalaz?em innej kontrolk,i w której mo?na by to zrealizowa?(powi?zanie z DataTable i dodatkowa edycja).

Dzi?ki wielkie za zainteresowanie moim problemem i prosz? o jakie? rozwi?zanie bo ja poma?u ju? si? poddaj?.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8376
Skąd: Toru?

PostWysłany: Sob Sty 30, 2021 7:57 pm      Temat postu: Odpowiedz z cytatem Pisownia

Mo?e da si? to zrobi? w osobnym procesie ? Ale ja wielow?tkowo?ci nie stosowa?em.

Moim zdaniem nawet Excel nie ma takiej funkcjonalno?ci. Je?li wstawisz w nim na przyk?ad formu?y sumuj?ce komórki w kolumnach, to wpisuj?c w komórk? tego zakresu liczb?, póki edytujesz komórk?, to formu?a jeszcze nie liczy. Musi nast?pi? klikni?cie w cokolwiek innego poz? komórk?, by suma zasta?a zaktualizowana. Dlatego dalej twierdz?, ze tobie te? powinna wystarczy? aktualizacja oblicze? po klikni?ciu w osobn? komórk?. Excel ma o wiele wi?cej funkcjonalno?ci od DataGridView, wi?c gdyby to by?o takie oczywiste i proste, to Microsoft by tak? funkcjonalno?? w nim zrobi?. A dlaczego nie zrobi?? No w?a?nie to jest dobre pytanie. Ja uwa?am, ?e takie "co?" zbytnio by niepotrzebnie obci??a?o moc obliczeniow? procesora. Nie chodzi o kilka kolumn i wierszy, gdy takie przetwarzanie jest pestk?, ale przecie? s? tak?e dane zajmuj?ce setki wierszy i kolumn, a wtedy robi? si? schody. Mo?na wy??czy? odtwarzanie obrazu na czas takich jak twoje ,oblicze?, ale to Ci te? nie poka?e danych w locie we etykiecie.
Je?li ty, chc?c wpisa? do komórki liczb? 12 i wpiszesz najpierw cyfr? 1, za zb?dne uznano od?wie?anie po ka?dej cyfrze bo edycja nie jest sko?czona, od?wie?anie obrazu nast?pi dopiero po zmianie komórki na inn? i od?wie?any jest ca?y ekran ,a nie tylko ta komórka. Po co przetwarza? najpierw 1 a potem 12, je?li wpisywanie nie jest jeszcze sko?czone? Nie wiem ile docelowo b?dziesz tych danych w siatce mia?, ale to pewnie wp?ynie na "zamulenie przetwarzania".
Ale mo?e tobie si? uda. Bo same obliczenia w zdarzeniu TextChange wykonuj? si? na bie??co , ale odtwarzanie ca?ego ekranu, a wi?c i etykiety, nast?puje dopiero po zmianie komórki.

_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Bleks



Dołączył: 27 Wrz 2012
Posty: 22

PostWysłany: Nie Sty 31, 2021 11:17 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

Po przemy?leniu sprawy stwierdzi?em, ?e w sumie masz racj?.Wychodzi na to, ?e chcia?em przedobrzy?.
Chodzi?o mi o to, ?e gdy kto? edytuje komórk? i nie wyjdzie z edycji(nie kliknie np.w inn? komórk?) a nast?pnie
wy??czy Form? to nie zapisze mu nowych danych, ale sprawdzi?em dok?adnie i okaza?o si?, ?e jednak przed zamkni?ciem zdarzenie CellValueChanged oblicza i zmienia dane.Tak wi?c zostawiam tak jak jest i nie kombinuj? wi?cej.
Ale w trakcie wynikn?? inny problem:
Poniewa? kolumna 2 jest w formacie "waluta", dane wprowadzane musz? by? typu "Decimal".
Je?eli wpisze si? np. liter? to wywala b??d.Mo?na go obs?u?y? zdarzeniem DataError i poinformowa?, ?e
nale?y wpisa? liczb? (to nie jest problem),ale gdy wpisze si? liczb? dziesi?tn? z kropk? zamiast przecinka
to chcia?bym, aby zdarzenie DataError(poniewa? w tym przypadku te? wyskakuje b??d) podmienia?o mi
t? kropk? na przecinek(to akurat umiem zrobi?) i podmienia?o wpis w tej komórce(kod wstawiaj?cy w dan? komórk? w zdarzeniu mam, ale nie podmienia.
Kod:
Dim rowind As Integer = Me.dgv.CurrentCell.RowIndex
        Dim cellind As Integer = Me.dgv.CurrentCell.ColumnIndex
        Dim wpis As String = Me.dgv.CurrentCell.EditedFormattedValue.ToString.Replace(".", ",")

        Me.dgv.Rows(rowind).Cells(cellind).Value = wpis


Mo?e ty masz pomys? na rozwi?zanie tego problemu
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8376
Skąd: Toru?

PostWysłany: Nie Sty 31, 2021 1:30 pm      Temat postu: Odpowiedz z cytatem Pisownia

A gdzie ten kod masz wstawiony? On powinien by w procedurze zdarzenia CellValueChange kontrolki DataGridView. Je?li tam b?dzie to powinno dzia?a?.
Ale w wierszu 3 twojego kodu zamie? to, co zaznaczy?em w poni?szym cytacie na czerwono na to co zaznaczy?em na zielono:
Cytat:
Dim wpis As String = Me.dgv.CurrentCell.EditedFormattedValue.ToString.Replace(".", ",")

Me.dgv.Rows(rowind).Cells(cellind).Value = wpis
. Sprawd? sobie czy zmienna Wpis rzeczywi?cie zawiera to co wpisa?e? oryginalnie, nast?pnie zmie? format tego stringa i dopiero wtedy wstawiaj na powrót do komórki (wiersz 4). Nie sprawdza?em tego u siebie, ale przypuszczam, ?e twój kod z wiersza 3 nie podmienia znaków.


A poza tym:
Cytat:
Chodzi?o mi o to, ?e gdy kto? edytuje komórk? i nie wyjdzie z edycji(nie kliknie np.w inn? komórk?) a nast?pnie
wy??czy Form? to nie zapisze mu nowych danych
Znam ten problem. Ja tworz? na poziomie modu?u zmienn? o nazwie "Zmiany", typu Boolean i daj? jej pocz?tkowo warto?? False. Natomiast w procedurze zdarzenia CellValueChange kontrolki DataGridView ustawiam j? na True. Procedura zapisuj?ca zmiany po zapisie zmienia j? na False. Je?li potem u?ytkownik zamyka program, to w procedurze FormClosing formy automatycznie sprawdzana jest warto?? tej zmiennej Zmiany. Je?li jest True, to wy?wietla komunikat przypominj?cy o zapisie.
_________________
Nie zadawaj bezcelowych pyta? / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio: C#, VB, VC++, … Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.23499 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |