2013-07-11 3 views
0

Я работаю над приложением для электронной коммерции, и проблема заключается в показе количества купленных предметов. В DropDownList отображается опция изменения количества, она находится в gridview и имеет событие selectedindexchanged. Код события работает нормально, но когда есть два (или более) продукта, и мы меняем количество одной строки, а затем меняем количество других строк, количество предыдущей строки возвращается к умолчанию, равному «1», в то время как столбец общей цены показывает умножение цены и quanity, которые мы установили в DropDownList.DropDownList не сохраняет значения

Мой DropDownList код:

<asp:TemplateField HeaderText="Qty"> 
        <EditItemTemplate> 
         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:DropDownList ID="ddlQty" runat="server" AutoPostBack="True" 
          onselectedindexchanged="ddlQty_SelectedIndexChanged"> 
          <asp:ListItem>1</asp:ListItem> 
          <asp:ListItem>2</asp:ListItem> 
          <asp:ListItem>3</asp:ListItem> 
          <asp:ListItem>4</asp:ListItem> 
          <asp:ListItem>5</asp:ListItem> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 

Мой C# код для SelectedIndexChanged и GridView RowDataBoundevent:

protected void ddlQty_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddlQty =(DropDownList)sender; 
     int rowindex = int.Parse(ddlQty.Attributes["rowindex"].ToString()); 
     ViewState["index"] = rowindex; 
     ViewState["I"] = ddlQty.SelectedValue; 

     decimal price = Convert.ToDecimal(ds.Tables[0].Rows[rowindex]["Price"].ToString()); 
     decimal totalprice = price * Convert.ToInt32(ddlQty.SelectedValue); 
     ds.Tables[0].Rows[rowindex]["TotalPrice"] = totalprice; 
     GridView1.DataSource = ds; 
     GridView1.DataBind(); 
     ds.Tables[1].Rows[0]["TotalPrice"] = decimal.Parse(ds.Tables[1].Rows[0]["TotalPrice"].ToString()) + totalprice - Convert.ToDecimal(ds.Tables[0].Rows[rowindex]["Price"].ToString()); 
     GridView1.FooterRow.Cells[2].Text = "Total Amount ="; 
     GridView1.FooterRow.Cells[3].Text = ds.Tables[1].Rows[0]["TotalPrice"].ToString(); 
    } 
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      DropDownList ddl = (DropDownList)e.Row.FindControl("ddlQty"); 
      ddl.Attributes.Add("rowindex", e.Row.RowIndex.ToString()); 
      if (ViewState["index"] != null) 
      { 
       if (e.Row.RowIndex.ToString() == ViewState["index"].ToString()) 
       { 
        ddl.SelectedValue = ViewState["I"].ToString(); 
       } 
      } 

     } 
    } 

Я прилагаю изображение и сделать его более ясным.

enter image description here

+0

Как вы связываете ddlQty? Я предполагаю на странице_Load и не проверяю IsPostback. –

+0

Нет, функция привязки вызывается только тогда, когда '! IsPostBack' –

+0

отлаживает и проверяет первую строку в' GridView1_RowDataBound', что 'ViewState [" I "]' держит – Dotnet

ответ

0

Я думаю, что ваша сетка является обязательным для каждого постбэка сделанного DropDownList, так что изменение одного значения приведет к перезаписи ранее сохраненное значение в VS. Вы должны попытаться сохранить эти значения в виде списка, добавив изменения к нему, а не заменять его каждый раз.

IMHO, во всяком случае, я бы решил установить свойства AutoPostBack в false и обновить вычисления строк на стороне клиента, а затем проверить на стороне сервера на submit.