DropDownList SelectedIndexChanged没有触发(是的,AutoPostBack =“true”)

时间:2013-10-15 22:05:01

标签: asp.net

我不想在这里添加其中一个,但这个类型的其他20个问题已经用“set AutoPostBack="true"”回答​​,我已经完成了。我相信我的问题更多的是我在DropDownList中设置项目的方式,但我是ASP.NET的新手,所以我不确定适当的解决方案是什么。

这是我的控制:

<asp:DropDownList ID="DrpProduct" CssClass="input-xxlarge"  runat="server"    AutoPostBack="true" EnableViewState="true"     OnSelectedIndexChanged="DrpProduct_SelectedIndexChanged" ViewStateMode="Enabled" />

这就是我在页面的代码隐藏中设置它的地方:

protected void Page_Init(object sender, EventArgs e) 
{
  Repository = new ProductRepository();
  Products = Repository.List();

  if (Products.Any())
    foreach (Product product in Products) {
      DrpProduct.Items.Add(new ListItem(product.Name, product.Name));
    }
}

最后我的听众:

protected void DrpProduct_SelectedIndexChanged(object sender, EventArgs eArgs) 
{
  //code omitted. I have a breakpoint here that never gets hit anyways.
}

它们正确渲染和显示,但在使用下拉列表时未触发OnSelectedIndexChanged事件。我已经读过,如果没有在页面生命周期的适当阶段完成,那么以这种方式向下拉列表添加项可能会有问题,但我已经在其他多个阶段尝试过它而没有效果。我是这样做的(而不是数据绑定对象等)由于特定的原因,所以想让这个代码适合我。

编辑:根据请求,这是我的ProductRepository代码:

public class ProductRepository
{
  private IList<Product> Products { get; set; }

public ProductRepository()
{
      Products = new List<Product> {
        new Product("Grand Theft Auto V", "A video game that lets you kill hookers.", 59.99m), 
        new Product("Fallout 4", "lol u wish", 99.99m), 
        new Product("XCOM: Enemy Unknown", "Probably one of the better games you'll ever play.", 39.99m),
         new Product("The Bureau: XCOM Declassified", "The game NO ONE asked for. Or wanted.", 59.99m),
        new Product("Rome 2: Total War", "There'd better be phalanxes.", 59.99m)
      }; 
}

  public IList<Product> List() 
  {
    return Products;
  }
}

4 个答案:

答案 0 :(得分:2)

好吧,想通了。这对我来说实际上是一个非常愚蠢的错误。

我的DropDownList只是挂在页面上,而不是包含在<form>中。不知道会否定SelectedIndexChanged事件。因此,将我的.aspx文件中的代码更改为:

<form ID="ProductForm" runat="server">
  <asp:DropDownList .... />
</form>

答案 1 :(得分:0)

以下是经过测试和运作的。我有兴趣知道你是如何定义Products的?为简洁起见,我遗漏了aspx代码。

public partial class _Default : Page
{
    List<Product> products = null;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            products = new List<Product> 
            { 
                new Product{ Name = "ProductOne" },
                new Product{ Name = "ProductTwo" }
            };

            if (products.Count > 0)
                foreach (var product in products)
                    DrpProduct.Items.Add(new ListItem(product.Name, product.Name));
        }
    }

    protected void DrpProduct_SelectedIndexChanged(object sender, EventArgs e)
    {
        // break point in here is getting hit
    }

}

class Product
{
    public string Name { get; set; }
}

尝试使用类似Product类型的硬编码列表替换您从存储库中获取的数据,并查看您的使用情况。这将证明您的设置确实正确,问题可能在其他地方。

答案 2 :(得分:0)

确保您已正确连接EventHandler。

尝试在Visual Studio中切换到Designer模式,然后双击DropDownList以确保CodeBehind打开实际的DrpProduct_SelectedIndexChanged方法。

这始终是测试代码并确保所有内容都已连线的好方法。

您也可以尝试以编程方式连接EventHandler ......

DrpProduct.Click += new eventHandler(DrpProduct_SelectedIndexChanged);

答案 3 :(得分:0)

此外,您可能忘记将控件的AutoPostBack设置为true ...我不会承认这是否是我的解决方案8)