![](/img/trans.png)
[英]DropDownList.SelectedIndexChanged does not fire when selecting index in C# code behind
[英]Why DropDownList.SelectedIndexChanged event does not fire?
我有一個DropDown,它綁定到ObjectDataSource。 在它的數據綁定事件中,我在0索引上添加“--select--”值。 我在頁面上有一個LinkButton,並在其客戶端點擊,我在下拉菜單中選擇不同的項目(使用JavaScript)。 假設有3個項目,如--select--,option1,option2和option3,現在在鏈接按鈕的客戶端上單擊我選擇的選項3,現在如果我選擇默認值“--select--”,它不會觸發SelectedIndexChanged事件。 如果我選擇任何其他值,則它會觸發。 為什么它不適用於默認值?
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && !IsCallback)
{
this.FillDropDown("--Select--");
}
else
{
if (this.drp.SelectedItem != null)
this.FillDropDown(this.drp.SelectedItem.Text);
else
this.FillDropDown("--Select--");
}
}
protected void FillDropDown(string viewName)
{
this.obJectDataSource.Select();
this.drp.Items.Clear();
this.drp.SelectedIndex = -1;
this.drp.DataBind();
if (this.drp.Items.Count > 0)
{
ListItem item = this.drp.Items.FindByText(viewName);
if (item == null)
{
item = this.drp.Items.FindByText("--Select--");
}
if (item != null)
{
int selectedIndex = this.drp.Items.IndexOf(item);
this.drp.Items[selectedIndex].Selected = true;
this.drp.SelectedIndex = selectedIndex;
}
}
}
protected void drp_OnDataBound(object sender, EventArgs e)
{
if (this.drp.Items.Count > 0)
{
this.drp.Items.Insert(0, new ListItem("--Select--", "-1"));
}
}
protected void drp_SelectedIndexChanged(object sender, EventArgs e)
{
if (drp.SelectedValue != "-1")
{
Session["SelectedItem"] = this.drp.SelectedItem.Text;
}
}
/// The button which do callback not postback
<dx:ASPxCallback ID="ASPxCallback1" runat="server" ClientInstanceName="Callback1" OnCallback="SaveFilter_Click">
<ClientSideEvents CallbackComplete="function(s,e){Callback1Success(s,e);}" />
</dx:ASPxCallback>
<dx:ASPxButton ID="btn_Save" runat="server" CausesValidation="False" Height="20px" Text="Save" AutoPostBack="false" UseSubmitBehavior="false">
<ClientSideEvents Click="function(s, e) {
var isValid = Validate(this, txt1.GetText());
if(isValid==true) {
Callback1.PerformCallback('Save');
}
else {
e.processOnServer = false;
}}">
</ClientSideEvents>
</dx:ASPxButton>
protected void SaveFilter_Click(object sender, CallbackEventArgs e)
{
if (e.Parameter.ToString() == "Save")
{
if (!string.IsNullOrEmpty(txt_SaveSaveSearch.Text))
{
// saving data into data base.
this.FillDropDown(txt.Text);
e.Result = ASPxCallback.GetRenderResult(this.drp);
}
}
}
function Callback1Success(s,e) {
var ctrl = document.getElementById('ctl00_ContentHolder_drp');
ctrl.outerHTML = e.result;
}
更新:
根據修訂后的問題 -
為什么不在下拉列表中設置AppendDataBoundItems? 該屬性允許下拉列表將項目附加到現有項目。
<asp:DropDownList ID='DropDownList1' runat='server' AutoPostBack='true' EnableViewState='true' AppendDataBoundItems='true'> <asp:ListItem Selected='True' Text='--Select--' Value='1'></asp:ListItem></asp:DropDownList>
Page_Load方法無法執行您想要的操作。 即使其中一個是真的,它的else部分也將被執行..ex:如果“Postback為true”或“callback為true”,它將進入else部分。 但是如(1)步驟所示,設置AppendDataBoundItems並刪除代碼以添加“--select--”。
最有可能的問題是ViewState,Set EnableViewState =“true”
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs" EnableViewState="true"%>
如果你正在使用Maste Pages,你也必須啟用它。
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" EnableViewState="true" ClassName="Site" %>
並在下拉網頁控件中AutoPostback =“true”
<asp:DropDownList ID='DropDownList1' runat='server' AutoPostBack='true'
OnSelectedIndexChanged='HandleOnDropDownListSelectedIndexChanged'>
</asp:DropDownList>
我不知道是否有其他人遇到過與我相同的問題,但事實上我的值對於下拉列表中的每個項目都是相同的,並且在我更改值之前它永遠不會觸發事件。
另一個原因是如果頁面上有多個表單...我在頁面上放置了第二個表單,但沒有ID或操作。 這個表單干擾了包含我試圖觸發onselectedindexchanged處理程序的控件的表單...
我想如果所有其他方法都失敗了,請確保您的標記中只有一個單一的表單。
我經歷了同樣的問題,經過一段時間的挖掘,我發現設計器代碼與我在.aspx中所做的更改不同步,后面的代碼仍然有一些對被刪除的控件的引用導致對象引用沒有設置為對象錯誤的實例,但這是在一些特殊情況處理中發生的,這與實際問題無關(onselectionchanged not firing)。
...但我也注意到.aspx中有一些jscript仍然包含我刪除的舊控件引用。 編譯器沒有提示任何錯誤,因為這是僅在運行時捕獲的javascript。 因此,我在我的案例中得出結論,javascript問題阻止了autopostback事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.