OnSelectedIndexChanged似乎不起作用

时间:2010-10-26 14:00:16

标签: c# asp.net

我无法让我的代码执行我想要的操作,感谢您的帮助。

我想做的是:

从文本框中,我为产品添加名称并创建具有该名称的对象。

然后将产品对象添加到词典中。

然后,我想将此Dictionary绑定到下拉列表。

如果我更改所选项目,我想显示所选产品的编号(创建产品对象时默认为0)。

问题在于,当我尝试更改下拉列表中的项目时,没有任何反应。

感谢名单!

的.aspx

    <asp:TextBox ID="productText" runat="server"></asp:TextBox>
    <asp:Button ID="newProductButton" runat="server" OnClick="newProduct_Click" />

<div>
    <asp:DropDownList ID="ddlProducts" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlProducts_SelectedIndexChanged" >
    </asp:DropDownList>
    </div>
    <asp:Label ID="productQuantity" runat="server"></asp:Label>

.aspx.cs

public partial class Pages_productPage : System.Web.UI.Page
{
    string _productName = string.Empty;



    public Dictionary<string, int> product
    {
        get
        {
            if (Page.Session["product"] == null)
            {
                Dictionary<string, int> product = new Dictionary<string, int>();
                Page.Session["product"] = product;
            }
            return (Dictionary<string, int>)Page.Session["product"];
        }
        set
        {
            Page.Session["product"] = value;
        }
    }

    protected string ProductName
    {
        get { return _productName; }
        set { _productName = value; }
    }


    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            //ddlProducts.Items.Insert(0, new ListItem("Products", "0"));
        }
        productLabel.Text = "Product name";
        newProductButton.Text = "Add product";
        ProductName = productText.Text;


    }

    public void newProduct_Click(object sender, EventArgs e)
    {
        Product prod = new Product(ProductName);
        product.Add(prod.GetName(prod), prod.GetQuantity(prod));
        BindDictionary();
    }

    private void BindDictionary()
    {
        dictonaryRepeater.DataSource = product;
        dictonaryRepeater.DataBind();
        ddlProducts.DataSource = product;
        ddlProducts.DataValueField = "Value";
        ddlProducts.DataTextField = "Key";
        ddlProducts.DataBind();
        //ddlProducts.Items.Insert(0, new ListItem("Products", "0"));

    }

    public void ddlProducts_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlProducts.DataValueField == "Banana")
        {
            productQuantity.Text = ddlProducts.SelectedItem.ToString();
            productQuantity.Visible = true;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您的DataValueField绝不等于香蕉。它等于“价值”。你使用了错误的选择器。您想使用ddlProducts.SelectedValue。当我再次看到它时,当你真的想要使用文本时,看起来你正在使用价值。

代码建议:

public void ddlProducts_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        if ("Banana".Equals(ddlProducts.SelectedItem.ToString(),  StringComparison.OrdinalIgnoreCase) 
        { 
            productQuantity.Text = ddlProducts.SelectedValue.ToString(); 
            productQuantity.Visible = true; 
        } 
    }

**从我从Skeet先生那里学到的东西中添加了等位。

编辑:

由于你说事件永远不会被击中,因此autoeventwireup可能在第二次回发时失败。我不确定为什么会发生这种情况,但是如果它们在xml中定义,我看到事件失败了。您可以尝试将事件连线从xml端移动到页面加载事件中的后面的密码。

protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!Page.IsPostBack) 
        { 
            //ddlProducts.Items.Insert(0, new ListItem("Products", "0")); 
        } 
        productLabel.Text = "Product name"; 
        newProductButton.Text = "Add product"; 
        ProductName = productText.Text; 

        ddlProducts.SelectedIndexChanged += ddlProducts_SelectedIndexChanged;
    } 

答案 1 :(得分:1)

ddlProducts.DataValueField永远不会是Banana,因为你在BindDictionary方法中将它设置为“Value”。

答案 2 :(得分:0)

您是否在页面声明中设置了AutoEventWireup?

见这里:msdn AutoEventWireUp

相关问题