Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# C从BindingSource刷新文本框_C#_Textbox_Bindingsource - Fatal编程技术网

C# C从BindingSource刷新文本框

C# C从BindingSource刷新文本框,c#,textbox,bindingsource,C#,Textbox,Bindingsource,刷新使用BindingSource对象的windows窗体控件时遇到困难。我们有一个CAB/MVP/SCSF客户端,我实际上是“我们”,因为它是一个团队正在开发的,将与远程服务器上运行的WCF服务交互。这是我们第一次尝试,所以我们处于学习模式。演示者对服务的其中一个调用返回一个数据集,该数据集包含3个数据表,分别名为“合同”、“贷款”和“条款”。每个表只包含一行。当服务返回数据集时,我们通过调用视图中名为BindData的函数并将数据集从presenter类传递到视图,将其存储在类成员变量的Sm

刷新使用BindingSource对象的windows窗体控件时遇到困难。我们有一个CAB/MVP/SCSF客户端,我实际上是“我们”,因为它是一个团队正在开发的,将与远程服务器上运行的WCF服务交互。这是我们第一次尝试,所以我们处于学习模式。演示者对服务的其中一个调用返回一个数据集,该数据集包含3个数据表,分别名为“合同”、“贷款”和“条款”。每个表只包含一行。当服务返回数据集时,我们通过调用视图中名为BindData的函数并将数据集从presenter类传递到视图,将其存储在类成员变量的SmartPart/View中

private System.Data.DataSet _ds = null;
public void BindData(System.Data.DataSet ds)
{
    string sErr = "";
    try
    {
        _ds = ds;  // save to private member variable

        // more code goes down here
    }
}
我们试图将三个数据表分别绑定到Windows窗体文本框、MaskeDeditBox和Infrastics UltraComboEditor下拉组合框。我们创建了三个BindingSource对象,每个数据表使用VS2008 IDE一个

private System.Windows.Forms.BindingSource bindsrcContract;
private System.Windows.Forms.BindingSource bindsrcLoan;
private System.Windows.Forms.BindingSource bindsrcTerms;
我们是这样绑定值的

if (bindsrcContract.DataSource == null)
{
    bindsrcContract.DataSource = _ds;
    bindsrcContract.DataMember = “contract”;

    txtContract.DataBindings.Add(new Binding("Text", bindsrcContract, "contract_id", true));                       

    txtLateFeeAmt.DataBindings.Add(new Binding("Text", bindsrcContract, "fee_code", true));

    txtPrePayPenalty.DataBindings.Add(new Binding("Text", bindsrcContract, "prepay_penalty", true));

    txtLateFeeDays.DataBindings.Add(new Binding("Text", bindsrcContract, "late_days", true));
}

if (bindsrcLoan.DataSource == null)
{
    bindsrcLoan.DataSource = _ds;
    bindsrcLoan.DataMember = “loan”;

    mskRecvDate.DataBindings.Add(new Binding("Text", bindsrcLoan, "receive_date", true));

    cmboDocsRcvd.DataBindings.Add(new Binding("Value", bindsrcLoan, "docs", true));     
}
当我们从服务中进行第一次读取并获得一个数据集时,这就起作用了。信息显示在表单的控件上,我们可以使用表单更新它,然后通过将更改的值传递回WCF服务来“保存”它

这是我们的问题。如果我们选择一个不同的loan key并对服务进行相同的调用并获得一个新的数据集,同样有3个表,每个表有一行,则控件文本框、屏蔽编辑框等不会用新信息更新。请注意,smartPart/View未关闭或任何内容,但在调用服务之间仍保持加载状态。在第二个调用中,我们不是重新绑定调用,而是简单地尝试从更新的数据集中获取要刷新的数据

我们已经尝试了我们能想到的一切,但显然我们错过了一些东西。这是我们第一次尝试使用BindingSource控件。我们已经试过了

bindsrcContract.ResetBindings(false);

我们已经看了很多例子。许多示例都引用BindingNavigator,但由于DataTables只有一行,因此我们认为不需要它。网格有很多例子,但我们这里不使用。有谁能指出我们哪里出了问题,或者向我们指出可以提供更多信息的资源

我们使用的是VisualStudio2008、C和.NET2.0、XP客户端、W2K3服务器

提前谢谢


wes

如果所有其他操作都失败,您可以在每次收到新数据集时重新分配数据源,执行以下操作:

bindsrcContract.DataSource = typeof(System.Data.DataSet);
bindsrcContract.DataSource = _ds;

另外,先初始化DataMember,然后初始化DataSource将为您提供更好的性能。

Wes,我很高兴能为您提供帮助。我仍然记得一个和你的问题非常相似的问题,我花了几个星期在野外想清楚

关于你的问题,以下是我所知道的:

如果先设置数据源,然后设置DataMember,则数据源将被扫描两次,因为设置DataMember会更改现有的有效绑定。如果您使用另一种方法,首先在DataSource为null或更好的情况下设置DataMember,typeofYourData,则在设置DataSource时绑定只发生一次

我认为你可以在这里应用同样的解决方案。而不仅仅是

bindsrcContract.DataSource = _ds;
在你的最后一行,你应该写

bindsrcContract.DataSource = typeof(System.Data.DataSet);
bindsrcContract.DataSource = _ds;
很抱歉让您失望,但我从MSDN以及反复试验中学到了关于数据绑定的所有知识。这是相当痛苦的。希望其他人能提供一两个有用的链接

第一件事:这篇文章需要一些组织。请记住,答案不是按顺序排列的。顺序由投票决定

因此,如果您有其他问题,只需使用“编辑”修改原始问号,以避免混淆

向上投票你认为有用的答案

哦,顺便说一下,当包含代码示例时,请使用编辑窗口上方的代码示例按钮。这将为您提供良好的代码格式,包括语法高亮显示

现在来看要点:这两个问题的根本问题是绑定管理器保留了到原始对象的链接

当您将_ds指定为数据源时,绑定管理器将分析数据集并相应地执行操作。如果将其他数据集分配给_ds,则绑定管理器无法知道这一点。它仍然具有原始数据集对象上的引用。因此,这解释了为什么必须将DataSource属性重置为新的DataSet

它还解释了为什么删除和添加表不会产生预期的结果。同样,绑定管理器保存对旧表或该表中第一行的引用。这张新桌子从不装订。同样在这种情况下,重新分配_ds也没有帮助,因为_ds指向与以前相同的DataSet对象。绑定管理器足够聪明,可以注意到它是同一个对象,并且不执行重新绑定操作

你要么修改t 触发绑定管理器订阅的PropertyChanged事件的绑定对象的内容,或者您必须通过向DataSource属性分配不同的对象来触发完全重新绑定


这是对实际发生情况的简化描述,但我希望它足以解释和解决您的问题。不幸的是,我还没有在网上或其他地方找到关于WinForms数据绑定的全面解释。

我今天遇到了类似的问题,发现这是可行的

private void btnCancel_Click(object sender, EventArgs e)
{
    this.MyTable.RejectChanges();
    this.txtMyBoundTextBox.DataBindings[0].ReadValue();
    this.EditState = EditStates.NotEditting;
}
尝试组合:

bindingsource.EndEdit() // writting data to underlying source 
bindingSource.ResetBindings(false)  // force controls to reread data from bindingSource

每当您向控件写入内容时,请使用此选项。

t谢谢您的有益解释。顺便说一句,在重新注册信誉点后,OP不能在11或1点上投票;
bindsrcContract.DataSource = _ds;
bindsrcContract.DataSource = typeof(System.Data.DataSet);
bindsrcContract.DataSource = _ds;
private void btnCancel_Click(object sender, EventArgs e)
{
    this.MyTable.RejectChanges();
    this.txtMyBoundTextBox.DataBindings[0].ReadValue();
    this.EditState = EditStates.NotEditting;
}
bindingsource.EndEdit() // writting data to underlying source 
bindingSource.ResetBindings(false)  // force controls to reread data from bindingSource