SQLDataSource связывает данные дважды :( - PullRequest
2 голосов
/ 04 февраля 2010

эта проблема сводит меня с ума.

В 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.

SQLDataSource для второго DropDownList выглядит следующим образом:

<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 привязан дважды :

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

Почему?

Ответы [ 3 ]

0 голосов
/ 04 февраля 2010

Говорят, связывать дважды. Он привязывается к исходному значению первого раскрывающегося списка (так как это controlID, управляющий им), а затем, когда вы устанавливаете его в событии Page_load, он связывает его снова.

Я бы рекомендовал привязать его к метке с видимым свойством, установленным в False. Затем в первом выпадающем списке selectedindex измените значение свойства текста метки.

0 голосов
/ 04 февраля 2010

Попробуйте добавить ваш выбор в:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
  {
    storeDropDown.SelectedValue = "someStore";       
  }
} 
0 голосов
/ 04 февраля 2010

Хотя я не знаю точной причины двойной привязки, лучше всего было бы установить обработчик OnDataBinding для второго списка, установить в нем точку останова и проверить стек вызовов в обоих местах. Это скажет вам, почему фреймворк связывает этот список, оба раза.

В зависимости от того, насколько вы чувствительны к производительности, вы можете просто установить AppendDataBoundItems на false во втором списке, чтобы не имело значения, что оно будет связано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...