我无法让我的代码执行我想要的操作,感谢您的帮助。
我想做的是:
从文本框中,我为产品添加名称并创建具有该名称的对象。
然后将产品对象添加到词典中。
然后,我想将此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;
}
}
}
答案 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?