C# 在bindingsource中防止重复项

C# 在bindingsource中防止重复项,c#,C#,在这段代码中,我有一个datagridview,datagridview的数据源是bindingsource。当我在datagridview中插入一个项目时,可以添加它两次,以便在bindingsource中获得重复的项目 如何防止bindingsource中出现重复项?” 这是我使用的代码: namespace WindowsFormsApplication2 { public partial class Form1 : Form {

在这段代码中,我有一个datagridview,datagridview的数据源是bindingsource。当我在datagridview中插入一个项目时,可以添加它两次,以便在bindingsource中获得重复的项目

如何防止bindingsource中出现重复项?”

这是我使用的代码:

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