将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之间。

希望您检查一下,如果代码有任何问题,请回复我。

按照步骤..

  1. 创建MyClass的ObservableCollection属性。

     private ObservableCollection _li; public ObservableCollection Li { get; set { _li = value; NotifyPropertyChangedEvent("Li"); } } 
  2. 将DataGrid DataSource绑定到XAML文件中的“Li”属性。

  3. 现在,只要更新集合(即添加或删除项目),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代码: