How to add buttons in a DataGridView from a List<> C#? -
like title says, able add buttons in datagridview list.
what have far:
public class users { public int64 userid { get; set; } public datagridviewbuttoncolumn emailaddress { get; set; } public datagridviewbuttoncolumn gamertag { get; set; } public datagridviewbuttoncolumn xuid { get; set; } public string signedin { get; set; } public string autosignin { get; set; } public image gamerpic { get; set; } } private list<users> getuserslist() { try { list<users> list = new list<users>(); ienumerable<xboxuser> users = _xbc.users; foreach (xboxuser user in users) { datagridviewbuttoncolumn emailaddress = new datagridviewbuttoncolumn() { text = user.emailaddress }; datagridviewbuttoncolumn gamertag = new datagridviewbuttoncolumn() { text = user.gamertag }; datagridviewbuttoncolumn xuid = new datagridviewbuttoncolumn() { text = user.xuid }; users xbuser = new users() { userid = user.userid, emailaddress = emailaddress, gamertag = gamertag, xuid = xuid, signedin = user.issignedin.tostring(), autosignin = user.autosignin.tostring(), gamerpic = getimagefromurl(gamertag.text) }; list.add(xbuser); } return list; } catch (exception ex) { } return null; } private void bo_refresh_click(object sender, eventargs e) { list<users> listusers = getuserslist(); dg_userlist.datasource = new bindingsource(new bindinglist<users>(listusers), null); } private void dg_userlist_cellclick(object sender, datagridviewcelleventargs e) { switch (e.columnindex) { case 1: clipboard.settext(dg_userlist.rows[e.rowindex].cells["emailaddress"].value.tostring()); messagebox.show("email " + dg_userlist.rows[e.rowindex].cells["emailaddress"].value.tostring() + " has been copied in clipboard.", "copy clipboard", messageboxbuttons.ok, messageboxicon.information); break; case 2: clipboard.settext(dg_userlist.rows[e.rowindex].cells["gamertag"].value.tostring()); messagebox.show("gamertag " + dg_userlist.rows[e.rowindex].cells["gamertag"].value.tostring() + " has been copied in clipboard.", "copy clipboard", messageboxbuttons.ok, messageboxicon.information); break; case 3: clipboard.settext(dg_userlist.rows[e.rowindex].cells["xuid"].value.tostring()); messagebox.show("xuid " + dg_userlist.rows[e.rowindex].cells["xuid"].value.tostring() + " has been copied in clipboard.", "copy clipboard", messageboxbuttons.ok, messageboxicon.information); break; } } everything appears correctly (even image in gamerpic) except buttons, show datagridviewbuttoncolumn { name=, index=-1 } instead of button right value on it.
i tried datagridvewbuttoncell not work either.
however, when click on cell supposed button, clipboard.settext works put datagridviewbuttoncolumn { name=, index=-1 } in it.
edit: have been able strings instead... looks less user friendly since there no button tell can click on it... works! sure prefer buttons instead :)
problem
when datasourced, datagridview auto-create columns based on data type each column. default, each column here created datagridviewtextboxcolumn, except column bound image - default datagridviewimagecolumn. though have 3 datagridviewbuttoncolumn properties, bound text columns - set value follows (example):
newrow.cells[1].value = datasourceobject.emailaddress.tostring(); // i.e. emailaddress datagridviewbuttoncolumn, so... newrow.cells[1].value = datagridviewbuttoncolumn.tostring(); console.writeline(datagridviewbuttoncolumn.tostring()); // prints "datagridviewbuttoncolumn { name=, index=-1 }" solution
start users class: change datagridviewbuttoncolumn properties type string.
public class users { public int64 userid { get; set; } public string emailaddress { get; set; } public string gamertag { get; set; } public string xuid { get; set; } public string signedin { get; set; } public string autosignin { get; set; } public image gamerpic { get; set; } } and change getuserlist method account differences:
private list<users> getuserslist() { try { list<users> list = new list<users>(); ienumerable<xboxuser> users = _xbc.users; foreach (xboxuser user in users) { users xbuser = new users() { userid = user.userid, emailaddress = user.emailaddress, gamertag = user.gamertag, xuid = user.xuid, signedin = user.issignedin.tostring(), autosignin = user.autosignin.tostring(), gamerpic = getimagefromurl(gamertag.text) }; list.add(xbuser); } return list; } catch (exception ex) { } return null; } and finally, in form constructor or load event - before you've bound data - manually add columns so:
dg_userlist.autogeneratecolumns = false; datagridviewtextboxcolumn usercol = new datagridviewtextboxcolumn(); datagridviewbuttoncolumn emailcol = new datagridviewbuttoncolumn(); datagridviewbuttoncolumn tagcol = new datagridviewbuttoncolumn(); datagridviewbuttoncolumn xuidcol = new datagridviewbuttoncolumn(); datagridviewtextboxcolumn signcol = new datagridviewtextboxcolumn(); datagridviewtextboxcolumn autocol = new datagridviewtextboxcolumn(); datagridviewimagecolumn piccol = new datagridviewimagecolumn(); usercol.name = "userid"; // allows access columns or emailcol.name = "emailaddress"; // cells in following manner: tagcol.name = "gamertag"; // dgv.rows[index].cells["name"]; xuidcol.name = "xuid"; signcol.name = "signedin"; autocol.name = "autosignin"; piccol.name = "gamerpic"; usercol.datapropertyname = "userid"; // must match datasource properties. emailcol.datapropertyname = "emailaddress"; // allows datasourced columns match tagcol.datapropertyname = "gamertag"; // manually created columns. xuidcol.datapropertyname = "xuid"; signcol.datapropertyname = "signedin"; autocol.datapropertyname = "autosignin"; piccol.datapropertyname = "gamerpic"; usercol.headertext = "user id"; // allows displaying different text emailcol.headertext = "email address"; // column headers. tagcol.headertext = "gamer tag"; xuidcol.headertext = "xuid"; signcol.headertext = "signed in"; autocol.headertext = "auto sign in"; piccol.headertext = "avatar"; dg_userlist.columns.add(usercol); dg_userlist.columns.add(emailcol); dg_userlist.columns.add(tagcol); dg_userlist.columns.add(xuidcol); dg_userlist.columns.add(signcol); dg_userlist.columns.add(autocol); dg_userlist.columns.add(piccol); this allow create button columns still allow bind data instead of manually adding each row. datapropertyname button cells correctly display bound cell value.
Comments
Post a Comment