如何在C#窗口应用程序中动态添加行datagridview就像在Asp.net Web应用程序中添加到购物车而不使用数据库

问题描述:

我是jitendra kumar工作在库存管理系统和 我们有代码在我的dataGridview中添加一行在windows应用程序中使用列表提交,但是当我们通过点击按钮AddToCart购买新产品时,它将覆盖dataGridview中的前一行,但不会添加另一个新行dataGridview。如何在C#窗口应用程序中动态添加行datagridview就像在Asp.net Web应用程序中添加到购物车而不使用数据库

我想在dataGridview中添加新行,并且所有以前的行都保留在我的dataGridview中,就像Web应用程序项目中的添加到购物车选项一样,请任何人都可以提出一些想法来解决此问题。下面

感谢

是我的代码

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 
using CrystalDecisions.CrystalReports.Engine; 
using CrystalDecisions.Shared; 

namespace SIMS1 
{ 

public partial class Sales : Form 
{ 
    DataTable dt; 
    List<field> data = null; decimal Total = 0; 
    int Invoiceid,qty; 
    decimal unitprize,Total_amount; 
    public Sales() 
    { 
     InitializeComponent(); 
     binddgvstock(); 

} 

    private void btn_save_Click(object sender, EventArgs e) 
    { 

     data = new List<field>(); 
     string invoiceno = txt_invoiceno.Text; 
     if (string.IsNullOrEmpty(invoiceno)) 
     { 

      string productname = txt_productname.Text; 
      decimal unitprize = Convert.ToDecimal(txt_unitprize.Text); 
      int Quantity = Convert.ToInt32(txt_qty.Text); 
      decimal total = Convert.ToDecimal(txt_totalamount.Text); 
      field f = new field(); 
      f.ProductName = productname; 
      f.UnitPrize = unitprize; 
      f.Quantity = Quantity; 
      f.TotalAmount = total; 
      data.Add(f); 


      dataGridView1.AutoGenerateColumns = false; 
      dataGridView1.DataSource = data.ToList(); 

     } 
     else 
     { 
      string productname = txt_productname.Text; 
      decimal unitprize = Convert.ToDecimal(txt_unitprize.Text); 
      int Quantity = Convert.ToInt32(txt_qty.Text); 
      decimal total = Convert.ToDecimal(txt_totalamount.Text); 
      field f = new field(); 
      f.ProductName = productname; 
      f.UnitPrize = unitprize; 
      f.Quantity = Quantity; 
      f.TotalAmount = total; 
      data.Add(f); 

      dataGridView1.AutoGenerateColumns = false; 
      dataGridView1.DataSource = data.ToList(); 

     } 

     txt_productname.Text = ""; 
     txt_unitprize.Text = ""; 
     txt_qty.Text = ""; 
     txt_totalamount.Text = ""; 

     } 
    } 
[Serializable] 
public class field 
{ 

    public int InvoiceId 
    { 
     get; 
     set; 
    } 
    public string InvoiceNo 
    { 
     get; 
     set; 
    } 
    public DateTime InvoiceDate 
    { 
     get; 
     set; 
    } 
    public string CustomerId 
    { 
     get; 
     set; 
    } 
    public string CustomerName 
    { 
     get; 
     set; 
    } 
    public string ProductName 
    { 
     get; 
     set; 
    } 
    public decimal UnitPrize 
    { 
     get; 
     set; 
    } 
    public int Quantity 
    { 
     get; 
     set; 
    } 
    public decimal DISC 
    { 
     get; 
     set; 
    } 
    public decimal TotalAmount 
    { 
     get; 
     set; 
    } 
    public decimal Total 
    { 
     get; 
     set; 
    } 
    } 
} 

enter image description here

随着你问题代码:

你正在创建每次单击保存以新的清单:

data = new List<field>(); 

此行需要删除。

替换List<field> data = null;与List<field> data = new List<field>();

解决方案1:

使用BindingList<T>代替List<T>,如:

BindingList<field> data = new BindingList<field>(); 

代替: 列表数据= NULL;

使用此方法时,当您拨打data.Add(f);时,该行将自动添加到网格中。无需重新分配数据源或刷新它。

解决方案2:

替换:

dataGridView1.DataSource = data.ToList(); //.ToList() is useless. 

有了:

dataGridView1.DataSource = null; 
dataGridView1.DataSource = data; 

编后评论:

要删除行或多个SEL ected行,按钮点击逻辑:

foreach(DataGridViewRow gridRow in dataGridView1.SelectedRows) 
{ 
    var rowObject = gridRow.DataBoundItem as field; // field is the class name 

    data.Remove(rowObject); 
} 
+0

非常感谢你..它的工作对我罚款 – user2342574

+0

现在我想用在cell_click EVNT或按钮单击事件 – user2342574

+0

答案编辑成包括C#代码删除从DataGridView行删除逻辑。 – user3185569