2015-12-02 2 views
0

На одной из наших страниц есть раскрывающийся список, который динамически раскрашивает его элементы при предварительном рендеринге. Тем не менее, всякий раз, когда есть какой-либо элемент управления ajax на любом из элементов управления на странице, он сразу же теряет все свои стили (цвета элементов). Я могу сказать, что предварительная рендер получает вызов как при загрузке страницы, так и при каждом вызове ajax.Выпадающий список, теряющий стиль, когда появляется ajax post back

<asp:DropDownList ID="DeviceObjectDDL" runat="server" Style="width: 350px;" OnPreRender="ColorDeviceListItems" AutoPostBack="true" OnSelectedIndexChanged="DeviceObjectDDL_SelectedIndexChanged" /> 

И

protected void ColorDeviceListItems(object sender, EventArgs e) 
    { 
     if (((DropDownList) sender).DataSource == null) return; 
     var disabledList = ((List<Device>) ((DropDownList) sender).DataSource).FindAll(d => !d.Active || !d.Visible); 

     foreach (var device in disabledList) 
     { 
      var item = ((DropDownList) sender).Items.FindByValue(device.ID.ToString()); 
      if (item == null) continue; 
      if ((!device.Active) && (!device.Visible)) 
       item.Attributes.CssStyle.Add("color", "Purple"); 
      else 
      { 
       if (!device.Active) 
        item.Attributes.CssStyle.Add("color", "Blue"); 
       if (!device.Visible) 
        item.Attributes.CssStyle.Add("color", "#8B0000"); 
      } 
     } 
    } 

Когда метод ColorDeviceListItems вызывается во время AJAX запросов, то sender DataSource равно нулю, поэтому он просто возвращает.

+0

Поместите точку останова в обработчик события OnSelectedIndexChanged, возможно, это срабатывает и потенциально удаляет стили? –

+0

Нет, ничего не стреляет. –

+0

Я думаю, что я смог ответить на него, см. Ниже ... спасибо –

ответ

1

Шаг 1

Вместо того, чтобы использовать PreRender событие, используйте DataBound событие вместо этого - это должно гарантировать, что событие вызывается после того, как источник данных был вновь материализуется состояния представления.

<asp:DropDownList ID="DeviceObjectDDL" runat="server" Style="width: 350px;" OnDataBound="ColorDeviceListItems" AutoPostBack="true" OnSelectedIndexChanged="DeviceObjectDDL_SelectedIndexChanged" /> 

Шаг 2

Вместо того чтобы использовать отправителя, который может быть что-то, что вызвало произойти пост-назад. Используйте идентификатор самого элемента управления, т.е. DeviceObjectDDL. Он уже правильно помечен runat="server", который должен позволить вам напрямую получить доступ к нему в коде позади.

protected void ColorDeviceListItems(object sender, EventArgs e) 
{ 
    if (DeviceObjectDDL.DataSource == null) return; 
    var disabledList = ((List<Device>)(DeviceObjectDDL.DataSource).FindAll(d => !d.Active || !d.Visible); 

    foreach (var device in disabledList) 
    { 
     var item = DeviceObjectDDL.Items.FindByValue(device.ID.ToString()); 
     if (item == null) continue; 
     if ((!device.Active) && (!device.Visible)) 
      item.Attributes.CssStyle.Add("color", "Purple"); 
     else 
     { 
      if (!device.Active) 
       item.Attributes.CssStyle.Add("color", "Blue"); 
      if (!device.Visible) 
       item.Attributes.CssStyle.Add("color", "#8B0000"); 
     } 
    } 
} 

Опираясь на отправителе не лучшая практика в этой конкретной ситуации, так как нет никакой гарантии, что отправитель является искомым управления. И это видно при звонках AJAX ...

+0

Еще более странным, 'DataSource' по-прежнему показывает нулевое значение после обратной передачи ajax. На исходной загрузке все в порядке, но обратная передача дает мне возможность. –

+0

У вас есть окно просмотра? –

+0

Проверьте это, похоже, что у них была аналогичная ситуация, в которой они решались, не используя 'PreRender'. http://stackoverflow.com/questions/3578846/dropdownlist-empty-after-postback –

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