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与 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 的绑定以向 Grid 提供格式,正如我在我的一篇文章Make Row Visible false中执行的那样。但是为什么在向数据网格中添加行时它在这里不起作用?

4

5 回答 5

18

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

另请参阅实施 INotifyPropertyChanged - 是否存在更好的方法?

于 2013-12-09T15:30:45.737 回答
2

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

请注意,我在表单中使用了空白的 DataGridView“Mydgv”和按钮“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<MyClass>();

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

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

于 2013-12-10T06:36:45.740 回答
0

@Co。亚丁

根据我看到您在将列表绑定到网格作为数据源的第一部分所做的一切都很好。提供数据源后您错过调用数据绑定方法的 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>

于 2013-12-16T09:12:44.963 回答
0

创建全局

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

在 Page_load 或任何函数之外

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

gridview.DataSource=li;
gridview.DataBind();
于 2013-12-16T05:01:51.090 回答
0

按照这些步骤..

  1. 创建 MyClass 的 ObservableCollection 的属性。

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

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

于 2013-12-15T14:41:20.617 回答