c# - 为什么当我对行进行更改时 DataRowState 显示已添加而不是已修改?

标签 c# winforms data-binding

我的程序显示一个带有一些数据的简单数据 GridView :

enter image description here

用户(我)可以更改数据(注意第一行):

enter image description here

当我查看程序中的数据源时,我可以看到更改后的值:

enter image description here

但是,DataRowState 是 Added 而不是 Modified。怎么会这样?数据显然发生了变化,但 DataRowState 并未反射(reflect)这一点:

enter image description here

对于我的生活,我无法弄清楚为什么 DataRowState 在数据源中的每一行上显示 Added。以下是我的程序的完整列表:

using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;

namespace DataBindingTest
{
    using System.ComponentModel;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // Create some people and a list to hold them.
            var personA = new Person { Name = "Kevin", Address = "140 Holiday Drive" };
            var personB = new Person { Name = "Donna", Address = "123 Somestreet" };
            var personC = new Person { Name = "Mark", Address = "145 Uptown Blvd" };
            var personD = new Person { Name = "Bryce", Address = "504 Greymere Road" };
            var personE = new Person { Name = "Parzival", Address = "99A Housing Brad St" };
            var people = new List<Person> { personA, personB, personC, personD, personE };

            //// Make a datatable to hold the people

            var tblPeople = new DataTable();
            tblPeople.Columns.Add("Name");
            tblPeople.Columns.Add("Address");

            foreach (var person in people)
            {
                tblPeople.Rows.Add(person.Name, person.Address);
            }

            // Set binding source to the table
            bindingSource1 = new BindingSource();
            bindingSource1.DataSource = tblPeople;
            dataGridView1.DataSource = bindingSource1;
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            // Get only the changed rows
            // (The line below is where the null reference error is occuring because rowstate never == Modified)
            var changedRows = ((DataTable)bindingSource1.DataSource).GetChanges(DataRowState.Modified).Rows;
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public string Address { get; set; }
    }
}

最佳答案

当您在构造函数中添加行时,所有行的状态都是“已添加”。当你修改第一个的时候,还是Added,那是正常的。您只需要接受数据表中的更改,一切都在运行:

   public Form1()
    {
        InitializeComponent();

        // Create some people and a list to hold them.
        var personA = new Person { Name = "Kevin", Address = "140 Holiday Drive" };
        var personB = new Person { Name = "Donna", Address = "123 Somestreet" };
        var personC = new Person { Name = "Mark", Address = "145 Uptown Blvd" };
        var personD = new Person { Name = "Bryce", Address = "504 Greymere Road" };
        var personE = new Person { Name = "Parzival", Address = "99A Housing Brad St" };
        var people = new List<Person> { personA, personB, personC, personD, personE };

        //// Make a datatable to hold the people

        var tblPeople = new DataTable();
        tblPeople.Columns.Add("Name");
        tblPeople.Columns.Add("Address");

        foreach (var person in people)
        {
            tblPeople.Rows.Add(person.Name, person.Address);
        }

        // this line sets the state of the added rows to 'unchanged', 
        // so when you modify one row it becomes'modified'
        tblPeople.AcceptChanges();

        // Set binding source to the table
        bindingSource1 = new BindingSource();
        bindingSource1.DataSource = tblPeople;
        dataGridView1.DataSource = bindingSource1;
    }

希望对你有帮助。

关于c# - 为什么当我对行进行更改时 DataRowState 显示已添加而不是已修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25066507/

相关文章:

c# - 手动注册所有类(class)还是有自动方式?

c# - Windows 7 中的 ServiceController 权限

c# - 为什么 Winforms 中有所有不同的集合?

c# - 需要强制 Windows 窗体应用程序在启动时运行

wpf - 需要使用 LINQ 将对象绑定(bind)到列表框的 WPF 简单示例

c# - 报错不能在静态类中声明实例成员

c# - AutoMapper:使用 MemberList.Source 找到了未映射的成员

c# - FileHelpers 在字段中编写带有换行符的 CSV

c# - 自定义控件内部属性的 ASP.Net 绑定(bind)属性

c# - 使用带有 ASP.net 数据控件的 POCO 时实现排序/页面功能