在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";
}
为什么?
答案 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";
}
}