C# 在bindingsource中防止重复项
在这段代码中,我有一个datagridview,datagridview的数据源是bindingsource。当我在datagridview中插入一个项目时,可以添加它两次,以便在bindingsource中获得重复的项目 如何防止bindingsource中出现重复项?” 这是我使用的代码:C# 在bindingsource中防止重复项,c#,C#,在这段代码中,我有一个datagridview,datagridview的数据源是bindingsource。当我在datagridview中插入一个项目时,可以添加它两次,以便在bindingsource中获得重复的项目 如何防止bindingsource中出现重复项?” 这是我使用的代码: namespace WindowsFormsApplication2 { public partial class Form1 : Form {
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
class GridItem
{
public int Ordernummer { get; set; }
public int Bonnummer { get; set; }
public int Volgnummer { get; set; }
public string Bewerking { get; set; }
}
List<GridItem> gridItems;
BindingSource bs = new BindingSource();
public Form1()
{
InitializeComponent();
gridItems = new List<GridItem>{
new GridItem{ Ordernummer = 123456, Bonnummer = 1, Volgnummer = 40, Bewerking = "1130-Lasersnijden"},
new GridItem{ Ordernummer = 123678, Bonnummer = 2, Volgnummer = 30, Bewerking = "1130-Lasersnijden"}
};
bs.DataSource = gridItems;
dataGridView1.RowHeadersVisible = false;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToOrderColumns = false;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = bs;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}
private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Debugger.Break();
}
private void button2_Click(object sender, EventArgs e)
{
//ADD ITEMS
gridItems.Add(new GridItem{ Ordernummer = 123456, Bonnummer = 1, Volgnummer = 40, Bewerking = "1130-Lasersnijden"});
bs.ResetBindings(false);
}
}
}
命名空间窗口窗体应用程序2
{
公共部分类Form1:Form
{
类GridItem
{
公共int-Ordernummer{get;set;}
public int Bonnummer{get;set;}
public int Volgnummer{get;set;}
公共字符串Bewerking{get;set;}
}
列出项目;
BindingSource bs=新的BindingSource();
公共表格1()
{
初始化组件();
gridItems=新列表{
新网格项{Ordernummer=123456,Bonnummer=1,Volgnummer=40,Bewerking=“1130 Lasersnijden”},
新网格项{Ordernummer=123678,Bonnummer=2,Volgnummer=30,Bewerking=“1130 Lasersnijden”}
};
bs.DataSource=gridItems;
dataGridView1.RowHeadersVisible=false;
dataGridView1.AllowUserToAddress=false;
dataGridView1.AllowUserToOrderColumns=false;
dataGridView1.AllowUserToResizeRows=false;
dataGridView1.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect=false;
dataGridView1.AutoGenerateColumns=true;
dataGridView1.DataSource=bs;
dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
System.Diagnostics.Debugger.Break();
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
//添加项目
Add(新的GridItem{Ordernummer=123456,Bonnummer=1,Volgnummer=40,Bewerking=“1130 Lasersnijden”});
重置绑定(错误);
}
}
}
注意:
datagridview中的数据现在是硬编码的,以后我将从数据库中加载数据。您可以使用List.Contains方法在将元素添加到列表之前检查元素是否存在
List.Containsmethod内部使用列表中已有对象的Equals方法,如果它们实现了接口IEquatable
因此,您需要使类GridItem扩展为IEquatable
然后,重写方法等于(在GridItem类上):
但是,如果只需要使用Ordernummer属性检查元素是否存在,则可以使用:
private void button2_Click(object sender, EventArgs e)
{
if(!gridItems.Any(gridItem => gridItem.Ordernummer == 123456){
gridItems.Add(new GridItem{ Ordernummer = 123456, Bonnummer = 1, Volgnummer = 40, Bewerking = "1130-Lasersnijden"});
bs.ResetBindings(false);
}
}
use.Distinct()在绑定到GridItem之前,您的列表中的数据将仍然依赖于生成的hashcode和equals方法。我将是一个实现GridItem并重写这些方法的类。@VinaySingh,您可以给我一个例子吗?如果您从数据库获取数据,您可以始终以避免重复的方式编写DB查询。如果您担心的是用户插入数据复制,在插入到绑定源代码之前只需检查密钥。您好,谢谢您的awnser,但我不太明白。您可以导出您的awnser吗。我不太明白equals函数应该是什么样子。我怎么使用您的equals函数?我看不到该方法的任何地方
gridItems.Contains(gridToAdd)
默认情况下使用它来检查元素是否已经存在。它使用Equals函数迭代gridItems上的所有元素进行比较。好的,我现在知道了,但是我如何扩展griditem类使其工作?如果我知道它将在我这边工作,再次感谢您的帮助,更新了关于Equals定义的更多详细信息GridItem类的n
private void button2_Click(object sender, EventArgs e)
{
//ADD ITEMS
var gridToAdd = new GridItem{ Ordernummer = 123456, Bonnummer = 1, Volgnummer = 40, Bewerking = "1130-Lasersnijden"};
if(!gridItems.Contains(gridToAdd){
gridItems.Add(gridToAdd);
bs.ResetBindings(false);
}
}
private void button2_Click(object sender, EventArgs e)
{
if(!gridItems.Any(gridItem => gridItem.Ordernummer == 123456){
gridItems.Add(new GridItem{ Ordernummer = 123456, Bonnummer = 1, Volgnummer = 40, Bewerking = "1130-Lasersnijden"});
bs.ResetBindings(false);
}
}