Co.*_*den 15 c# data-binding datasource datagridview currencymanager
我有很多与datagrid的数据源绑定有关的问题.我有一个DatagridView,我从列表中设置DataSource
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;
Run Code Online (Sandbox Code Playgroud)
MyClass的地方
public Class MyClass
{
public string Name {get; set;}
public string LastName {get; set;}
public decimal Id {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
现在想要添加一个新的行到我的DataGridView
DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone();
row.Cells[0].Value = "XYZ";
row.Cells[1].Value = 50.2;
Mydgv.Rows.Add(row);
Run Code Online (Sandbox Code Playgroud)
但它是不可能的,因为它引发错误的数据源的DataGrid与列表绑定里.所以我的第一个问题是我怎么能这样做?
我的第二个问题是,为了做到这一点,我提出了一个解决方案来改变我的List li并向其添加新行数据,然后将其设置为datagrid的数据源,但我认为它不是一个可行的解决方案是否有更好的解决方案?
甚至试图通过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();
Run Code Online (Sandbox Code Playgroud)
据我所知,我暂停了DataGrid的Binding以向Grid提供格式,因为我在我的帖子Make Row Visible中执行了false.但是为什么在向datagrid添加行时它不起作用?
Lar*_*ech 17
尝试使用BindingList而不是List:
BindingList<MyClass> li = new BindingList<MyClass>();
Run Code Online (Sandbox Code Playgroud)
然后从列表中添加或删除记录:
li.Add(new MyClass() { Id = 15, LastName = "Z", Name = "Agent" });
Run Code Online (Sandbox Code Playgroud)
并且网格将自动显示该新行.
要使各个属性更新自动出现在网格中,那么您的类需要实现INotifyPropertyChanged接口:
public class MyClass : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的财产必须提出这个事件:
private string lastName = string.Empty;
public string LastName {
get { return lastName; }
set {
if (value != lastName) {
lastName = value;
OnPropertyChanged("LastName");
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您从代码更新行,网格将显示该更新:
li[1].LastName = "Q";
Run Code Online (Sandbox Code Playgroud)
另请参阅实现INotifyPropertyChanged - 是否存在更好的方法?
| 归档时间: |
|
| 查看次数: |
20030 次 |
| 最近记录: |