I have a Gridview inside a Repeater inside another Repeater. The declarative code looks like this:
<asp:Repeater id="parentRepeater" runat="server">
<itemtemplate>
<b> <%# DataBinder.Eval(Container.DataItem, "Name") %></b>
<div>
<asp:repeater id="childRepeater" runat="server" datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("myrelation") %>' OnItemDataBound="getNestedData">
<itemtemplate>
<div><%# DataBinder.Eval(Container.DataItem, "Owner") %></div>
<div><asp:GridView ID="Grd" runat="server" AutoGenerateColumns="false" OnRowEditing="EditRecord" HorizontalAlign="Left" Width="100%">
</asp:GridView></div>
</itemtemplate>
</asp:repeater>
</div>
</itemtemplate>
</asp:repeater>
The imperative code-behind looks like this:
public void Page_Load(object sender, EventArgs e)
{
SqlConnection cnn = new SqlConnection("asdf");
SqlDataAdapter cmd1 = new SqlDataAdapter("select * from tblNames", cnn);
DataSet ds = new DataSet();
cmd1.Fill(ds, "names");
SqlDataAdapter cmd2 = new SqlDataAdapter("select * from tblThings", cnn);
cmd2.Fill(ds, "things");
ds.Relations.Add("myrelation",
ds.Tables["names"].Columns["id"],
ds.Tables["things"].Columns[NameID"]);
parentRepeater.DataSource = ds.Tables["names"];
Page.DataBind();
cnn.Close();
}
So that will set up the parent repeater, and the child repeater, and when the child repeater has an itemdatabound, the following happens which binds the gridview:
public void getNestedData(Object Sender, RepeaterItemEventArgs e)
{
GridView subGridView = (GridView)e.Item.FindControl("Grd");
DataRow rowView = (DataRow)e.Item.DataItem;
Int32 key = (Int32)rowView["id"];
SqlConnection cnn = new SqlConnection("asdf");
SqlDataAdapter cmd1 = new SqlDataAdapter("select * from tblSubThings WHERE ThingID = " + key, cnn);
DataSet ds = new DataSet();
cmd1.Fill(ds, "subThings");
subGridView.DataSource = ds.Tables["subThings"];
TemplateField edit = new TemplateField();
edit.ItemTemplate = new editGridViewTemplate(DataControlRowType.DataRow, "edit");
subGridView.Columns.Add(edit);
TemplateField Notes = new TemplateField();
Notes.ItemTemplate = new GridViewTemplate3(DataControlRowType.DataRow, "Notes");
Notes.HeaderTemplate = new GridViewTemplate3(DataControlRowType.Header, "Notes");
Notes.EditItemTemplate = new NotesEditGridViewTemplate(DataControlRowType.DataRow, "Notes");
subGridView.Columns.Add(Notes);
subGridView.DataBind();
}
This code all works fine. It shows gridview inside two repeaters, with an edit button. And when the edit button is fired, the gridview is supposed to go into edit mode (and use the EditItemTemplate). However, the gridview does not go into editmode when EditRecord is called. This is what EditRecord looks like:
public void EditRecord(object sender, GridViewEditEventArgs e)
{
GridView subGridView = (GridView)sender;
subGridView.EditIndex = e.NewEditIndex;
subGridView.Rows[e.NewEditIndex].RowState = DataControlRowState.Edit;
DataBind();
}
Does anyone know how I can get my GridView into edit mode?