eugene eugene - 3 months ago 50
ASP.NET (C#) Question

Update value in datatable

I was trying to update my datatable when ever the same book title is inserted into the cart.

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


Initial value in the quantity is 1, but when button was submitted, the quantity is still 1, but when it enter the third time, the number only started to increase by one. I don't understand where is the mistake?

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

}


class::

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;

}

Answer

You need to show more of your code in order to determine what the problem is. Are you binding to the datatable? Are you recreating it after the button is clicked?

Anyway, the following is a little bit of code to show that updating works as you'd expect. Note the use of the generic Field extension method from 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" ] );
        }
    }
}

edit

After your update, the only thing that immediately jumps out at me as odd and a possible source of a bug is the following:

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

Why are you calling that method twice?