NewRow() 方法覆盖上一行

NewRow() Method overwritting previous row

我有一个表单可以将行添加到数据表中。所以我创建了数据表:

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

    }
}

变量不会在回发之间保留,每次 Page_Load 时您的 DataTable 都会重新初始化。

您可以使用 Session 变量或 cookie 来保存您的数据。

你这样做:

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

中添加行