c# - WPF: Custom Datagrid with Checboxes -
i want create datagrid in our application looks this:
|name|email |oc |path|01.01.17|05.08.17|... (more dates , checkboxes) |foo |foo@bar.com|...|... |[x] | |... |bar |bar@bar.com|...|... |[ ] |[x] |... |foo |foo@bar.com|...|... | |[ ] |... as can see column count has dynamic , checkbox column can contain either checkbox or nothing. approach use converter build datatable.
public object convert(object value, type targettype, object parameter, cultureinfo culture) { var techwithdates = (techfvo[])value; var datatable = new datatable(); datatable.columns.add(new datacolumn("name")); datatable.columns.add(new datacolumn("email")); datatable.columns.add(new datacolumn("oc")); datatable.columns.add(new datacolumn("path")); if (techwithdates == null) return datatable.defaultview; var days = getformatteddays(techwithdates); foreach (var day in days) datatable.columns.add(new datacolumn(day, typeof(bool))); datatable.rows.add(datatable.newrow()); foreach (var tech in techwithdates) { if (tech.getterminliste().count == 0) continue; var datarow = datatable.newrow(); datarow[0] = tech.name; datarow[1] = tech.email; datarow[2] = string.isnullorwhitespace(tech.path) ? "no" : "yes"; datarow[3] = tech.path; addtechcols(datarow, tech, days); datatable.rows.add(datarow); } return datatable.defaultview; } private void addtechcols(datarow row, techfvo techs, list<string> adays) { var dates = techs.getterminliste(); var datesasstrlist = new list<string>(); foreach (var date in dates) { var thisstr = datetostring(date.day); if (!datesasstrlist.contains(thisstr)) datesasstrlist.add(thisstr); } foreach (var aday in adays) { if (datesasstrlist.contains(aday)) row[aday] = true; else row[aday] = dbnull.value; } } this works there checkboxes in every checkbox column in every row. how hide checkbox in column when build row?
i tried
row[aday] = false; row[aday] = null; row[aday] = dbnull.value(); but nothing worked... thanks!
you can intercept moment when datagridcheckboxcolumns created , change checkboxes settings.
add event handler datagrid.autogeneratingcolumn event
<datagrid autogeneratingcolumn="datagrid_onautogeneratingcolumn"> </datagrid> // fixing checkboxes in datagrid datagridcheckboxcolumns private void datagrid_onautogeneratingcolumn(object sender, datagridautogeneratingcolumneventargs e) { var column = e.column datagridcheckboxcolumn; if (column == null) return; var dg = sender datagrid; if (dg == null) return; column.elementstyle = (style)dg.findresource("datechk"); column.editingelementstyle = (style)dg.findresource("datechk"); } "datechk" checkbox style, declared in resources, makes checkbox hidden , disabled when value null (or dbnull.value in datatable)
<style x:key="datechk" targettype="checkbox"> <style.triggers> <trigger property="ischecked" value="{x:null}"> <setter property="visibility" value="hidden"/> <setter property="isenabled" value="false"/> </trigger> </style.triggers> </style>
Comments
Post a Comment