C# 将按钮列添加到datagrid视图会导致问题

C# 将按钮列添加到datagrid视图会导致问题,c#,winforms,button,datagridview,datagridviewcolumn,C#,Winforms,Button,Datagridview,Datagridviewcolumn,我有一个datagridview绑定,其中的数据来自运行良好的数据库。当表单加载时,它将加载数据。根据客户的要求,我使用以下代码向datagrid视图添加了新的按钮列 private void form1_load { var productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new { productid = a.Key,

我有一个datagridview绑定,其中的数据来自运行良好的数据库。当表单加载时,它将加载数据。根据客户的要求,我使用以下代码向datagrid视图添加了新的按钮列

private void form1_load
{
           var productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
        {
            productid = a.Key,
            prouctnam = a.FirstOrDefault().product_Name,
            productimage = a.FirstOrDefault().product_Image,
            productdescr = a.FirstOrDefault().product_Description,
            stockavailable = a.LongCount(),
            productprice = a.FirstOrDefault().product_Price
        });

        productbindingsource.DataSource = productsbycount;
        productgridview.DataSource = productbindingsource;
        DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
        productgridview.Columns.Add(buttoncolumn);
        buttoncolumn.Text = "Buy";
        buttoncolumn.HeaderText = "Buy";
        buttoncolumn.UseColumnTextForButtonValue = true;
        buttoncolumn.Name = "btnbuy";
        productgridview.Columns[0].Visible = false;

}
当模板加载时,其工作状态良好

但我检查的条件是,如果我们在列表视图中选择任何一项,那么datagrid视图将根据所选项进行排序。。。为此,我已经这样做了

if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
{
    var productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
      {
          productid = a.Key,
          prouctnam = a.FirstOrDefault().product_Name,
          productimage = a.FirstOrDefault().product_Image,
          productdescr = a.FirstOrDefault().product_Description,
          stockavailable = a.LongCount(),
          productprice = a.FirstOrDefault().product_Price
       });

       productbindingsource.DataSource = productsbycount;
       productgridview.DataSource = productbindingsource;
       DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
       productgridview.Columns.Add(buttoncolumn);
       buttoncolumn.Text = "Buy";
       buttoncolumn.HeaderText = "Buy";
       buttoncolumn.UseColumnTextForButtonValue = true;
       buttoncolumn.Name = "btnbuy";
       productgridview.Columns[0].Visible = false;
}
  • 如果单击listview第一项(“全部”),则datagrid视图 工作很好
  • 如果我再次单击listview的第一项(“全部”),则按钮列为 出现两次
  • 如果我再次单击listview的第一项(“全部”),则按钮列为 出现三次
这就是listview中所有项目的情况

我的问题是,是否有其他方法将按钮列添加到datagrid视图

我尝试在form1.cs[design]中添加按钮列,这将影响datagridview中的实际列。我正在用c语言在winforms中工作。有人能提出关于这些的建议吗

假设我在这个循环中删除下面的代码

if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
{
}
实际的按钮列消失了。请任何人帮忙

修改代码:

第一个条件:if(lstviewcategories.SelectedItems[0].Text.ToString()==CategoryType.Type2) {

                 var productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                             });
                 productbindingsource.ResetBindings(false);
                 /*productbindingsource.DataSource = productsbycount;
                 productgridview.DataSource = productbindingsource;
                 DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
                 productgridview.Columns.Add(buttoncolumn);
                 buttoncolumn.Text = "Buy";
                 buttoncolumn.HeaderText = "Buy";
                 buttoncolumn.UseColumnTextForButtonValue = true;
                 buttoncolumn.Name = "btnbuy";
                 productgridview.Columns[0].Visible = false;*/


             }
var productsbycount=abc.products.GroupBy(x=>x.product\u Id)。其中(a=>a.FirstOrDefault().product\u Price>0和&a.FirstOrDefault().product\u Price新
{
productid=a.键,
prouctnam=a.FirstOrDefault().product\U名称,
productimage=a.FirstOrDefault().product\U图像,
productdescr=a.FirstOrDefault()。产品描述,
stockavailable=a.LongCount(),
productprice=a.FirstOrDefault().产品价格
});
productbindingsource.ResetBindings(false);
/*productbindingsource.DataSource=productsbycount;
productgridview.DataSource=productbindingsource;
DataGridViewButtonColumn buttoncolumn=新DataGridViewButtonColumn();
productgridview.Columns.Add(buttoncolumn);
buttoncolumn.Text=“购买”;
buttoncolumn.HeaderText=“购买”;
buttoncolumn.UseColumnTextForButtonValue=true;
buttoncolumn.Name=“btnbuy”;
productgridview.Columns[0]。Visible=false*/
}
第二个条件:

           if (lstviewcategories.SelectedItems[0].Text.ToString() == CategoryType.Type3)
             {
                 var productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 500 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                              });
                 productbindingsource.ResetBindings(false);
              /* productbindingsource.DataSource = productsbycount;
                 productgridview.DataSource = productbindingsource;
                 DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
                 productgridview.Columns.Add(buttoncolumn);
                 buttoncolumn.Text = "Buy";
                 buttoncolumn.HeaderText = "Buy";
                 buttoncolumn.UseColumnTextForButtonValue = true;
                 buttoncolumn.Name = "btnbuy";
                 productgridview.Columns[0].Visible = false;*/

             }
if(lstviewcategories.SelectedItems[0].Text.ToString()==CategoryType.Type3)
{
var productsbycount=abc.products.GroupBy(x=>x.product\u Id)。其中(a=>a.FirstOrDefault()。product\u Price>500&&a.FirstOrDefault()。product\u Price新建
{
productid=a.键,
prouctnam=a.FirstOrDefault().product\U名称,
productimage=a.FirstOrDefault().product\U图像,
productdescr=a.FirstOrDefault()。产品描述,
stockavailable=a.LongCount(),
productprice=a.FirstOrDefault().产品价格
});
productbindingsource.ResetBindings(false);
/*productbindingsource.DataSource=productsbycount;
productgridview.DataSource=productbindingsource;
DataGridViewButtonColumn buttoncolumn=新DataGridViewButtonColumn();
productgridview.Columns.Add(buttoncolumn);
buttoncolumn.Text=“购买”;
buttoncolumn.HeaderText=“购买”;
buttoncolumn.UseColumnTextForButtonValue=true;
buttoncolumn.Name=“btnbuy”;
productgridview.Columns[0]。Visible=false*/
}

这两种情况都不起作用。

首先,我强烈建议大家阅读干燥原理。为了回答您的问题,我建议您使用
BindingSource
的刷新方法,这样您就可以在不更改数据结构的情况下刷新datagridview中的数据。您应该只在加载时执行以下所有操作一次,然后在其他任何地方刷新数据,除非您确实想要更改数据类型,例如数据来自不同的源

productbindingsource.DataSource = productsbycount;
        productgridview.DataSource = productbindingsource;
        DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
        productgridview.Columns.Add(buttoncolumn);
        buttoncolumn.Text = "Buy";
        buttoncolumn.HeaderText = "Buy";
        buttoncolumn.UseColumnTextForButtonValue = true;
        buttoncolumn.Name = "btnbuy";
        productgridview.Columns[0].Visible = false;
不要在下面的代码块中再次执行这些操作,只需调用
productbindingsource.ResetBindings(false)

更新:另外,不要在这个代码块中定义var productsbycount,而是在最顶端将其作为一个类变量,以便您可以访问所有方法,这样当您刷新数据时,您将覆盖以前的var productsbycount,它将工作得非常好

UPDATE2:'ResetBindings()可以在更改数据后的任何时候使用,但正如我已经说过的,您需要一个类级变量(也就是将var productsbycount放在类的顶部),在本例中,它将紧跟其后

productprice = a.FirstOrDefault().product_Price
           });
更新3:我重复一遍,我们在这里提供帮助和建议,不是为您编写整个代码,而是因为我感觉很好=)我也重复一遍,这里似乎存在大量重复,随着代码库的增长,这可能会给您带来巨大的痛苦

namespace Test
{
    public partial class Form2 : Form
    {
        BindingSource productbindingsource;
        var productsbycount;

        public Form2()
        {
            InitializeComponent();
            Load += new EventHandler(Form2_Load);
        }

        void Form2_Load(object sender, EventArgs e)
        {
            productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
            {
                productid = a.Key,
                prouctnam = a.FirstOrDefault().product_Name,
                productimage = a.FirstOrDefault().product_Image,
                productdescr = a.FirstOrDefault().product_Description,
                stockavailable = a.LongCount(),
                productprice = a.FirstOrDefault().product_Price
            });
            productbindingsource.DataSource = productsbycount;
            productgridview.DataSource = productbindingsource;
            DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
            productgridview.Columns.Add(buttoncolumn);
            buttoncolumn.Text = "Buy";
            buttoncolumn.HeaderText = "Buy";
            buttoncolumn.UseColumnTextForButtonValue = true;
            buttoncolumn.Name = "btnbuy";
            productgridview.Columns[0].Visible = false;
        }

        private void methodNameHere()
        {
            productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                              });

            productbindingsource.ResetBindings(false);
        }
    }
}
名称空间测试
{
公共部分类表单2:表单
{
BindingSource产品BindingSource;
var productsbycount;
公共表格2()
{
初始化组件();
荷载+=n
namespace Test
{
    public partial class Form2 : Form
    {
        BindingSource productbindingsource;
        var productsbycount;

        public Form2()
        {
            InitializeComponent();
            Load += new EventHandler(Form2_Load);
        }

        void Form2_Load(object sender, EventArgs e)
        {
            productsbycount = abc.products.GroupBy(x => x.product_Id).Select(a => new
            {
                productid = a.Key,
                prouctnam = a.FirstOrDefault().product_Name,
                productimage = a.FirstOrDefault().product_Image,
                productdescr = a.FirstOrDefault().product_Description,
                stockavailable = a.LongCount(),
                productprice = a.FirstOrDefault().product_Price
            });
            productbindingsource.DataSource = productsbycount;
            productgridview.DataSource = productbindingsource;
            DataGridViewButtonColumn buttoncolumn = new DataGridViewButtonColumn();
            productgridview.Columns.Add(buttoncolumn);
            buttoncolumn.Text = "Buy";
            buttoncolumn.HeaderText = "Buy";
            buttoncolumn.UseColumnTextForButtonValue = true;
            buttoncolumn.Name = "btnbuy";
            productgridview.Columns[0].Visible = false;
        }

        private void methodNameHere()
        {
            productsbycount = abc.products.GroupBy(x => x.product_Id).Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)
                              .Select(a => new
                              {
                                  productid = a.Key,
                                  prouctnam = a.FirstOrDefault().product_Name,
                                  productimage = a.FirstOrDefault().product_Image,
                                  productdescr = a.FirstOrDefault().product_Description,
                                  stockavailable = a.LongCount(),
                                  productprice = a.FirstOrDefault().product_Price
                              });

            productbindingsource.ResetBindings(false);
        }
    }
}
if (lstviewcategories.SelectedItems[0].Text.ToString() == CategoryType.Type2)
productgridview.datasource = productsbycount.Where(a => a.FirstOrDefault().product_Price > 0 && a.FirstOrDefault().product_Price <= 1000)