3

У меня есть DropDown, который ограничен ObjectDataSource. В своем связанном с данными событии я добавляю значение «--select--» в индекс 0. У меня есть LinkButton на странице и на клиенте клика, я выбираю другой элемент при выпадающем списке (используя JavaScript). Предположим, что есть 3 элемента, такие как - select, option1, option2 и option3, а теперь на клиенте кнопки клика нажмите i, чтобы выбрать параметр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

+0

Опубликуйте как свою разметку, так и код. Что отвечает за добавление - select -? –

+1

Проверить свойства Autopostback и включить свойства состояния представления, установленные как true – Dotnet

ответ

6

Update:

на основе пересмотренного вопроса -

  1. Почему вы не установить AppendDataBoundItems на DropDownList? Свойство позволит выпадающему списку добавлять элементы к существующим.

    <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», он перейдет в другую часть. Но, как было предложено на шаге (1), установите AppendDataBoundItems и удалите код, чтобы добавить «--select--».


Скорее всего проблема будет с ViewState, Set EnableViewState = "истинный"

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

И если вы используете MASTE Страницы, которые вы должны будете включить в него тоже.

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

И в веб-управления выпадающий AutoPostBack = «истинный»

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

Я попробовал, но проблема все еще существует. После обратного вызова в раскрывающемся списке отображается новое значение, поэтому, когда я меняю это значение на значение по умолчанию, выберите - он не запускает выбранное изменение индекса но он запускает его событие для привязки данных. и если я выберу другое значение, оно загорится, а затем, если я выберу значение по умолчанию, то он запустит событие :(, я не знаю, почему он не срабатывает в первый раз. –

+0

AutoPostBack исправил его для меня – dlchambers

3

Я не знаю, если кто-то еще была такая же проблема, как я сделал, но это просто так получилось, что мои ценности были то же самое для каждого элемента в раскрывающемся списке, и он никогда не запускает событие, пока я не изменю значения.

+0

Сын a! @ # $! Спасибо, не могу поверить, что я этого не видел. Голосование, хочу, чтобы я мог дать вам двоих. – Lukas

0

У меня возникла такая же проблема, через некоторое время я обнаружил, что код конструктора не синхронизирован с изменениями, внесенными мной в .aspx, код, позади которого все еще есть некоторые ссылки на элемент управления, который был удален, вызывающий ссылку на объект, не установленную на экземпляр ошибки объекта, но это происходит при некотором специальном обращении с обработкой, который не имеет никакого отношения к фактической проблеме (onselectionchanged not firing).

... но я также заметил, что есть некоторые jscript в .aspx, который по-прежнему содержит старые ссылки элемента управления, который я удалил. Компилятор не запрашивал никаких ошибок, так как это javascript, которые попадают только во время выполнения. Поэтому в моем случае я пришел к выводу, что проблема javascript предотвращает событие автозапуска.

1

Другая причина этого заключается в том, что на странице есть несколько форм. Я разместил вторую форму на странице, у которой еще нет идентификатора или действия. Эта форма вмешивалась в форму, содержащую элемент управления, для которого я пытался запустить onselectedindexchange обработчик ...

Я предполагаю, что если все остальное не удается, убедитесь, что у вас есть только одна форма в вашей разметке.

Смежные вопросы