我不想在这里添加其中一个,但这个类型的其他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;
}
}
答案 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)