これが重複している場合は申し訳ありませんが、以前に投稿された正確な順列を見つけることができませんでした. 同様の解決策は、実際には私の問題を解決しませんでした。
したがって、ビューの 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 でラップしたときだけです。私の推測では、私はここで何か順不同で何かをしているのですが、それを見つけられたら気が滅入るでしょう...