2012-05-05 4 views
0

Я пытался обновить свой datatable, когда когда-либо в корзину вставляется одинаковое название книги.Обновить значение в 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; 
} 

Начальное значение в количестве 1, но когда кнопка была подана, количество еще 1, но когда он вступит в третий раз, число только начал увеличиваться на единицу. Я не понимаю, где ошибка?

Edited ::

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

Ваш вопрос непонятен. Пожалуйста, опишите это больше. где 'button', что вы подразумеваете под кнопкой? – jams

+0

Ваш вопрос непонятен. Предоставьте схему вашего данных. Предоставьте полный код с вашей разметкой html. –

+0

Я обнаружил проблему, когда я нажимаю ту же книгу, что и в корзину, она не складывалась в первый раз, но когда я взял тот же URL-адрес и открылся на другой вкладке, он складывается из одного-двух? есть ли какие-либо проблемы с моим кодированием? – 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(); 

Почему вы вызывая этот метод дважды?

+0

Первый - привязать данные к сеансу, другой - в списке. есть ли лучший способ сделать это? – eugene

+0

@eugene Вы просто создаете две переменные, представляющие одну и ту же вещь. Почему бы вам не вызвать метод один раз, установив переменную, а затем установить сеанс и источник данных для этой переменной. Вызов метода дважды в строке почти наверняка, по крайней мере, просто лишним. –

+0

Спасибо за информацию, я все еще новичок в программировании. – eugene

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