向数据网格视图添加按钮列导致问题
本文关键字:问题 按钮 添加 数据 数据网 网格 视图 | 更新日期: 2023-09-27 18:06:33
我有一个datagridview与来自数据库的数据绑定,工作良好。当表单加载时,它将加载数据。根据客户端的要求,我使用以下代码
向数据网格视图添加了新的按钮列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;
}
当窗体加载时,其工作正常。
但是我正在检查条件,例如如果我们在列表视图中选择任何项目,则数据网格视图根据所选项目进行排序…为此我这样做了....
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第一项("所有"),数据网格视图是工作正常....
- 如果我再次点击listview第一项("全部")按钮列是出现两次....
- 如果我再次点击listview第一项("全部")按钮列是出现三次…
对于listview中的所有项都是这样。
我的问题是,有没有其他的方法来添加按钮列到数据网格视图?
我已经尝试在form .cs[design]中添加按钮列,这将影响datagridview中的实际列。我用c#语言在winforms工作。有谁对这些有什么建议吗?
假设我在这个循环中删除下面的代码
if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
{
}
实际按钮列消失。有谁能帮帮忙吗?
修改代码:
FIRST CONDITION: 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;*/
}
第二个条件:
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;*/
}
首先,我强烈建议阅读DRY原则。要回答您的问题,我建议使用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)
;
if (lstviewcategories.SelectedItems[0].Value.ToString() == "All")
{
}
UPDATE:也不是在这个代码块中定义var productsbycount,而是在最上面把它作为一个类变量,这样你就可以访问它所有的方法,这样当你刷新数据时,你就会覆盖以前的var productsbycount,它会工作得很好。
UPDATE2: 'ResetBindings()可以在您更改数据后的任何时候使用,但正如我已经说过的,您需要一个类级别变量(AKA将var productsbycount放在类的顶部),在本例中,它将在此之后;
productprice = a.FirstOrDefault().product_Price
});
UPDATE3:我再说一遍,我们是来帮助和提供建议的,不要为你编写整个代码段,但我感觉很好=)我也重复一遍,这里似乎有大量的重复,随着代码库的增长,这可能会给你带来很大的痛苦!;
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)
幸运的是它工作得很好.......