2

この問題は私を本当に怒らせています。

Asp.Net アプリケーションには、DropDownStore と DropDownCampaign の 2 つの DropDownLists があります。

<asp:DropDownList ID="storeDropDown" AppendDataBoundItems="true" 
     AutoPostBack="true" DataSourceID="storeSqlDataSource" 
     DataTextField="Name" DataValueField="StoreId" 
     runat="server" OnSelectedIndexChanged="storeDropDown_SelectedIndexChanged"> 
     <asp:ListItem Value="">Choose a store</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="campaignDropDown" DataSourceID="campaignSqlDataSource" 
     DataTextField="Name" DataValueField="CampaignLevelId" 
     AppendDataBoundItems="true" runat="server">
     <asp:ListItem Value="">Choose a campaign</asp:ListItem>
</asp:DropDownList>  

ご覧のとおり、どちらも SQLDataSources にバインドされています。

2 番目の DropDownList の SQLDataSource は次のようになります。

<asp:SqlDataSource ID="campaignSqlDataSource"  runat="server" ConnectionString="<%$ ConnectionStrings:AFPMAdManagerConnectionString %>"
    SelectCommand="SELECT [CampaignLevelId], [Name] FROM [CampaignLevel] where [StoreId] = @StoreId">
    <SelectParameters>
        <asp:ControlParameter ControlID="storeDropDown" Name="StoreId" PropertyName="SelectedValue" Type="String" />
    </SelectParameters>        
</asp:SqlDataSource>    

ユーザーが最初の DropDownList のエントリを選択すると、2 番目の DropDownList がバインドされるようにします。

これはうまくいきます。しかし、最初の DropDownList の値をプログラムで設定すると、2 番目の DropDownList が2 回バインドされます。

 protected void Page_Load(object sender, EventArgs e)
 {
    storeDropDown.SelectedValue = "someStore";       
 }

なんで?

4

3 に答える 3

0

OnDataBinding二重バインディングの正確な理由はわかりませんが、2 番目のリストのハンドラーを設定し、そこにブレークポイントを設定して、両方の場所でコール スタックを調べるのが最善の策かもしれません。フレームワークがそのリストを両方ともバインドしている理由がわかります。

パフォーマンスに対する感度によっては、再バインドされても問題にならないように、2 番目のリストに設定AppendDataBoundItemsすることをお勧めします。false

于 2010-02-04T17:32:05.247 に答える
0

2回バインドするように言われています。最初のドロップダウンの元の値にバインドし (それがコントロール ID であるため)、Page_load イベントで設定すると、再度バインドされます。

visible プロパティを False に設定してラベルにバインドすることをお勧めします。次に、selectedindex が変更された最初のドロップダウンで、ラベルのテキスト プロパティを設定します。

于 2010-02-04T17:33:11.510 に答える
0

選択範囲を次のようにラップしてみてください:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
  {
    storeDropDown.SelectedValue = "someStore";       
  }
} 
于 2010-02-04T17:38:33.890 に答える