Почему событие DropDownList.SelectedIndexChanged не запускается? - PullRequest
3 голосов
/ 09 февраля 2011

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

6 голосов
/ 10 февраля 2011

Обновление:

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

  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 будет выполнена, даже если один из них имеет значение true .. ex: если «Postback is true» или «callback is true», он перейдет в часть else.Но, как предложено в шаге (1), установите AppendDataBoundItems и удалите код для добавления «--select -».


Скорее всего, проблема связана с ViewState, установите EnableViewState= "true"

<%@ 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 = "true"

<asp:DropDownList ID='DropDownList1' runat='server' AutoPostBack='true' 
    OnSelectedIndexChanged='HandleOnDropDownListSelectedIndexChanged'>
</asp:DropDownList>
3 голосов
/ 24 мая 2011

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

1 голос
/ 29 октября 2013

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

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

0 голосов
/ 21 февраля 2013

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

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

...