2012-05-05 4 views
0

J'essayais de mettre à jour mon datatable lorsque le même titre de livre est inséré dans le panier.Valeur de mise à jour dans datatable

public bool checkBook(DataTable dt, String title) 
{ 
    bool returnval = false; 
    try 
    { 

     foreach (DataRow dr in dt.Rows) 
     { 
      String checktitle = dr["Title"].ToString(); 
      if (title == checktitle) 
      { 
       int a = Convert.ToInt32(dr["quantity"].ToString()); 
       dr["quantity"] = a + 1; 
       returnval = true; 
      } 

     } 
    } 
    catch (Exception ex) 
    { 
     //do something 
    } 
    return returnval; 
} 

Valeur initiale de la quantité est 1, mais lorsque le bouton a été soumis, la quantité est toujours 1, mais quand il entre dans la troisième fois, le nombre a commencé à augmenter que par un. Je ne comprends pas où est l'erreur?

Modifié ::

protected void ListView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    String title = ((Label)(ListView1.Items[ListView1.SelectedIndex].FindControl("Title"))).Text; ; 
    decimal price = decimal.Parse(((Label)(ListView1.Items[ListView1.SelectedIndex].FindControl("Price"))).Text); 

    cart cart = new cart(title, price); 

    if (HttpContext.Current.Session["Cart"] != null) 
    { 
     DataTable shoppingcart = (DataTable)HttpContext.Current.Session["Cart"]; 
     bool check = checkBook(shoppingcart, title); 
     if (check != true) 
     { 
      ShoppingCart.DataSource = cart.cartrow(shoppingcart); 
      ShoppingCart.DataBind(); 
     } 
     else 
     { 
      // if is true, it suppose to increase the quantity here 

      } 

     } 
    } 

    else 
    { 

     HttpContext.Current.Session["Cart"] = cart.shoppingCart(); 
     ShoppingCart.DataSource = cart.shoppingCart(); 
     ShoppingCart.DataBind(); 
    } 

} 

classe ::

String title { get; set; } 
decimal price { get; set; } 
int quantity = 1; 
DataTable CartTable; 
DataRow tableRow; 
public cart(String _title, decimal _price) 
{ 
title = _title; 
price = _price; 
} 
public DataTable shoppingCart() 
{ 
CartTable = new DataTable("cart"); 

CartTable.Columns.Add("ID", typeof(Int32)); 
CartTable.Columns["ID"].AutoIncrement = true; 
CartTable.Columns["ID"].AutoIncrementSeed = 1; 

CartTable.Columns.Add("Title"); 
CartTable.Columns.Add("Price"); 
CartTable.Columns.Add("quantity"); 
CartTable.Columns["quantity"].DataType = typeof(Int32); 

tableRow = CartTable.NewRow(); 
tableRow["Title"] = title; 
tableRow["Price"] = price; 
tableRow["quantity"] = quantity; 
CartTable.Rows.Add(tableRow); 
return CartTable; 
} 

public DataTable cartrow(DataTable _cart) 
{ 

tableRow = _cart.NewRow(); 
tableRow["Title"] = title; 
tableRow["Price"] = price; 
tableRow["quantity"] = quantity; 
_cart.Rows.Add(tableRow); 
return _cart; 

} 
+0

Votre question n'est pas claire. S'il vous plaît décrire plus. où est le bouton, que voulez-vous dire par bouton soumis? – jams

+0

Votre question n'est pas claire. Fournissez le schéma de votre datatable. Fournissez le code complet avec votre balisage html. –

+0

J'ai trouvé un problème quand j'appuyais sur le même livre add-to-cart, il n'a pas ajouté la première fois, mais quand j'ai pris la même URL et ouvert dans un autre onglet, il s'additionne de un à deux? Y a-t-il un problème avec mon codage? – eugene

Répondre

1

Vous devez montrer plus de votre code afin de déterminer quel est le problème. Êtes-vous lié à la datatable? Est-ce que vous le recréer après avoir cliqué sur le bouton?

Quoi qu'il en soit, ce qui suit est un peu de code pour montrer que la mise à jour fonctionne comme vous l'attendez. Notez l'utilisation de la méthode d'extension Field générique à partir de System.Data.DataSetExtensions.

namespace StackOverflowTestCode 
{ 
    using System.Data; 
    using Microsoft.VisualStudio.TestTools.UnitTesting; 

    [TestClass] 
    public class RandomTests 
    { 
     [TestMethod] 
     public void DataTableUpdate_Test() 
     { 
      DataTable dataTable = new DataTable(); 
      dataTable.Columns.Add("Title", typeof(string)); 
      dataTable.Columns.Add("Quantity", typeof(int)); 

      dataTable.Rows.Add("TitleOne", 0); 
      dataTable.Rows.Add("TitleTwo", 0); 
      dataTable.Rows.Add("TitleThree", 0); 

      DataRow[] rowsToUpdate = 
       dataTable.Select("Title = 'TitleTwo'"); 

      if(rowsToUpdate != null && rowsToUpdate.Length == 1) 
      { 
       rowsToUpdate[ 0 ][ "Quantity" ] = 
        rowsToUpdate[ 0 ].Field<int>("Quantity") + 1; 
      } 

      // The right row was updated. 
      Assert.AreEqual(1, dataTable.Rows[ 1 ][ "Quantity" ]); 

      // The other rows were not updated. 
      Assert.AreEqual(0, dataTable.Rows[ 0 ][ "Quantity" ]); 
      Assert.AreEqual(0, dataTable.Rows[ 2 ][ "Quantity" ]); 
     } 
    } 
} 

modifier

Après votre mise à jour, la seule chose qui saute immédiatement à moi aussi étrange et une source possible d'un bug est la suivante:

HttpContext.Current.Session["Cart"] = cart.shoppingCart(); 
ShoppingCart.DataSource = cart.shoppingCart(); 

Pourquoi êtes-vous appeler cette méthode deux fois?

+0

le premier est de lier la datatable à la session, l'autre était sur la liste. Y a-t-il une meilleure façon de le faire? – eugene

+0

@eugene Vous créez simplement deux variables pour représenter la même chose. Pourquoi n'appelez-vous pas une seule fois la méthode, définissant une variable, puis définissez la session et la source de données sur cette variable. Appeler la méthode deux fois de suite est presque certainement tout simplement inutile. –

+0

Merci pour l'info, je suis encore nouveau dans la programmation. – eugene

Questions connexes