【问题标题】:Databinding to a programmatically created DataTable数据绑定到以编程方式创建的 DataTable
【发布时间】:2009-01-08 18:59:53
【问题描述】:

假设我有一个这样的数据表:

        DataTable dt = new DataTable("Woot");

        dt.Columns.AddRange(new DataColumn[]{
            new DataColumn("ID",typeof(System.Guid)),
            new DataColumn("Name",typeof(String))
            });

当我尝试将控件绑定到它时:

        this.txtName.DataBindings.Add("Text", _dtRow, "Name");

我得到了这个例外:

无法绑定到属性或列 数据源上的名称。范围 名称:数据成员

知道为什么这适用于由 dataAdapter 创建的数据表,但不适用于以编程方式创建的数据表吗?

【问题讨论】:

    标签: c# data-binding ado.net


    【解决方案1】:

    好的,在弄乱了你的代码一段时间后,我一直很困惑。然后我终于意识到了这个问题。我假设_dtRow 是一个DataRow。您需要参考实际的 DataTable (dt)。

    this.textBox1.DataBindings.Add("Text", dt, "Name");
    

    编辑:在看到您对 Igor 帖子的评论后。如果你绑定到 dt,那么比如说如果你有一个 datagridview 绑定到这个 DataTable,每次你选择不同的行时,文本框都会改变。

    这是适合我的代码:

                DataTable dt = new DataTable("Woot");
    
                dt.Columns.AddRange(new DataColumn[]{
                new DataColumn("ID",typeof(System.Guid)),
                new DataColumn("Name",typeof(String))
                });
    
    
                dt.Rows.Add(Guid.NewGuid(), "John");
                dt.Rows.Add(Guid.NewGuid(), "Jack");
    
                this.dataGridView1.DataSource = dt;
    
                this.textBox1.DataBindings.Add("Text", dt, "Name");
    

    更改 DGV 中的行,您将看到文本框更改文本。

    EIDT AGAIN 好的,是时候破解它了。这就是我让它工作的方式:

    this.textBox1.DataBindings.Add("Text",_dtRow.ItemArray[1], ""); 
    

    我使用了索引 1,但您可以使用数组中所需的任何索引。

    【讨论】:

    • 绑定到表格可以防止文本框发生变化。我刚试过。
    • 我也试过了。我有你发布的代码,但我也有绑定到 DataGridView 的 DataTable。每次我更改 DataGridView 上的行时,文本框中的文本都会更改。
    • 问题是实际的 DataTable 是在一个表单中抽象出来的,而这是在一个对 DT 不可见的用户控件中,所以只是一个 CurrentRow 属性。 (别怪我,这个应用不是我设计的)。 CurrentRow.Table 绑定,但不会更新。
    【解决方案2】:

    你不应该引用 dt 而不是 _dtRow 吗?

    例如:

    this.txtName.DataBindings.Add("Text", dt, "Name");
    

    编辑:

    这段代码对我有用:

       DataTable dt = new DataTable("Woot");
    
        dt.Columns.AddRange(new DataColumn[]{
            new DataColumn("ID",typeof(System.Guid)),
            new DataColumn("Name",typeof(String))
        });
    
        DataRow r = dt.NewRow();
        r["ID"] = new Guid();
        r["Name"] = "AAA";
        dt.Rows.Add(r);
    
        r = dt.NewRow();
        r["ID"] = new Guid();
        r["Name"] = "BBB";
        dt.Rows.Add(r);
    
        dataGridView1.DataSource = dt;
    
        this.txtName.DataBindings.Add("Text", r.Table , "Name");
    

    【讨论】:

    • 不,我绑定到在数据网格中选择的单个行,而不是整个表。
    • 为什么不绑定到数据表呢?这样,如果您在表格中选择不同的行,文本属性将相应更改。我想这就是数据绑定的全部目的......
    • 回到你原来的问题,我猜异常引发的原因是因为 DataTable 实现了 IListSource 接口(它返回一个列表)而 DataRow 没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多