c# - Winforms: Problems validating a cell in a datagridview -


i want validate winforms datagridview cell cellvalidating. if value not set correctly user set errortext , use e.cancel, cursor remains in cell. problem now, error-symbol (and error text) not displayed (in cell). when delete e.cancel cell looses focus , error-symbol displayed. how can achieve cell remains in edit mode , error-symbol displayed too?

if (...) {    this.datagridviewx.rows[e.rowindex].cells[e.columnindex].errortext = "errortext";    e.cancel = true; } else {    this.datagridviewx.rows[e.rowindex].cells[e.columnindex].errortext = ""; } 

the behaviour seeing due painting issue , not due error icon not being shown. happening when set cell's error text icon displayed text box of cell in edit mode painted on icon, hence no icon shown user!

you have 2 options fixing - 1 use row's error text instead of:

this.datagridviewx.rows[e.rowindex].cells[e.columnindex].errortext = "errortext";   e.cancel = true;   

you have:

this.datagridviewx.rows[e.rowindex].errortext = "errortext"; e.cancel = true; 

the other option change cell padding of cell (moving editing control) , painting icon in.

i found technique solving problem here , reproduced code below (in c# , not vb.net).

first have cell validating event add code change cell padding:

void datagridview1_cellvalidating(object sender, datagridviewcellvalidatingeventargs e) {     if (string.isnullorempty(e.formattedvalue.tostring()))     {         datagridviewcell cell = datagridview1.rows[e.rowindex].cells[e.columnindex];          cell.errortext =             "company name must not empty";          if (cell.tag == null)         {             cell.tag = cell.style.padding;             cell.style.padding = new padding(0, 0, 18, 0);         }         e.cancel = true;      }     else     {         datagridview1.rows[e.rowindex].errortext = string.empty;     } } 

that allows icon seen not editing control has moved, except icon has moved too! need paint new icon.

void datagridview1_cellpainting(object sender, datagridviewcellpaintingeventargs e) {     if (datagridview1.iscurrentcelldirty)     {         if (!string.isnullorempty(e.errortext))         {             graphicscontainer container = e.graphics.begincontainer();             e.graphics.translatetransform(18,0);             e.paint(this.clientrectangle, datagridviewpaintparts.erroricon);             e.graphics.endcontainer(container);             e.handled = true;         }     } } 

then when end editing on cell need reset padding:

void datagridview1_cellendedit(object sender, datagridviewcelleventargs e) {     if (!string.isnullorempty(datagridview1[e.columnindex, e.rowindex].errortext))     {         datagridviewcell cell = datagridview1.rows[e.rowindex].cells[e.columnindex];         cell.errortext = string.empty;         cell.style.padding = (padding)cell.tag;         cell.tag = null;     } } 

the post found neglects set mouse on new painted icon - here rough code addresses that, don't have time working there slight fudges thought fix - i'll tidy if minute later.

i set datagridview.showcelltooltips = true , introduce boolean inerror track if have editing error. handle mousehover event:

void datagridview1_mousehover(object sender, eventargs e) {     if (inerror)     {                         point pos = this.pointtoclient(cursor.position);                         if (r.contains(pos.x - 20, pos.y - 5))         {                                t.show("there error", datagridview1.editingcontrol, 3000);          }     } } 

the t in code form level tooltip control, , r rectangle.

i populate r below in cell painting handler:

void datagridview1_cellpainting(object sender, datagridviewcellpaintingeventargs e) {     if (datagridview1.iscurrentcelldirty)     {         if (!string.isnullorempty(e.errortext))         {                         graphicscontainer container = e.graphics.begincontainer();              r = datagridview1.getcelldisplayrectangle(e.columnindex, e.rowindex, true);             e.graphics.translatetransform(18, 0);             e.paint(this.clientrectangle, datagridviewpaintparts.erroricon);             e.graphics.endcontainer(container);                          e.handled = true;         }     } } 

i'm not happy minus 20 , minus 5 on position point - i'd fix if had bit more time.


Comments

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -