Add a Row After Setting DataSource to Datagridview
c#, currencymanager, data-binding, datagridview, datasource
Solution
Try using a BindingList instead of List:
BindingList<MyClass> li = new BindingList<MyClass>();
Then you add or delete records from the list itself:
li.Add(new MyClass() { Id = 15, LastName = "Z", Name = "Agent" });
and the grid will automatically show that new row.
To have the individual property updates automatically appear in the grid, then your class needs to implement the INotifyPropertyChanged interface:
public class MyClass : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
and then your property would have to raise the event:
private string lastName = string.Empty;
public string LastName {
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
OnPropertyChanged("LastName");
}
}
}
Now if you update a row from code, the grid will show that update:
li[1].LastName = "Q";
Also see Implementing INotifyPropertyChanged - does a better way exist?
Problem
I had lots of questions related to datasource binding of datagrid. I had a DatagridView to which I am setting DataSource from a list ``` List<Myclass> li = new List<MyClass>(); MyClass O = new MyClass(); O.Name = "Aden"; O.LastName = "B"; O.Id = 12; li.Add(O); O = new MyClass(); O.Name = "Li"; O.LastName = "S"; O.Id = 22; li.Add(O); Mydgv.DataSource = li; ``` Where MyClass is ``` public Class MyClass { public string Name {get; set;} public string LastName {get; set;} public decimal Id {get; set;} } ``` Now Want to add a new Row to My DataGridView ``` DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); row.Cells[0].Value = "XYZ"; row.Cells[1].Value = 50.2; Mydgv.Rows.Add(row); ``` But it is not possible it raise error because Datasource of Datagrid is Binded with List li. So My first question is how could I do this? My second question is, For doing this I made a solution to alter my List li and Add New row of data to it and then set it to datasource of datagrid but I think its not a feasible solution is there any better solution? Even tried to do it by CurrencyManager ``` CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource]; currencyManager1.SuspendBinding(); DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); row.Cells[0].Value = "XYZ"; row.Cells[1].Value = 50.2; Mydgv.Rows.Add(row); currencyManager1.ResumeBinding(); ``` As I know through it I suspended Binding of DataGrid to provide formatting to Grid as I performed in one of my post Make Row Visible false. But why it doesn't work here in adding row to datagrid?