Reputation: 944
In this code i have a datagridview and the datasource of the datagridview is a bindingsource. When i insert a item in my datagridview it is possible to add it 2 times so i get duplicate items in the bindingsource.
How can i prevent duplicate items in my bindingsource?"
this is the code i use:
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);
}
}
}
Note: The data in the datagridview is hardcoded now, in the furture i will load the data in from a database.
Upvotes: 1
Views: 1372
Reputation: 621
You can use List.Contains method to check if element exists before you add it to the list.
List.Contains metohod internally uses the Equals method of the Objects already in the List, if they implements the interface IEquatable.
So, you would need to make your class GridItem to extends IEquatable.
Then, override method Equals as following (on GridItem class):
class GridItem : IEquatable<GridItem>
{
public int Ordernummer { get; set; }
public int Bonnummer { get; set; }
public int Volgnummer { get; set; }
public string Bewerking { get; set; }
//This method must return true if the current GridItem and the passed as parameter are the same
public bool Equals(GridItem gridItem)
{
//What does a GridItem to be the same than other?
//If it's just Ordernummer, as easy like:
return this.Ordernummer == gridItem.Ordernummer;
}
}
And then, on your adding method:
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);
}
}
However, if you just need to use Ordernummer property to check if element exists you can juts use:
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);
}
}
Upvotes: 1