Моя программа отображает простой datagridview с некоторыми данными:

enter image description here

Пользователь (я) может изменять данные (обратите внимание на первую строку):

enter image description here

Когда я смотрю на источник данных в программе, я вижу измененное значение:

enter image description here

Однако DataRowState - это Added вместо Modified. Как это может быть? Данные явно изменились, но DataRowState этого не отражает:

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; }
    }
}
1
Kevin 31 Июл 2014 в 22:37

2 ответа

Лучший ответ

Поскольку вы добавили строки в свой конструктор, все строки имеют состояние «Добавлено». Когда вы изменяете первый, он все еще добавляется, это нормально. вам нужно только принять изменения в вашей таблице данных, когда все работает:

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

Я надеюсь, что это помогает.

4
Olorin71 31 Июл 2014 в 23:16
Это очень помогло! Спасибо огромное! Я искал по всему Интернету и ни разу не видел упоминания о AcceptChanges. Еще раз спасибо!
 – 
Kevin
1 Авг 2014 в 00:04

После добавления строк в вашу таблицу вам нужно позвонить

tblPeople.AcceptChanges();

При добавлении строк в таблицу их RowState становится «добавленным». Когда вы вызываете AcceptChanges (), их RowState устанавливается в «UnChanged». Если вы затем отредактируете ячейки в строках, RowState изменится на «Modified» в соответствующих строках, и эти строки будут отображаться в ваших «changedRows» в обработчике событий.

2
Thorias 31 Июл 2014 в 23:16