Spracovanie chyby formátu v CellParsing v DataGridView vo WinForms

Ahojte, narazil som na takú vec, a neviem, či je to niečo nedomyslené alebo som ja nepochopil filozofiu. Riešim situáciu, v DataGridView mám v CellParsing evente vlastné parsovanie hodnoty. Nenašiel som ale spôsob, ako z tohoto eventu dať vedieť naspäť DGV, že hodnotu má nesprávny formát. V dokumentácii to v príkladoch majú všade tak, že nenastavia ParsingApplied na true. Akože aby to mohli skúsiť parsovať ďalšie handlery alebo štandardné parsovanie.
Ja ale viem, že to má nesprávny formát a nechcem, aby sa to už ďalej parsovalo. Keď som skúsil vyhodiť výnimku, nebola ošetrená a program spadol, takže výnimky neočakávajú. Keď iba nenastavím ParsingApplied, DGV sa to pokúsi parsovať štandardne, čo ale nechcem. Keď nastavím Value na null alebo niečo nesprávne, DGV to aj tak parsuje štandardne, lebo hodnota je null alebo nie je dodržaný ValueType. Jediný spôsob, ako som to ošetril správne je tak, že som kontrolu urobil v CellValidating, potom to už funguje správne, akurát teda že potom sa hodnota parsuje 2x, raz v CellValidating a druhýkrát v CellParsing.
Konkrétny príklad pre kontext - na pozadí mám hodnotu povedzme typu byte, ktorá je v desatinách a zobrazuje sa ako desatinné číslo. Pri parsovaní, hodnota 25,4 je v poriadku, rozparsuje sa ako 254. Hodnota 26,1 už v poriadku nie je, lebo 261 je mimo rozsah typu byte. Pri desatinnom čísle to ešte ide, lebo to neprejde ani cez štandardné parsovanie. Ale keď zadám 253, štandardné parsovanie do bool to spracuje a zapíše 253 ako hodnotu…
Rozmýšlal som aj, prečo vlastne sa robí najprv CellValidating a až potom CellParsing, že je aj rozdiel, že CellValidating pracuje nad FormattedValue a CellValidated už nad Value. Nejaký dôvod na to asi mali, že to takto urobili.

Mne pride logické, ze najskôr robíš validáciu a až potom parsovanie hodnoty. Sú to dve rozdielne hodnoty a mám pocit, že vo validácii máš pristup aj k bunke a môžeš zmeniť farbu. Keď validácia dobehne v poriadku, tak potom ide na rad parsovanie, čo môže byť náročnejšia operácia, lebo napríklad môžeš ísť do externej aplikácie po dáta, atď.
Teda odpoveď by mala byť, že pri ošetrovaní údajov máme validačnú časť, kedy kontrolujeme textovú reprezentáciu hodnoty a parsing časť, kedy validnú hodnotu konvertujeme na konkrétny typ.

Jasne že aj takto to má logiku. Aj keď podľa mňa by sa dalo o tom baviť, mne to príde že vo väčšine prípadov na validáciu potrebuješ už parsovanú hodnotu, aspoň ja som to asi vždy tak mal, že som napr. validoval hodnotu na rozsah apod. A tiež aj validácia môže byť náročnejšia operácia, napr. nejaké IDčko do DB a kontrolovať, či sa to v DB nachádza apod.
Takže mi to nepríde až také jednoznačné. Ono ma to zaujalo hlavne preto, že asi prvýkrát som narazil na situáciu, kedy niečo parsujem ručne, ale vie to prejsť aj cez štandardné parsovanie a dá to odlišnú hodnotu.
Každopádne ale zrejme teda asi nijako neviem z CellParsing vrátiť chybu, že má hodnota nesprávny formát a už s tým nemá nič robiť.

Podľa mňa áno. Okrem

e.ParsingApplied = false;

nastavíš aj

e.Value = null;

a tym odrežeš ostatné parsery od parsovania hodnôt.

Nie je to tak, to som skúšal, a pozeral som aj do referenčných zdrojákov. Nakoniec je to napísané aj v dokumentácii:
When the event handler completes, if the ConvertEventArgs.Value is null or is not of the correct type, or the DataGridViewCellParsingEventArgs.ParsingApplied property is false, the Value is parsed using the cell ParseFormattedValue method with default type converters.

Síce o WinForms moc neviem, ale podľa mňa CellValidating nieje vhodný na validaciu business rules, ale viacmenej len na validaciu formátu,aby potom fungovali parseri.

Business rules validaciu by som oveľa radšej videl na tvojom samotnom objekte, napríklad pomocou data annotation, alebo fluent validation. Takto napísaná business logika je potom nezávislá od UI frameworku, kód má oveľa väčšiu šancu na dlhší život a je oveľa zrozumiteľnejší.

Asi záleží od projektu. Tento konkrétny ani nie je DGV bindované na dáta. Ale ďakujem, popozeral som si tie dve, vyzerá to pekne.