Search code examples
c#asp.netgridviewdatatablenewrow

NewRow() Method overwritting previous row


I have a form that adds rows into a datatable. So i create the datatable:

DataTable vendas = new DataTable();

Then on Page_Load it creates the Columns:

vendas.Columns.Add("Nome");
vendas.Columns.Add("Morada");
vendas.Columns.Add("Contribuinte");
vendas.Columns.Add("CC");
vendas.Columns.Add("Email");
vendas.Columns.Add("Agregado");
vendas.Columns.Add("Banco");
vendas.Columns.Add("IBAN");
vendas.Columns.Add("Produtos");

And then inside the submit form (button action) it adds the form values as a new row and binds them to a Gridview:

protected void x(object sender, EventArgs e)
{
    DataRow venda = vendas.NewRow();
    venda["Nome"] = nomecliente;
    venda["Morada"] = moradacliente;
    venda["Contribuinte"] = contribuintecliente;
    venda["CC"] = cccliente;
    venda["Email"] = mailcliente;
    venda["Agregado"] = agregadocliente;
    venda["Banco"] = bancocliente;
    venda["IBAN"] = ibancliente;
    venda["Produtos"] = produtocliente;

    vendas.Rows.Add(venda);

    GridviewVendas.DataSource = vendas;
    GridviewVendas.DataBind();
}

What is happening tho is that each time it runs this last method it overwrites the previous row instead of adding a new one. I'm doing something wrong and it's probably a dumb mistake but i'm just not seeing it.

EDIT: Here is all that in one:

public partial class _Default : System.Web.UI.Page
{
    public string nome;
    public string planosaudeantigo;
    public string valorplanosaudeantigo;
    public string condicoesplanosaudeantigo;
    public string stringagregadofamiliar;
    public string nomecliente;
    public string moradacliente;
    public string contribuintecliente;
    public string cccliente;
    public string mailcliente;
    public string agregadocliente;
    public string bancocliente;
    public string ibancliente;
    public string produtocliente;
    DataTable vendas = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {
        vendas.Columns.Add("Nome");
        vendas.Columns.Add("Morada");
        vendas.Columns.Add("Contribuinte");
        vendas.Columns.Add("CC");
        vendas.Columns.Add("Email");
        vendas.Columns.Add("Agregado");
        vendas.Columns.Add("Banco");
        vendas.Columns.Add("IBAN");
        vendas.Columns.Add("Produtos");
    }

    protected void InserirVenda_Click(object sender, EventArgs e)
    {
        nomecliente = NomeCliente.Text;
        moradacliente = MoradaCliente.Text;
        contribuintecliente = ContribuinteCliente.Text;
        cccliente = CCCliente.Text;
        mailcliente = MailCliente.Text;
        agregadocliente = AgregadoCliente.Text;
        bancocliente = BancoCliente.Text;
        ibancliente = IbanCliente.Text;

        for (int i = 0; i < ProdutosCliente.Items.Count; i++)
        {
            if (ProdutosCliente.Items[i].Selected)
            {
                produtocliente += ProdutosCliente.Items[i].Value + ",";
            }
        }

        DataRow venda = vendas.NewRow();
        venda["Nome"] = nomecliente;
        venda["Morada"] = moradacliente;
        venda["Contribuinte"] = contribuintecliente;
        venda["CC"] = cccliente;
        venda["Email"] = mailcliente;
        venda["Agregado"] = agregadocliente;
        venda["Banco"] = bancocliente;
        venda["IBAN"] = ibancliente;
        venda["Produtos"] = produtocliente;

        vendas.Rows.Add(venda);

        GridviewVendas.DataSource = vendas;
        GridviewVendas.DataBind();

    }
}

Solution

  • You do it like this:

    protected void Page_Load(object sender, EventArgs e)
    {
        //check if it is a postback
        if (!Page.IsPostBack)
        {
            //create a new table
            DataTable vendas = new DataTable();
    
            //add some columns
            vendas.Columns.Add("Nome");
            vendas.Columns.Add("Morada");
    
            //add the datatable to the viewstate
            ViewState["vendas"] = vendas;
        }
        else
        {
            //check if the viewstate exits and cast it back to a datatable
            if (ViewState["vendas"] != null)
            {
                vendas = ViewState["vendas"] as DataTable;
            }
        }
    }
    

    And now you can keep adding rows in InserirVenda_Click