将DataSource设置为Datagridview后添加一行
我有很多与datagrid的数据源绑定有关的问题。 我有一个DatagridView,我从列表中设置DataSource
List li = new List(); 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;
MyClass的地方
public Class MyClass { public string Name {get; set;} public string LastName {get; set;} public decimal Id {get; set;} }
现在想要添加一个新的行到我的DataGridView
DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); row.Cells[0].Value = "XYZ"; row.Cells[1].Value = 50.2; Mydgv.Rows.Add(row);
但是它不可能引发错误,因为Datagrid的数据源与List li绑定。 所以我的第一个问题是我怎么能这样做?
我的第二个问题是,为了做到这一点,我提出了一个解决方案来改变我的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();
据我所知,我暂停了DataGrid的Binding以向Grid提供格式,因为我在我的一个postMake Row Visible中执行了false 。 但是为什么在向datagrid添加行时它不起作用?
尝试使用BindingList而不是List:
BindingList li = new BindingList ();
然后从列表中添加或删除记录:
li.Add(new MyClass() { Id = 15, LastName = "Z", Name = "Agent" });
并且网格将自动显示该新行。
要使各个属性更新自动出现在网格中,那么您的类需要实现INotifyPropertyChanged接口:
public class MyClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
然后你的财产必须提出这个事件:
private string lastName = string.Empty; public string LastName { get { return lastName; } set { if (value != lastName) { lastName = value; OnPropertyChanged("LastName"); } } }
现在,如果您从代码更新行,网格将显示该更新:
li[1].LastName = "Q";
另请参阅实现INotifyPropertyChanged – 是否存在更好的方法?
以下是在将数据绑定到DataGridView之后向数据源添加行的解决方案。
请注意,我在表单中使用了空白DataGridView“Mydgv”和Button“button1”。
我也从你的问题中使用了相同的“MyClass”。
在表单中放入一个名为“button1”的按钮并编写此代码
private void button1_Click(object sender, EventArgs e) { List li = (List )Mydgv.DataSource; MyClass O = new MyClass(); O.Name = "XYZ"; O.LastName = "G"; O.Id = new Random().Next(10, 100); li.Add(O); Mydgv.DataSource = li.ToList (); }
单击按钮,您可以看到DataGridView已使用新行更新。
而不是像DataSource一样设置相同的List对象,尝试MyClass列表,如下所述。
Mydgv.DataSource = li.ToList
为了便于理解,我将Id作为随机数介于10和100之间。
希望您检查一下,如果代码有任何问题,请回复我。
按照步骤..
-
创建MyClass的ObservableCollection属性。
private ObservableCollection
_li; public ObservableCollection Li { get; set { _li = value; NotifyPropertyChangedEvent("Li"); } } -
将DataGrid DataSource绑定到XAML文件中的“Li”属性。
-
现在,只要更新集合(即添加或删除项目),DataSource就会自动更新。
创造全球化
List li = new List ();
Page_load或任何function的一面
在任何函数中添加/删除li中的任何行,并在li中更改数据时调用下面的行
gridview.DataSource=li; gridview.DataBind();
@Co。 亚丁
根据我所看到的,你在将列表绑定到网格的第一部分中所做的一切都是好的。 在提供数据源之后,您错过了调用数据绑定方法的Execpet。
一旦调用DataBind方法,细节应按照您的预期显示在网格上。
Mydgv.DataBind();
参考样本:
C#:
public partial class home : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List students = new List (); for (int i = 0; i < 10; i++) { students.Add(new Student(){FirstName = "First Name - " +i.ToString(),LastName = "Last Name - "+i.ToString()}); } students.Add(new Student() { FirstName = " ", LastName = " " }); UsingDataSourceAndDataBind(students); } private void UsingDataSourceAndDataBind(List students) { GridView1.DataSource = students; GridView1.DataBind(); } } class Student { public string FirstName { get; set; } public string LastName { get; set; } }
ASPX代码: