将DataSource设置为Datagridview后添加一行

时间:2013-12-07 08:08:25

标签: c# data-binding datagridview datasource 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;

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的绑定,以便在我的帖子Make Row Visible false中执行时为Grid提供格式。 但是为什么在向datagrid添加行时它不起作用?

5 个答案:

答案 0 :(得分:16)

尝试使用BindingList而不是List:

BindingList<MyClass> li = new BindingList<MyClass>();

然后您从列表中添加或删除记录:

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";

另见Implementing INotifyPropertyChanged - does a better way exist?

答案 1 :(得分:2)

以下是在将数据绑定到DataGridView之后向数据源添加行的解决方案。

请注意,我在表单中使用了空白DataGridView“Mydgv”和Button“button1”。

我也从你的问题中使用了相同的“MyClass”。

在表单中放入一个名为“button1”的按钮并编写此代码

    private void button1_Click(object sender, EventArgs e)
    {
        List<MyClass> li = (List<MyClass>)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<MyClass>();
    }

单击按钮,您可以看到DataGridView已使用新行更新。

不要像DataSource那样设置相同的List对象,而是尝试MyClass列表,如下所述。

Mydgv.DataSource = li.ToList&lt; MyClass&gt;();

为了便于理解,我将Id作为10到100之间的随机数。

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

答案 2 :(得分:0)

按照步骤......

  1. 创建MyClass的ObservableCollection属性。

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

  3. 现在每当更新集合(即添加或删除项目)时,DataSource都会自动更新。

答案 3 :(得分:0)

创建全局

List<Myclass> li = new List<MyClass>();

Page_load或任何功能

的外侧

添加/删除任何函数中li的任何行,并在更改li

中的数据时调用以下行
gridview.DataSource=li;
gridview.DataBind();

答案 4 :(得分:0)

@Co。亚丁

根据我所看到的,您在将列表绑定到网格的第一部分中所做的一切都是正确的。在提供数据源之后,您错过了调用数据绑定方法的执行。

调用DataBind方法后,详细信息应按照您的预期显示在网格上。

Mydgv.DataBind();

参考样本:

C#:

public partial class home : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Student> students = new List<Student>();
        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<Student> students)
    {
        GridView1.DataSource = students;
        GridView1.DataBind();
    }
}

class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

ASPX代码:

<body>
<form id="form1" runat="server">
<div>
    <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>
</div>
</form>