Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataTable作为DataGridView绑定源-使用引用而不是值填充_C#_Oop_Datagridview - Fatal编程技术网

C# DataTable作为DataGridView绑定源-使用引用而不是值填充

C# DataTable作为DataGridView绑定源-使用引用而不是值填充,c#,oop,datagridview,C#,Oop,Datagridview,我正在努力解决中描述的问题。基本上,我需要在底层数据更改时更新DataGridView的内容 我正在尝试“使用中间数据源进行数据绑定”的方法(我列出的原始选项中的第三个)。为此,我在UI范围内创建了一个DataTable,其中包含与DataGridView相同数量的单元格。然后用相关数据填充它,并将其绑定到DGV。此数据表包含基础数据的子集,根据用户界面的要求进行布局 但是,当基础数据更改时,DataTable不会更新。我试图通过指定数据类型为“object”来确保表中填充的是引用而不是值。然而

我正在努力解决中描述的问题。基本上,我需要在底层数据更改时更新DataGridView的内容

我正在尝试“使用中间数据源进行数据绑定”的方法(我列出的原始选项中的第三个)。为此,我在UI范围内创建了一个DataTable,其中包含与DataGridView相同数量的单元格。然后用相关数据填充它,并将其绑定到DGV。此数据表包含基础数据的子集,根据用户界面的要求进行布局

但是,当基础数据更改时,DataTable不会更新。我试图通过指定数据类型为“object”来确保表中填充的是引用而不是值。然而,这似乎并不像我希望的那样有效。测试表明,数据表的内容在输入后保持不变。它们大概是价值观

举一个简单的例子,假设我有一个二乘二的DataGridView,并想用一些关于狗和房子的基本统计数据来填充它,它们构成了一个更大的对象模型的一部分。我所做的是这样的:

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事件做出响应,这不是有点违背了绑定的目的吗?