【问题标题】:SQLDataSource binds Data twice :(SQLDataSource 绑定数据两次 :(
【发布时间】:2011-01-13 04:37:51
【问题描述】:

这个问题把我逼疯了。

在一个 Asp.Net 应用程序中,我有两个 DropDownList,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>  

如您所见,它们都绑定到 SQLDataSource。

第二个 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 被绑定 两次

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

为什么?

【问题讨论】:

    标签: sqldatasource pageload


    【解决方案1】:

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

    根据您对性能的敏感程度,您可能只想在第二个列表中将AppendDataBoundItems 设置为false,这样重新绑定就没有关系了。

    【讨论】:

      【解决方案2】:

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

      我建议将其绑定到可见属性设置为 False 的标签。然后在第一个下拉 selectedindex 发生变化时,设置标签的 text 属性。

      【讨论】:

      • 您能具体说明一下吗?当我第一次启动页面时,我没有选择一个值。但即便如此,双重绑定也会发生。
      • @Jan:因为您的 SqlDataSource 绑定到 ControlID,当该控件加载时,其默认值用于绑定 SqlDataSource 控件(它注册为导致绑定的更改)。然后当 SqlDataSource 加载时,它再次绑定。在我真正需要它们之前,我更愿意让 SqlDataSources 不受约束。然后我使用事件触发器来改变datasource和controlid等。
      【解决方案3】:

      尝试将您的选择包含在:

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

      【讨论】:

      • 不,不管是否包含 if 子句,都会发生这种情况。
      猜你喜欢
      • 2012-03-08
      • 2011-06-03
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多