.net - Can't get minimum datagridview width after changing font -
this question hasn't been asked elsewhere here it's particular having changed font. , other answers have solution doesn't work after font change.
the fix width button meant set width of datagridview there no scroll bars.
if click add row, fix width change font fix width, fix width doesn't work. label them a,b,c,d
a)add row <-- works
b)fix width <--- works
c)change font <--- works
d)fix width, <--- fails
fix width worked on line b, fails on line d i.e. fails after font change.
i have alternative method min width, i've included, neither of them working.. width isn't getting set correctly.
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.threading.tasks; using system.windows.forms; namespace dgvblah1 { public partial class form1 : form { public form1() { initializecomponent(); } private void form1_load(object sender, eventargs e) { datagridview1.allowusertoaddrows = false; // maybe doesn't make difference here reaosn. datagridview1.autosizerowsmode = datagridviewautosizerowsmode.allcells; datagridview1.autosizecolumnsmode = datagridviewautosizecolumnsmode.allcells; datagridview1.columns.add("col1", "col1"); datagridview1.rows.add(1); /* btnaddrow.performclick(); btnchangefont.performclick(); btnaddrow.performclick(); btnfixwidth.performclick(); //fail */ } private int seeifworks_get_min_dgv_width_a(datagridview dgv) { // it's not bad, makes correct width , not quite enough, , it's worth running next method increments width until there no more horizontal scroll bars. int padding = 2; // wrong here, seems int tw = dgv.columns.getcolumnswidth(datagridviewelementstates.none) + dgv.rowheaderswidth + padding + 2; int th = dgv.rows.getrowsheight(datagridviewelementstates.none) + dgv.columnheadersheight; return tw; } private int seeifworks_get_min_dgv_width_b(datagridview dgv) { // http://stackoverflow.com/questions/6651487/programmatically-resize-datagridview-to-remove-scroll-bars // add 2 pixels border borderstyles other none. var controlborderwidth = (dgv.borderstyle == borderstyle.none) ? 0 : 2; // return width of columns plus row header, , adjusted dgv's borderstyle. return dgv.columns.getcolumnswidth(datagridviewelementstates.visible) + dgv.rowheaderswidth + controlborderwidth; } private void btnfixwidth_click(object sender, eventargs e) { // datagridview1.width = seeifworks_get_min_dgv_width_a(datagridview1); datagridview1.width = seeifworks_get_min_dgv_width_b(datagridview1); } private void btnaddrow_click(object sender, eventargs e) { datagridview1.rows.add(1); } private void btnchangefont_click(object sender, eventargs e) { datagridview1.columnheadersdefaultcellstyle.font = new system.drawing.font("courier new", 14.25f, system.drawing.fontstyle.bold, system.drawing.graphicsunit.point, ((byte)(0))); (int = 0; < datagridview1.rows.count; i++) datagridview1.rows[i].defaultcellstyle.font = new font("courier new", 30, fontstyle.bold); datagridview1.columnheadersdefaultcellstyle.font = new system.drawing.font("courier new", 14.25f, system.drawing.fontstyle.bold, system.drawing.graphicsunit.point, ((byte)(0))); } } }
when vertical scollbar not visible method works properly, if changing fond , adding rows vertical scrollbar got visible, should add width of scrollbar calculated width of columns. here better version of method calculates preferred width of datagridview
:
private int getpreferredwidth(datagridview grid) { var border = 0; if (grid.borderstyle == borderstyle.fixedsingle) border = 2 * systeminformation.bordersize.width; var vscrollwidth = 0; var vscroll = datagridview1.controls.oftype<vscrollbar>().firstordefault(); if (vscroll != null && vscroll.visible) border += vscroll.width; var columnswidth = grid.columns.getcolumnswidth(datagridviewelementstates.visible); var rowheaderswidth = 0; if (grid.rowheadersvisible) rowheaderswidth = grid.rowheaderswidth; return columnswidth + vscrollwidth + rowheaderswidth + border; }
also grid.getpreferredsize(new size(0, 0)).width;
option appends width. if don't mind width, size, can getpreferredsize
method.
Comments
Post a Comment