背景: 您有一个带有两个文本框的表单。每个文本框都绑定到类型化数据集中的同一字段。
使用视觉工作室设计器绑定每个文本框的 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 不同,我认为这就是我的问题,但我无法确定这个问题。
任何见解将不胜感激!
谢谢,