将 DataSource 设置为 Datagridview 后添加一行

Posted

技术标签:

【中文标题】将 DataSource 设置为 Datagridview 后添加一行【英文标题】:Add a Row After Setting DataSource to Datagridview 【发布时间】:2013-12-24 17:00:15 【问题描述】:

我有很多与数据网格的数据源绑定相关的问题。我有一个 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的Datasource与Listli绑定。 所以我的第一个问题是我怎么能做到这一点?

我的第二个问题是, 为此,我制定了一个解决方案来更改我的 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 的绑定以向 Grid 提供格式,正如我在我的一篇帖子 Make Row Visible false 中执行的那样。 但是为什么在这里向数据网格添加行不起作用?

【问题讨论】:

【参考方案1】:

尝试使用 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?

【讨论】:

【参考方案2】:

这里是数据源绑定DataGridView后向数据源添加行的解决方案。

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

我也使用了与您的问题相同的“MyClass”。

在表单中放一个名为“button1”的Button并编写这段代码

    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();

为了更容易理解,我将 ID 设置为 10 到 100 之间的随机数。

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

【讨论】:

我建议的解决方案是将新行添加到现有的绑定 DataGridView。如果您想解决与此相关的任何其他问题,请告诉我。我没有从你的问题中得到你的全部要求,除了我回答的那个。 您所做的是通过更新列表从列表中更新 DataGridView,但我想通过手动将行添加到数据网格来更新我的 datgrid 而不是从更新列表中。 这两种方式有什么区别。无论如何,即使在数据绑定完成之后,您也想向数据网格添加新行。一旦控件被数据绑定,您就无法更新其视图。为此,需要更改其源数据。 是的,这是我的问题,我想手动更新我的视图以不更改其数据源.. 是否有任何方法可以暂停数据源的绑定 但是如果没有数据源,您将如何在网格中显示值?【参考方案3】:

按照这些步骤..

    创建 MyClass 的 ObservableCollection 的属性。

    private ObservableCollection<MyClass> _li;
    
    public ObservableCollection<MyClass> Li
    
        get; 
        set
        
            _li = value;
            NotifyPropertyChangedEvent("Li");      
        
    
    

    将 DataGrid 数据源绑定到 XAML 文件中的“Li”属性。

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

【讨论】:

【参考方案4】:

创建全局

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

Page_load 或任何函数的外部

在任何函数内添加/删除任何行,并在更改 li 中的数据时调用以下行

gridview.DataSource=li;
gridview.DataBind();

【讨论】:

【参考方案5】:

@Co.亚丁

根据我所见,您在将列表绑定到网格作为数据源的第一部分中所做的一切都很好。提供数据源后错过调用databind方法的execpet。

调用 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>

【讨论】:

以上是关于将 DataSource 设置为 Datagridview 后添加一行的主要内容,如果未能解决你的问题,请参考以下文章

怎么在vb中让datagrid控件中的内容一开始不显示,查询的时候才显示啊

关于c# winform datagrid的列宽如何设置为自动适应内容宽度? 在网上找到的这段代码

请问如何把DataGrid上的datasource转换成datatable或者dataset啊

我想用C#中的datagrid控件做一个删除行(点击按钮删除datagrid中的所指定的任意一行)

C#winform datagridivew 中 知道行号 如何获得一行全部数据

如何将图像设置为 DataGrid 标题背景?