【问题标题】:Adding data to DataSource from UI with BindingSource使用 BindingSource 从 UI 向 DataSource 添加数据
【发布时间】:2015-08-07 20:59:53
【问题描述】:

我有一个包含网格的表单 (Form1),通过 BindingSource 绑定到 DataSource。

然后我有一个按钮,点击后会打开另一个表单 (Form2),让用户输入新数据。

我将 BindingSource 从 Form1 传递到 Form2,目标是一旦用户将他的输入“保存”在 Form2 中,它就会自动添加到 Form1。

有没有办法做到这一点,无需直接访问 UI 控件?

IE -

public partial class Form2 : Form
{
    BindingSource bs = new BindingSource();
    public Form2(BindingSource bindingSourceFromForm1)
            {
                InitializeComponent();
                this.bs = bindingSourceFromForm1;
            }    
    private void button1_Click(object sender, EventArgs e)
            {
                DataRow dr = (this.bs.DataSource as DataTable).NewRow();
                dr["Col1"] = this.textBox1.Text;
                dr["Col2"] = this.textBox2.Text;
                this.bs.Add(dr);
            }
}

有没有办法将 Form2 上的控件(在上面的示例中为 textBox1/2)绑定到 BindingSource,然后让它自动添加 textBox1 和 2 中的值?

类似于调用this.bs.Add(),其中Add() 知道在哪里获取它的值,而无需我明确告诉它转到文本框,因为它已绑定到上述控件?

谢谢!

【问题讨论】:

    标签: c# .net winforms ado.net bindingsource


    【解决方案1】:

    如果您像往常一样将BindingSource 添加到表单设计器,请将DataSource 设置为相同的源,以便您可以绑定文本框。

    在专用构造函数中,以下代码将新记录添加到 form1 的 DataSource,将 DataSource 分配给此表单的 BindingeSource 实例的 DataSource 并设置位置。您的新表单将使用户能够在该新对象中输入值。

    public Form2(BindingSource bindingSourceFromForm1)
        : this()
    {
        bindingSourceFromForm1.AddNew();
        this.bindingSource1.DataSource = bindingSourceFromForm1.DataSource;
        this.bindingSource1.Position = bindingSourceFromForm1.Position;
    }
    

    如果您的用户可以取消操作,您必须通过在 bindingSourceFromForm1 上调用 RemoveCurrent 来补偿该操作,但我将其保留为练习,因为不清楚您是否想要/需要它。

    【讨论】:

    • 但是 AddNew() 从哪里获取值?它如何隐含地知道第 1 列映射到文本框 1(正如我在示例中明确所做的那样)?它是通过 BindingSource 绑定到相关字段来实现的吗?因为调用 AddNew() 似乎会创建一个空行,即使我将文本框绑定到 DataSource 字段
    • 我明白了,那么,你写的代码和我写的代码有什么区别?您在构造函数中创建了一个新行,我在用户单击按钮时创建了它。我是否遗漏了任何其他区别?
    • 是的,绑定是表单上的设计时,可用于使用设计器设置/更改控件的映射,绑定时自动类型转换,多个表单/控件上的同步值,每个表单都有一个 BindingNavigator 的可能性。所以我看到了几个优点。但是,如果我错过了问题的重要部分,您可能需要稍微澄清一下问题。
    • 但是你提到的事情也发生在我在原始帖子中发布的代码中......不是吗?我仍然想了解你和我之间的区别,我想我误解了你......我问题的主要部分是我是否有办法通过 BindingSource 访问绑定控件,而无需访问他们直接(textBox1.Text),你说我不能。
    • 不同之处在于您在代码中创建了一个新的BindingSource 实例。该控件没有与任何控件的任何绑定,因为这是在 form.designer.cs 代码中设置的。 bindimgsource 不知道它是有界的(至少不是公开的)。控件确实通过检查其DataBindings 集合知道它的绑定位置,如果需要,您还可以在其中Add 绑定。
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多