1

別のリピーター内のリピーター内に 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 を編集モードにする方法を知っている人はいますか?

4

0 に答える 0