any appreciated. sorry, if code junior. new c#.
problem
i've dynamically create multiple datagrids in flyout, using mahapps. datagrids populated csv files (convertcsvtodatatable()). want user able make changes datagrids , when done, datagrids values replace csv files(updatedatagridparameter()).
ui tree: flyout > stackpanel > groupbox > datagrid
issue
dg.selectallcells() not select user changed datagrid. how can visual ui representation of datagid or bind dt property data change event. hope explained correctly. if have questions can me please post , respond quickly. thanks
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.io; using system.linq; using system.text; using system.windows; using system.windows.controls; using system.windows.data; namespace spiderroll.classes { public class datagridproperties { private int idvalue; public int id { { return idvalue; } set { idvalue = value; } } private string headervalue; public string header { { return headervalue; } set { headervalue = value; } } private string descriptionvalue; public string description { { return descriptionvalue; } set { descriptionvalue = value; } } private string namevalue; public string name { { return namevalue; } set { namevalue = value; } } private string filepathvalue; public string filepath { { return filepathvalue; } set { filepathvalue = value; } } private datatable dtvalue; public datatable dt { { return dtvalue; } set { dtvalue = value; } } public static datagridproperties datagridobject(list<datagridproperties> tbp, int id = 0, string name = "") { foreach (var tb in tbp) { if (tb.id == id || tb.name == name) { return tb; } } return null; } public static int finddatagridid(list<datagridproperties> dgp, string name = "") { int = 0; foreach (var dg in dgp) { if (dg.name == name) { return i; } i++; } return -1; } public static groupbox datagridpropertiestackpanel(datagridproperties datagrid) // datagridproperties datagrid { groupbox gb = new groupbox(); gb.header = datagrid.header; stackpanel spmain = new stackpanel(); spmain.orientation = system.windows.controls.orientation.vertical; system.windows.controls.label lbdescription = new system.windows.controls.label(); lbdescription.content = datagrid.description; lbdescription.margin = new thickness(10, 0, 0, 0); spmain.children.add(lbdescription); stackpanel sp = new stackpanel(); sp.name = datagrid.name; sp.orientation = system.windows.controls.orientation.horizontal; sp.margin = new thickness(10); system.windows.controls.datagrid dg = new system.windows.controls.datagrid(); dg.name = datagrid.name; dg.canuseraddrows = false; dg.itemssource = datagrid.dt.defaultview; sp.children.add(dg); spmain.children.add(sp); gb.content = spmain; return gb; } public static datatable convertcsvtodatatable(string filepath) { streamreader sr = new streamreader(filepath); string[] headers = sr.readline().split(','); string[] firstline = sr.readline().split(','); datatable dt = new datatable(); datacolumn column = new datacolumn(); datarow fl = dt.newrow(); int idx = 0; foreach (string header in headers) { //if bool in first row, turn column checkbox. if (firstline[idx].tolower() == "true" || firstline[idx].tolower() == "false") { column = dt.columns.add(header, typeof(bool)); } else { column = dt.columns.add(header, typeof(string)); column.readonly = true; } if (header.endswith("~")) { column.readonly = true; } //reading , building first row fl[idx] = firstline[idx]; idx++; } //adding first row dt.rows.add(fl); while (!sr.endofstream) { string line = sr.readline(); string[] rows = line.split(','); datarow dr = dt.newrow(); (int = 0; < headers.length; i++) { dr[i] = rows[i]; } dt.rows.add(dr); } return dt; } public static void updatedatagridparameter(datagrid dg) { stringbuilder sb = new stringbuilder(); ienumerable<string> columnnames = dg.columns.cast<datagridcolumn>(). select(column => column.header.tostring()); sb.appendline(string.join(",", columnnames)); dg.unselectallcells(); dg.selectallcells(); foreach (datarowview row in dg.selecteditems) { ienumerable<string> fields = row.row.itemarray.select(field => field.tostring()); sb.appendline(string.join(",", fields)); } dg.unselectallcells(); var filepath = @"c:\io\" + dg.name + ".csv"; file.writealltext(filepath, sb.tostring()); } } } in class bundle, create list of datagrids
private list<datagridproperties> datagridlist; public list<datagridproperties> datagridlist { { return datagridlist; } set { datagridlist = value; } } in main, iterate datagridlist , populate stackpanels calling datagridpropertiestackpanel function.
foreach (var item in bundle.datagridlist) { if (item.name == datagrid.name) { spanelparameters.children.add(datagridproperties.datagridpropertiestackpanel(item)); } }
your datagrid updates binded dataview once change values. don't have select , unselect grid rows, access dataview directly. changed version of code:
public static void updatedatagridparameter(datagrid datagrid) { stringbuilder sb = new stringbuilder(); var dataview = datagrid.itemssource dataview; var columnnames = dataview.table.columns .cast<datacolumn>() .select(column => column.columnname); sb.appendline(string.join(",", columnnames)); foreach (datarowview row in dataview) { ienumerable<string> fields = row.row.itemarray.select(field => field.tostring()); sb.appendline(string.join(",", fields)); } var filepath = @"c:\io\" + datagrid.name + ".csv"; file.writealltext(filepath, sb.tostring()); }
Comments
Post a Comment