0

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

    }
}
VDWWD
  • 35,079
  • 22
  • 62
  • 79
Mike3645
  • 13
  • 5

2 Answers2

0

Variables are not persisted between postbacks, your DataTable gets reinitialised every time the Page_Load.

You can use Session variables or cookies to persist your data.

naturalbornlazy
  • 301
  • 1
  • 5
  • 8
0

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

VDWWD
  • 35,079
  • 22
  • 62
  • 79
  • This is correct, just tried it and it works . The only thing i changed is that i declare the Datatable outside of the page load. Thank you so much for the help – Mike3645 Jun 16 '17 at 14:39