Моя программа отображает простой datagridview с некоторыми данными:
Пользователь (я) может изменять данные (обратите внимание на первую строку):
Когда я смотрю на источник данных в программе, я вижу измененное значение:
Однако DataRowState - это Added
вместо Modified
. Как это может быть? Данные явно изменились, но DataRowState этого не отражает:
Да хоть убей, я не могу понять, почему 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; }
}
}
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;
}
Я надеюсь, что это помогает.
После добавления строк в вашу таблицу вам нужно позвонить
tblPeople.AcceptChanges();
При добавлении строк в таблицу их RowState становится «добавленным». Когда вы вызываете AcceptChanges (), их RowState устанавливается в «UnChanged». Если вы затем отредактируете ячейки в строках, RowState изменится на «Modified» в соответствующих строках, и эти строки будут отображаться в ваших «changedRows» в обработчике событий.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.