1

これが重複している場合は申し訳ありませんが、以前に投稿された正確な順列を見つけることができませんでした. 同様の解決策は、実際には私の問題を解決しませんでした。

したがって、ビューの 1 つに Gridview を含む Multiview があります。グリッドの行には個別の DropDownLists が含まれており、グリッド A を変更すると、グリッド B に表示されるはずの選択が更新されます。更新は行われません。コードの要点は次のとおりです。

<asp:MultiView ID="MultiView1" runat="server">
    <asp:View ID="View1" runat="server">
        <asp:GridView ID="GridView1" runat="server"
         DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" GridLines="None"
         OnRowDataBound="GridView1_RowDataBound" >
            <Columns>
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlA"
                         OnSelectedIndexChanged="ddlA_SelectedIndexChanged"
                         runat="server"/>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlB" runat="server" />
                    </EditItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </asp:View>
</asp:MultiView>

そして背後にあるコード:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
                MyCustomObject myObject = (MyCustomObject)e.Row.DataItem;
                PopulateObjectRow(myObject, e.Row);
            }
        }
}

protected void ddlA_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList sender = (DropDownList)sender;
    GridViewRow row = (GridViewRow)sender.NamingContainer;
    MyCustomObject myObject = (MyCustomObject)e.Row.DataItem;
    myObject.FirstSelection = sender.SelectedItem.Value;
    PopulateObjectRow(row, sender.SelectedItem.Value);
}

private void PopulateObjectRow(MyCustomObject myObject, GridViewRow row)
{
    DropDownList ddlA = (DropDownList)row.FindControl("ddlA");
    ddlA.SelectedItem = GetSelectionItems();
    ddlA.DataBind();
    if(myObject.FirstSelection.IsValid())
    {
        SetSelection(ddlA, myObject.FirstSelection);
    }

    DropDownList ddlB = (DropDownList)row.FindControl("ddlB");
    ddlB.DataSource = GetDataValues(ddlA.SelectedItem.Value);
    ddlB.DataBind();
}

コードをデバッグして見てみると、ddlB.DataSource には期待値が含まれています。ddlB.DataBind() イベントが実際には何もしていないように見えます。GridView.OnRowDataBound() は遅すぎてこの変更を反映できませんか? 追加の頭痛の種として、これはすべてスタンドアロンの GridView として問題なく機能します。機能しなくなるのは、MultiView でラップしたときだけです。私の推測では、私はここで何か順不同で何かをしているのですが、それを見つけられたら気が滅入るでしょう...

4

0 に答える 0