4

背景: 您有一个带有两个文本框的表单。每个文本框都绑定到类型化数据集中的同一字段。

使用视觉工作室设计器绑定每个文本框的 Text 属性。这就是 InitializeComponent() 方法中生成的代码的样子...

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.testDataSet1, "TestTable.TestID", true));

到目前为止非常基本。现在,您添加一个按钮,其单击事件会向键入的数据集添加一行。执行此操作时,两个数据绑定文本框将显示第一行。这是简单的点击事件的样子。

private void button1_Click(object sender, EventArgs e)
    {
        this.testDataSet1.TestTable.AddTestTableRow(nTestID++, "Test" + nTestID.ToString());
    }

好的,知道我们想在数据集行之间移动数据绑定字段。为此,我们只需创建一个 BindingManagerBase 对象并获取存在于 Forms BindingContext 属性中的 BindingManagerBase 对象。

private BindingManagerBase currentMgr = null;

在表单构造函数中,您执行以下操作

this.currentMgr = this.bc[this.testDataSet1, "TestTable"];

然后在代码的其他地方我们可以使用 currentMgr 移动到下一条记录。

this.currentMgr.Position++;

是的,这都是基本的!

问题:现在对于我不理解的部分,可以使用帮助...

假设您希望能够让其中一个文本框显示与 DataSet 不同的行。啊,这应该很容易。

创建一个新的 BindingContext,然后将第一个文本框的 BindingContext 属性分配给这个新的 BindingContext。然后获取这个新的 BindingContext 中存在的 BindingManagerBase 对象,并使用它来导航行。

问题是当您创建一个新的 BindingContext 并将其分配给文本框 BindingContext 属性,然后将数据加载到 DataSet 中时,文本框会显示文本System.Data.DataRowView

这是代码的样子,非常简单..

    private BindingContext bc;
    private BindingManagerBase currentMgr = null;
    private BindingManagerBase currentMgr2 = null;

    public Form1()
    {
        InitializeComponent();

        this.bc = new BindingContext();
        this.textBox1.BindingContext = this.bc;

        this.currentMgr = this.BindingContext[this.testDataSet1, "TestTable"];
        this.currentMgr2 = this.bc[this.testDataSet1, "TestTable"];
    }

当我调试此代码并查看this.BindingContext[this.testDataSet1,"TestTable"](这是表单的绑定上下文)和this.bc[this.testDataSet1,"TestTable"]时,它们都返回一个 RelatedCurrencyManager 对象。

如果这两个绑定上下文都返回相似(显然不相同)的 RelatedCurrencyManager 对象,为什么绑定到新 BindingContext 的文本框显示文本System.Data.DataRowView而从不显示数据集中的数据?

我在调试器中多次查看了每个 RelatedCurrencyManager 对象,看看我是否可以判断一个属性是否与另一个 RelatedCurrencyManager 对象不同,但一切看起来都一样:-(。

我知道表单 BindingContext 的创建和初始化时间与我的新 BindingContext 不同,我认为这就是我的问题,但我无法确定这个问题。

任何见解将不胜感激!

谢谢,

4

0 回答 0