2010-10-26 2 views
0

У меня возникли проблемы с получением кода, который я хочу сделать, и я был бы признателен за вашу помощь.OnSelectedIndexChanged не работает

То, что я хотел бы сделать, это:

Из текстового поля, добавить название продукта и создать объект с таким именем.

Товарный объект затем добавляется в словарь.

Затем я хочу связать этот словарь с выпадающим списком.

Если я изменяю выбранный элемент, я хочу отобразить номер выбранного продукта (по умолчанию как 0 при создании объекта продукта).

Проблема заключается в том, что при попытке изменить элемент в раскрывающемся списке ничего не происходит.

Thanx!

.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

От * ничего не происходит * Вы имеете в виду, что обратной передачи не происходит? Отправка происходит, но ваш обработчик событий не срабатывает? Если вы используете точки останова, что попадается? –

+0

Неужели он никогда не вводит метод, который вы определили, или он никогда ничего не делает? –

+0

Он никогда не входит в метод ddlProducts_SelectedIndexChanged. – Andy

ответ

0

У вас есть AutoEventWireup установить в объявлении страницы?

Смотрите здесь: msdn AutoEventWireUp

+0

Он подключает его вручную. – Dismissile

+0

Да, у меня есть AutoEventWireup = "true" – Andy

+0

Когда я говорю, что ничего не происходит, я имею в виду, что я никогда не удалял свой метод ddlProducts_SelectedIndexChanged. – Andy

2

Ваш DataValueField никогда не равна Banana. Он равен «Value». Вы используете неправильный селектор. Вы хотите использовать 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; 
     } 
    } 

** Добавлен бит равен от чего я узнал от г-тарелочкам.

EDIT:

Так вы говорите, событие никогда не получает удар, это возможно 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; 
    } 
+0

судимых что без изменений ... – Andy

+0

@Andy - Вы привязываете только ddlProducts к событию click , Событие selectedIndexChanged, вероятно, срабатывает, но поскольку вы не привязываете ddlProducts к последующей загрузке, он фактически не изменяется от индекса 0. Попробуйте привязать ddlProducts в Page_Load, если это обратная передача. –

+0

защищен недействительным Page_Load (объект отправителя, EventArgs е) { если { //ddlProducts.Items.Insert(0, новый ListItem ("Продукты", "0")) (Page.IsPostBack!); } productLabel.Text = "Название продукта"; newProductButton.Text = "Добавить продукт"; ProductName = productText.Text; ddlProducts.SelectedIndexChanged + = ddlProducts_SelectedIndexChanged; BindDictionary(); } – Andy

1

ddlProducts.DataValueField никогда не будет банан, так как вы установите его в «Value» в методе BindDictionary.

+0

Хорошо, я вижу это, но метод никогда не попадает – Andy

Смежные вопросы