Почему событие SelectedIndexChanged не запускается из выпадающего списка в GridView? - PullRequest
2 голосов
/ 28 января 2009

Я не могу заставить мой SelectedIndexChanged моего выпадающего списка срабатывать. У меня есть следующее:

<form id="form1" runat="server">
<div>
<asp:GridView id="grdPoll" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" 
                 AutoPostBack="true"
                 OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
                    <asp:ListItem Text="Review" Value="Review" Selected="True">Review</asp:ListItem>
                    <asp:ListItem Text="Level1" Value="lvl1">Send Back to Level1</asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

<asp:Label ID="lblCity" runat="server" Text="Label"></asp:Label>  
</div>
</form>

В моем коде есть:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    this.lblCity.Text = ((DropDownList)sender).SelectedValue;
}

Если я поставлю этот же ddl за пределы вида сетки, он сработает.

Произошла обратная передача, и для автоматической обратной передачи установлено значение true. Событие просто никогда не срабатывает. Почему я не могу запустить событие из сетки?

Спасибо.

Ответы [ 6 ]

7 голосов
/ 11 марта 2009

Ну, этот вопрос был задан более месяца назад и может быть неактуальным сейчас, но @LFSR был достаточно любезен, чтобы отредактировать его недавно, он находится в списке "Активные вопросы".

Так как он остается без ответа (224 просмотра!), Я подумал, что стоит попробовать:


Проблема заключается в том, что в контексте GridView DropDownList (далее именуемый DDL) является динамическим элементом управления, и поэтому его события должны быть повторно присоединены к Postback.

Когда эта концепция понятна, решение становится относительно простым:

ASPX:

<asp:DropDownList ID="DDL1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DDL1_SelectedIndexChanged">
  <asp:ListItem Text="Review" Value="Review" Selected="True">Review</asp:ListItem>
  <asp:ListItem Text="Level1" Value="lvl1">Send Back to Level1</asp:ListItem>
</asp:DropDownList>

Код CS:

protected void Page_Load(object sender, EventArgs e)
{
  if(!Page.IsPostBack)
  {
    // Bind the GridView to something.
    DataBindGrid();
  }
}

protected void DDL1_SelectedIndexChanged(object sender, EventArgs e)
{
  this.lblCity.Text = ((DropDownList)sender).SelectedValue;
}

protected void grdPoll_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if(Page.IsPostBack)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      DropDownList ddl = e.Row.FindControl("DDL1") as DropDownList;
      if(ddl != null)
      {
        ddl.SelectedIndexChanged += new EventHandler(DDL1_SelectedIndexChanged);
      }
    }
  }
}
1 голос
/ 13 ноября 2014

Остерегайтесь, когда вы делаете привязку данных. У меня была такая же проблема на тестовой странице. Событие DD selectedIndex не сработает. Оказывается, я перепривязывал сетку на каждой странице, которая эффективно убивает событие. Как только я связался только с page.ispostback=false, события сработали, как и ожидалось, и был подхвачен общим DD-хандером. Оттуда вы можете перебирать клиентские идентификаторы gridview ваших DD, чтобы найти тот, который соответствует sender.clientID в универсальном обработчике.

1 голос
/ 01 августа 2011

Я обнаружил, что прикрепление обработчика событий внутри ItemDataBound не работает; также DropDownList не имеет свойств CommandName или CommandArgument, поэтому событие ItemCommand сетки не будет запускаться в ответ на выбранное изменение индекса.

Однако вы можете сделать это в Page_Load, чтобы определить причину публикации: -

        var target = Request.Form["__EVENTTARGET"];

        if (!string.IsNullOrEmpty(target) && target.Contains("cboAttribute"))
        {
            var cboAttribute = Page.FindControl(target) as DropDownList;

            if (cboAttribute != null)
            {
                // this one fired the event
            }
        }

Моя сетка содержит кучу выпадающих меню cboAttribute, и это дает мне ссылку на тот, который вызвал публикацию.

0 голосов
/ 25 января 2017

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

0 голосов
/ 14 апреля 2009

Я не могу объяснить, почему, но у меня такое же поведение, когда я динамически добавляю ListItem's в DropDown. Полезно, только если вам не нужно значение ListItem.

Попробуйте добавить строковое значение вместо ListItem:

Например:

//  change this
DDL1.Items.Add(new ListItem("Review","Review"));

// To this
DDL1.Items.Add("Review");
0 голосов
/ 13 марта 2009

Ну, это не решило проблему для меня. Я должен сказать, что это работало правильно на моей коробке, даже без необходимости связывать событие в RowDataBound. Это не единственная проблема, с которой, похоже, сейчас сталкивается gridView, даже коллекции ключей данных исчезают, я думаю, что эта таблица предназначена только для правильной работы с источниками данных asp.net. Я перепишу свой код для работы с источником данных объекта, чтобы проверить мои подозрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...