SQLDataSource绑定数据两次:(

时间:2010-02-04 17:27:05

标签: sqldatasource pageload

这个问题让我很生气。

在Asp.Net应用程序中,我有两个DropDownLists,DropDownStore和DropDownCampaign。

<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。

第二个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的条目时绑定第二个DropDownList DropDownList的。

这很有效。但是当我以编程方式设置第一个DropDownList的值时, 第二个DropDownList绑定两次

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

为什么?

3 个答案:

答案 0 :(得分:0)

虽然我不知道双重绑定的确切原因,但最好的办法可能是为第二个列表设置OnDataBinding处理程序,在其中设置断点,并检查两个位置的调用堆栈。这将告诉你为什么框架两次绑定该列表。

根据您对性能的敏感程度,您可能只想在第二个列表中将AppendDataBoundItems设置为false,以便重新绑定它并不重要。

答案 1 :(得分:0)

它被告知要绑定两次。它绑定了第一个下拉列表的原始值(因为这是控制它的controlID),然后当你在Page_load事件中设置它时它再次绑定它。

我建议将它绑定到visible属性设置为False的标签。然后在第一个下拉列表中更改selectedindex,设置标签的text属性。

答案 2 :(得分:0)

尝试将您的选择包装在:

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