別のリピーター内のリピーター内に Gridview があります。宣言コードは次のようになります。
<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>
命令型コード ビハインドは次のようになります。
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();
}
これにより、親リピーターと子リピーターが設定され、子リピーターに itemdatabound がある場合、グリッドビューをバインドする次のことが起こります。
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();
}
このコードはすべて正常に動作します。2 つのリピーター内にグリッドビューが表示され、編集ボタンが表示されます。そして、編集ボタンが起動されると、グリッドビューは編集モードになります (そして EditItemTemplate を使用します)。ただし、EditRecord が呼び出されると、グリッドビューは編集モードになりません。EditRecord は次のようになります。
public void EditRecord(object sender, GridViewEditEventArgs e)
{
GridView subGridView = (GridView)sender;
subGridView.EditIndex = e.NewEditIndex;
subGridView.Rows[e.NewEditIndex].RowState = DataControlRowState.Edit;
DataBind();
}
GridView を編集モードにする方法を知っている人はいますか?