 |
Coders' city Nasza pasja to programowanie!
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Bleks
Dołączył: 27 Wrz 2012 Posty: 22
|
Wysłany: Sro Sty 27, 2021 3:19 pm OP Temat postu: [VB 2019] Odczyt komórki datagridview w trakcie wpisywania |
|
|
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 |
|
 |
|
samolot
Dołączył: 26 Sty 2006 Posty: 8376 Skąd: Toru?
|
Wysłany: Sro Sty 27, 2021 6:37 pm Temat postu: |
|
|
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 |
|
 |
Bleks
Dołączył: 27 Wrz 2012 Posty: 22
|
Wysłany: Czw Sty 28, 2021 8:36 am OP Temat postu: |
|
|
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 |
|
 |
samolot
Dołączył: 26 Sty 2006 Posty: 8376 Skąd: Toru?
|
Wysłany: Czw Sty 28, 2021 8:51 pm Temat postu: |
|
|
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 |
|
 |
Bleks
Dołączył: 27 Wrz 2012 Posty: 22
|
Wysłany: Pią Sty 29, 2021 9:28 am OP Temat postu: |
|
|
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 |
|
 |
samolot
Dołączył: 26 Sty 2006 Posty: 8376 Skąd: Toru?
|
Wysłany: Pią Sty 29, 2021 7:10 pm Temat postu: |
|
|
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 |
|
 |
Bleks
Dołączył: 27 Wrz 2012 Posty: 22
|
Wysłany: Sob Sty 30, 2021 9:14 am OP Temat postu: |
|
|
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 |
|
 |
samolot
Dołączył: 26 Sty 2006 Posty: 8376 Skąd: Toru?
|
Wysłany: Sob Sty 30, 2021 7:57 pm Temat postu: |
|
|
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 |
|
 |
Bleks
Dołączył: 27 Wrz 2012 Posty: 22
|
Wysłany: Nie Sty 31, 2021 11:17 am OP Temat postu: |
|
|
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 |
|
 |
samolot
Dołączył: 26 Sty 2006 Posty: 8376 Skąd: Toru?
|
Wysłany: Nie Sty 31, 2021 1:30 pm Temat postu: |
|
|
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 |
|
 |
|
|
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
|