2012-05-05 18 views
0

カートに同じ書籍のタイトルが挿入されたときにデータテーブルを更新しようとしていました。量のデータテーブル内の値を更新

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; 
} 

初期値は1ですが、ボタンが提出されたとき、量はまだ1であるが、それは第三の時間を入力すると、番号が1だけ増加し始めました。間違いはどこにあるのか分かりません。

が編集::

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(); 
    } 

} 

クラス::

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

あなたの質問は不明です。それ以上説明してください。 「ボタン」はどこですか?ボタンを送信するとどういう意味ですか? – jams

+0

あなたの質問は明確ではありません。あなたのデータテーブルのスキーマを提供する。 HTMLコードをフルコードで入力してください。 –

+0

同じ本を追加するときに問題が発生しました。最初に追加されませんでしたが、同じURLを使用して別のタブで開くと、1から2になります。私のコーディングに何か問題はありますか? – eugene

答えて

1

をあなたは問題が何であるかを決定するために、あなたのコードの多くを示す必要があります。データテーブルにバインドしていますか?ボタンをクリックした後で再作成していますか?

とにかく、次のコードは、あなたが期待しているように更新が動作することを示しています。 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" ]); 
     } 
    } 
} 

編集

あなたの更新の後、すぐに奇妙なバグの可能性のあるソースとして私に飛び出し唯一のものは以下の通りです:

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

あなたはなぜそのメソッドを2回呼び出しますか?

+0

最初はデータテーブルをセッションにバインドし、もう1つはリストビューにバインドすることです。そうするよりよい方法はありますか? – eugene

+0

@eugene同じことを表すために2つの変数を作成しています。一度メソッドを呼び出して変数を設定してから、その変数にセッションとデータソースを設定してみてください。メソッドを2回連続して呼び出すことは、ほとんど確実に不要なことです。 –

+0

情報をありがとう、私はまだプログラミングの新しいです。 – eugene

関連する問題