C# DataTable作为DataGridView绑定源-使用引用而不是值填充
我正在努力解决中描述的问题。基本上,我需要在底层数据更改时更新DataGridView的内容 我正在尝试“使用中间数据源进行数据绑定”的方法(我列出的原始选项中的第三个)。为此,我在UI范围内创建了一个DataTable,其中包含与DataGridView相同数量的单元格。然后用相关数据填充它,并将其绑定到DGV。此数据表包含基础数据的子集,根据用户界面的要求进行布局 但是,当基础数据更改时,DataTable不会更新。我试图通过指定数据类型为“object”来确保表中填充的是引用而不是值。然而,这似乎并不像我希望的那样有效。测试表明,数据表的内容在输入后保持不变。它们大概是价值观 举一个简单的例子,假设我有一个二乘二的DataGridView,并想用一些关于狗和房子的基本统计数据来填充它,它们构成了一个更大的对象模型的一部分。我所做的是这样的:C# DataTable作为DataGridView绑定源-使用引用而不是值填充,c#,oop,datagridview,C#,Oop,Datagridview,我正在努力解决中描述的问题。基本上,我需要在底层数据更改时更新DataGridView的内容 我正在尝试“使用中间数据源进行数据绑定”的方法(我列出的原始选项中的第三个)。为此,我在UI范围内创建了一个DataTable,其中包含与DataGridView相同数量的单元格。然后用相关数据填充它,并将其绑定到DGV。此数据表包含基础数据的子集,根据用户界面的要求进行布局 但是,当基础数据更改时,DataTable不会更新。我试图通过指定数据类型为“object”来确保表中填充的是引用而不是值。然而
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 dgvContents;
房子这房子=新房子;
Dog thisDog=新狗();
InitObjects();
CreateDataTable();
私有void InitObjects(){
这所房子。建成年份=1970年;
This house.ispaint=真;
thisDog.Name=“Spot”;
这只狗。年龄=3岁;
}
私有void CreateDataTable(){
dgvContents=populateDataTable();
BindingSource SBind=新的BindingSource();
SBind.DataSource=dgvContents;
dataGridView1.DataSource=SBind;
}
专用数据表PopulatedDataTable(){
DataTable thisTable=新的DataTable(“UITable”);
int cols=2;
int行=2;
for(int i=0;i
只有当我正在创建的数据表(
dgvContents
)包含引用而不是值时,此方法才可行。这可能吗?在DataGridView变量tbl=(DataTable)dgvContents.DataSource中强制转换数据源;我认为这是没有道理的。dgvContents已经是一个DataTable,并且没有DataSource属性。我猜您的意思可能是var tbl=(DataTable)dataGridView1.DataSource,但我不明白创建“tbl”后我会做什么。也许您需要我做什么。我突然想到了这一点。但是,如果我必须对PropertyChanged事件做出响应,这不是有点违背了绑定的目的吗?