I am creating a custom control which takes in a filepath (string) to an xml file and a dictionary of column headers, column fields and creates a gridview dynamically with CRUD operations. What I want to know is how to replicate/achieve Text='<% #Bind("field") %>' by only using code behind?
I was thinking of trying:
Dictionary<string, string> columns = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> column in columns)
{
BoundField bField = new BoundField();
bField.DataField = column.Value;
bField.HeaderText = column.Key;
GridView1.Columns.Add(bField);
}
I'm open to suggestions as to either using .DataField or Text='<% #Bind("field") %>' or any way I haven't thought of if it achieves the end goal. As with the CRUD, can anyone recommend a good way to do this? Maybe dynamically inserting textbox and label controls into the gridview? I am using Visual Studio Express 2013 for Web.
You override the ItemDataBound event. If you're thinking about dynamically adding controls to each row, you're better off using a different kind of templated control such as a Repeater.
UPDATE - an example
First make sure you handle the RowDataBound event (not ItemDataBound my bad, that's for the DataGrid): -
protected override void OnInit(EventArgs e)
{
grid.RowDataBound += grid_RowDataBound;
Set up your columns from your dictionary of column names (I've used a string array, but you get the idea): -
var columns = new string[] { "Column 1", "Column 2", "Column 3" };
foreach (var columnName in columns)
{
grid.Columns.Add(new BoundField { HeaderText = columnName });
}
Then in the RowDataBound event: -
void grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var data = ({your object type})e.Row.DataItem;
e.Row.Cells[0].Text = data.{fieldname};
e.Row.Cells[1].Text = data.{fieldname};
.
.
.
e.Row.Cells[n].Text = {something};
}
}