DataGridView i edycja komórki

0

Witam

Mam taki problem, że mam dgv i właśnie edytuję komórkę jakiegoś wiersza. Następnie nie naciskając entera klikam myszą na inny wiersz. Występuje błąd dgv_DataError (niepoprawne dane np. null), który sobie przechwytuję, wyświetlam pytanie czy poprawić dane czy anulować zmiany i w przypadku chęci poprawy danych chciałbym wejść do ponownej edycji komórki, która spowodowała błąd. Problem w tym, że po kliknięciu w inny wiersz wywołanie dgv.BeginEdit() powoduje że tryb edycji dotyczy klikniętej komórki a nie tej, której dotyczył błąd.
Moje pytanie jest takie, jak w takiej sytuacji wejść w tryb edycji dla komórki której dotyczył błąd? Proszę o pomoc bo zagadnienie nie jest skomplikowane a utknąłem z tym na dobre :( Szukałem na google ale nie wiele znalazłem - być może nie wiedziałem o co pytać.
Z góry dziękuję :)

0

od dluzszego czasu nie uzywam standardowych kontrolek, ale sprawdz czy nie ma czegos w stylu FocusedCell, SelectedCell, ActiveCell
na pewno da sie ustawic, ktora komorka ma byc aktywna, poczytaj na msdn

0

Spróbuj ustawić komórkę, którą chcesz edytować za pomocą właściwości dataGridView.CurrentCell, a dopiero potem wywołujesz dataGridView.BeginEdit

0
adams85 napisał(a)

Spróbuj ustawić komórkę, którą chcesz edytować za pomocą właściwości dataGridView.CurrentCell, a dopiero potem wywołujesz dataGridView.BeginEdit

Tak próbuję robić, ale problem jest w tym, że currentcell dotyczy currentrow, a ten z kolei jest tylko do odczytu (get) czyli nie mogę go ustawić. Efekt jest taki, że widzę edytowaną komórkę tą, która powinna być edytowana, czyli jest ok, ale po naciśnięciu np. enter czyli zatwierdzenie edycji to widzę zmiany w komórce tej, która kliknąłem wcześniej, a nie w tej którą chciałem edytować. Kombinowałem na różne sposoby, ale najbliższy efekt jaki udało mi się uzyskać to ten który opisałem powyżej.

Proszę o więcej podpowiedzi :(

0

aktualizacja zaznaczenia

   if (autorbox.Text != "" && tytulbox.Text != "")
            {
                dt.Rows[dgv.CurrentCell.RowIndex].BeginEdit();

                dt.Rows[dgv.CurrentCell.RowIndex]["autor"] = autorbox.Text;
                dt.Rows[dgv.CurrentCell.RowIndex]["tytul"] = tytulbox.Text;

                dt.Rows[dgv.CurrentCell.RowIndex].EndEdit();
                dt.AcceptChanges();
            }

nie wiem czy o to chodziło ;/

0
adams85 napisał(a)

Zobacz te linki:
http://msdn.microsoft.com/en-us/library/ykdxa0bc%28VS.80%29.aspx
http://msdn.microsoft.com/en-us/library/t4a23xx4%28VS.80%29.aspx
Albo wklej trochę kodu, żebyśmy mogli zobaczyć co i jak

Dzięki. rzeczywiście sobie przeczytałem i na podstawie tego tekstu postanowiłem skorzystać ze zdarzenia dgv.RowValidating ewentualnie dgv.CellValidating tylko nie wiem jak rozpoznać, że dany wiersz lub komórka jest prawidłowa? Bo w jednym przypadku może być nullem w drugim nie, w jednym powinna być liczbą w innym stringiem itd. Więc teraz pytanie jak stwierdzić w tym zdarzeniu, że wartość komórki lub wiersza jest prawidłowa?

0

w eventArgs tego zdarzenia masz index kolumny i wiersza
majac index kolumny, mozesz ja pobrac z kolekcji kolumn i na podstawie czegos (od ciebie zalezy czego) stwierdzic jaki powinien byc typ oraz jakim ograniczeniom podlegac powinna wartosc

w msdn jest nawet przyklad http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcellcanceleventhandler.aspx
masz tam np. private Boolean IsDateGood(DataGridViewCell cell), za pomoca ktorego w przykladzie sprawdzaja date w polu, biorac pod uwage ze moze byc tam null, dopiero, kiedy nie ma nulla, probuja parsowania do datetime

1 użytkowników online, w tym zalogowanych: 0, gości: 1