繁体   English   中英

将DataSource设置为Datagridview后添加一行

[英]Add a Row After Setting DataSource to Datagridview

我有很多与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);

但它是不可能的,因为数据网格的数据源与列表L绑定它引发错误。 所以我的第一个问题是我怎么能这样做?

我的第二个问题是,为了做到这一点,我提出了一个解决方案来改变我的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提供格式,因为我在我的一个帖子Make Row Visible中执行了false 但是为什么在向datagrid添加行时它不起作用?

尝试使用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 - 是否存在更好的方法?

以下是在将数据绑定到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 <MyClass>();

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

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

按照步骤..

  1. 创建MyClass的ObservableCollection属性。

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

  3. 现在,只要更新集合(即添加或删除项目),DataSource就会自动更新。

创造全球化

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

Page_load或任何功能的一面

添加/删除任何函数中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<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM