为什么DropDownList.SelectedIndexChanged事件不会触发?

时间:2011-02-09 10:51:07

标签: c# javascript asp.net drop-down-menu selectedindexchanged

我有一个与ObjectDataSource绑定的DropDown。在它的数据绑定事件中,我在0索引上添加“--select--”值。我在页面上有一个LinkBut​​ton,并在其客户端点击,我在下拉菜单中选择不同的项目(使用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;        
}

4 个答案:

答案 0 :(得分:6)

<强>更新

基于修订后的问题 -

  1. 为什么不在下拉列表中设置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>
    
  2. Page_Load方法无法执行您想要的操作。即使其中一个是真的,它的else部分也将被执行..ex:如果“Postback为true”或“callback为true”,它将进入else部分。但是如(1)步骤所示,设置AppendDataBoundItems并删除代码以添加“--select - ”。


  3. 最有可能的问题是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>
    

答案 1 :(得分:3)

我不知道是否有其他人遇到了与我相同的问题,但事实上,我的值对于下拉列表中的每个项目都是相同的,并且在我更改值之前它永远不会触发事件。

答案 2 :(得分:1)

另一个原因是如果页面上有多个表单...我在页面上放置了第二个表单,但没有ID或操作。这个表单干扰了包含我试图触发onselectedindexchanged处理程序的控件的表单...

我想如果所有其他方法都失败了,请确保您的标记中只有一个单一的表单。

答案 3 :(得分:0)

我遇到了同样的问题,经过一段时间的挖掘,我发现设计器代码与我在.aspx中所做的更改不同步,后面的代码仍然有一些对已删除的控件的引用导致对象引用未设置为对象错误的实例,但是在某些特殊情况处理时发生这种情况与实际问题无关(onselectionchanged not firing)..

...但我也注意到.aspx中有一些jscript仍然包含我删除的旧控件引用。编译器没有提示任何错误,因为这是仅在运行时捕获的javascript。因此,我在我的案例中得出结论,javascript问题阻止了autopostback事件。