Я пытаюсь обойти проблему, описанную в этом вопросе . По сути, мне нужно обновить содержимое DataGridView при изменении базовых данных.
Я пробую подход «привязка данных с промежуточным источником данных» (номер три из первоначальных опций, которые я обрисовал в общих чертах). Для этого я создал DataTable в области пользовательского интерфейса, который содержит то же количество ячеек, что и DataGridView. Затем я заполняю его соответствующими данными и связываю с DGV. Этот DataTable содержит подмножество базовых данных, изложенных в соответствии с требованиями пользовательского интерфейса.
Однако DataTable не обновляется при изменении базовых данных. Я пытался убедиться, что таблица заполнена ссылками, а не значениями, указав, что тип данных - «объект». Однако, похоже, что это не работает, как я надеялся. Тестирование показывает, что содержимое DataTable остается неизменным после ввода. Предположительно они являются значениями.
Чтобы привести упрощенный пример, скажем, у меня есть DataGridView два на два, и я хочу заполнить его некоторой базовой статистикой c для собаки и дома, которая формирует часть гораздо большей объектной модели. То, что я делаю, выглядит примерно так:
class Dog{
string Name;
int Age;
float WeightInKG;
}
class House{
string NameOrNumber;
int YearBuilt;
bool IsPainted;
}
Инициализируйте объекты и создайте источник данных, связанный с DGV:
DataTable dgvContents;
House thisHouse = new House();
Dog thisDog = new Dog();
InitObjects();
CreateDataTable();
private void InitObjects() {
thisHouse.YearBuilt = 1970;
thisHouse.IsPainted = true;
thisDog.Name = "Spot";
thisDog.Age = 3;
}
private void CreateDataTable() {
dgvContents = populateDataTable();
BindingSource SBind = new BindingSource();
SBind.DataSource = dgvContents;
dataGridView1.DataSource = SBind;
}
private DataTable PopulateDataTable() {
DataTable thisTable = new DataTable("UITable");
int cols = 2;
int rows = 2;
for (int i = 0; i < cols; i++)
{
thisTable.Columns.Add("", typeof(object));
}
for (int j = 0; j < rows; j++)
{
thisTable.Rows.Add(new object[cols]);
}
thisTable.Rows[0][0] = thisdog.Name;
thisTable.Rows[0][1] = thisdog.Age;
thisTable.Rows[1][0] = thisHouse.IsPainted;
thisTable.Rows[1][1] = thisHouse.YearBuilt;
return thisTable;
}
Этот метод жизнеспособен, только если DataTable I Я создаю (dgvContents
) содержит ссылки, а не значения. Это возможно?