この質問は難しいと思います。同じ機能を持つ 2 つのページがあります。1 つ目は人向けです。2 つ目はコピーとして作成され、製品用に少し変更されています。
両方のページに DropDownLists があり、両方の DDL にOnSelectedIndexChangedイベントがあり、 AutoPostBackオプションが有効になっています。両方のページには、 idパラメーターでページをリロードするコード ビハインド プロシージャRefreshPageがあります。このidパラメータは、ドロップダウンリストで実際に選択された値です。
したがって、設計上:
1) DDL の選択項目を変更すると、AutoPostBack が実行され、OnSelectedIndexChanged イベントが発生します。
2) このイベントは、DDL の現在選択されている値を QueryString に追加し、ページをリロードするRefreshPageプロシージャを実行します。
3) 次に、この ID が QueryString から取得され、DDL に設定されます。コードを参照してください。
RefreshPageは、 People.aspxページで正常に機能します。しかし、 Products.aspxの同様の手順はまったく実行されません。両方の手順の同じ場所 ( Page.Response.Redirectメソッドのある行) にブレークポイントを追加しました。最初のページで停止し、パラメーターparamIDの正しい値を表示しますが、2 番目のページではブレークポイントに到達しません。OnSelectedIndexChangedイベントは単純にスキップされます。
両方のページでEnableViewState が無効になっています。JavaScript や AJAX は使用しません。PreRenderメソッドは使用しません。
これが私のコードです。
People.aspx:
<asp:DropDownList ID="ddJGroup" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="DropDown" Font-Bold="True"/>
People.aspx.cs:
protected void RefreshPage(object s, EventArgs e)
{
paramID = ddJGroup.SelectedValue;
Page.Response.Redirect("People.aspx?id=" + paramID);
}
Products.aspx:
<asp:DropDownList ID="ddCType" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="class_DropDown" Font-Bold="True"/>
両方のページで、QueryString からidパラメータを取得し、それを Page_Load プロシージャで使用して、DropDownLists の選択した値を設定します。下記参照。
Products.aspx.cs:
...
if ((Request.QueryString["id"] != null) && (Request.QueryString["id"] != ""))
paramID = Convert.ToInt32(Request.QueryString["id"]);
...
ddCType.DataSource = sqlReader;
ddCType.DataValueField = "c_type_id";
ddCType.DataTextField = "type_name";
ddCType.DataBind();
ddCType.SelectedIndex = ddCType.Items.IndexOf(ddCType.Items.FindByValue(Convert.ToString(paramID)));
このコードは正常に動作します。ただし、Products.aspxでは、パラメータparamIDは変更されません。RefreshPageプロシージャで変更する必要がありますが、プロシージャは実行されず、 QueryString["id"]パラメータは変更されません。つまり、このページはRefreshPageからリロードされることはなく、常に単純な PostBack が実行されます。
RefreshPage プロシージャでは:
protected void RefreshPage(object o, EventArgs e)
{
paramID = ddCType.SelectedValue;
Page.Response.Redirect("Products.aspx?id=" + paramID);
}
このプロシージャが実行されると、ページは新しいidパラメータでリロードされ、ドロップダウンリストはこの新しいインデックスを取得します。