NewRow() Метод перезаписывает предыдущую строку

У меня есть форма, которая добавляет строки в таблицу данных. Итак, я создаю данные:

DataTable vendas = new DataTable();

Затем на Page_Load он создает столбцы:

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

А затем внутри формы отправки (действие кнопки) он добавляет значения формы в виде новой строки и связывает их с 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();
}

Что происходит, так это то, что каждый раз, когда он запускает этот последний метод, он перезаписывает предыдущую строку вместо добавления новой. Я делаю что-то не так, и это, вероятно, глупая ошибка, но я просто не вижу этого.

РЕДАКТИРОВАТЬ: Вот все это в одном:

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

    }
}

2 ответа

Решение

Вы делаете это так:

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

И теперь вы можете продолжать добавлять строки в InserirVenda_Click

Переменные не сохраняются между постбэками, ваши DataTable переинициализируется каждый раз Page_Load,

Ты можешь использовать Session переменные или куки для сохранения ваших данных.

Другие вопросы по тегам