2010-02-04 3 views
2

эта проблема сводит меня действительно с ума.SqlDataSource связывает данные дважды :(

В 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";  
} 

Почему?

ответ

0

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

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

+0

Не могли бы вы указать это? У меня нет значения, когда я первый запустил страницу. Но двойное связывание происходит даже тогда. – AGuyCalledGerald

+0

@Jan: Поскольку ваш SqlDataSource привязан к ControlID, когда этот элемент управления загружается, его значение по умолчанию используется для привязки элемента управления SqlDataSource (он регистрируется как изменение, которое вызывает привязку). Затем, когда загружается SqlDataSource, он снова связывается. Я предпочитаю оставить SqlDataSources unbound до тех пор, пока я им не понадоблюсь. Затем я использую триггер события для изменения источника данных и controlid и т. Д. –

0

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

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

+0

Да, вы правы. – AGuyCalledGerald

0

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

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

Нет, это происходит независимо от того, включено ли предложение if или нет. – AGuyCalledGerald

Смежные вопросы