2011-02-09 112 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窗體。

相關問題