2011-02-09 111 views
3

我有一个DropDown绑定到一个ObjectDataSource。在其数据绑定事件上,我在0索引上添加了“--select--”值。我有一个LinkBut​​ton在页面上和客户端点击,我选择不同的项目下拉(使用JavaScript)。假设有3个项目,如--select--,option1,option2和option3,现在链接按钮的客户端上单击我选择的选项3,现在如果我选择默认值“--select--”,它不会触发SelectedIndexChanged事件。如果我选择任何其他值,那么它会触发。为什么它不适用于默认值?为什么DropDownList.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;   
} 
+0

你可以发布.net代码的下拉菜单吗? – Hawxby 2011-02-09 10:53:05

+0

发布您的标记和代码隐藏。什么是负责添加 - 选择 - ? – 2011-02-09 11:03:04

+1

检查自动回复并启用视图状态属性设置为真 – Dotnet 2011-02-09 12:57:11

回答

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方法不会做你想做的。即使它们中的一个是真的,它的其他部分也会被执行.ex:如果“Postback is true”或“callback is true”,它将进入else部分。但是,如(1)步骤所示,设置AppendDataBoundItems并删除代码以添加“--select--”。


最有可能的问题是与ViewState中,设置的EnableViewState =“真”

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs" EnableViewState="true"%> 

如果你正在使用马斯特网页你必须启用它。

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" EnableViewState="true" ClassName="Site" %> 

,在下拉Web控件的AutoPostBack =“真”

<asp:DropDownList ID='DropDownList1' runat='server' AutoPostBack='true' 
    OnSelectedIndexChanged='HandleOnDropDownListSelectedIndexChanged'> 
</asp:DropDownList> 
3

我不知道有没有人有同样的问题,因为我没有,但它只是碰巧,我的值在各下拉列表中的每个项目都是相同的,并且在我更改值之前它绝不会触发该事件。

0

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

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

1

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

我猜如果所有其他都失败了,请确保您的标记中只有一个SINGLE窗体。

相关问题