为什么SelectedIndexChanged事件不是从GridView中的下拉列表触发的?

时间:2009-01-27 21:38:08

标签: .net asp.net gridview events

我无法触发我的下拉列表的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放在gridview之外,它会触发。

回发正在进行,autopostback设置为true。事件永远不会发生。为什么我不能在gridview中触发我的事件?

谢谢。

6 个答案:

答案 0 :(得分:7)

嗯,这个问题是在一个多月前提出来的,现在可能无关紧要,但是@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 :(得分:1)

我发现在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的下拉列表,这给了我一个引起帖子的引用。

答案 2 :(得分:1)

注意何时进行数据绑定。我在测试页面上遇到了同样的问题。 DD selectedIndex事件不会触发。事实证明,我正在每个页面服务上重新绑定gridview,这有效地杀死了事件。一旦我只在page.ispostback=false上绑定了按预期发射的事件,并被通用DD处理员接收。从那里,您可以迭代DD的gridview clientID,以找到与通用处理程序中的sender.clientID匹配的那个。

答案 3 :(得分:0)

嗯,这对我没有解决问题。 我必须说这在我的盒子上工作正常,即使不必在RowDataBound中连接事件。这不是gridview现在看来唯一的问题,即使datakey集合消失了,我认为这个网格只能用于asp.net数据源才能正常运行。 我将重写我的代码以使用对象数据源来验证我的怀疑。

答案 4 :(得分:0)

我无法解释原因,但是当我动态地将ListItem添加到DropDown时,我会遇到相同的行为。仅在您不需要ListItem值时才有用。

尝试添加字符串值而不是ListItem:

例如:

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

// To this
DDL1.Items.Add("Review");

答案 5 :(得分:0)

我遇到类似的问题,网格中的组合框没有射击。在我的情况下,该方法未被触发的原因是因为有一个需要验证的项目是隐藏的。因此,请务必检查您是否有任何可能触发的隐藏验证器并阻止组合框执行。