如何数据绑定Linq2SQL集合以winform文本字段

时间:2009-05-19 10:05:54

标签: c# winforms linq-to-sql data-binding

我对如何通过使用DataBindings来优化我的程序感到有点困惑。我的程序使用几个存储数据的Linq2SQL绑定对象。所有ORM对象都存储在层次结构中。在第二个GUI项目中,我在一些Text和Combo Box字段中显示这些数据。

数据结构层次结构如下:

  • JobManager包含Jobs
  • 字典
  • 每个作业都包含Jobitems
  • 字典
  • 每个Jobitem只包含一个Article

JobJobitemArticle均为Linq2SQL对象,代表ORM。

现在我有一个包含2个列表视图的GUI和一个选项卡窗格。选项卡窗格显示作业,作业项和文章的属性,并提供修改作业和作业项的可能性。 GUI应该像这样:

  1. 当在第一个ListView中选择Job时,相关的作业项目将显示在第二个ListView中,有关作业的详细信息将显示在选项卡窗格中。
  2. 当在第二个ListView中选择Jobitem时,工作项详细信息和文章详细信息将显示在选项卡窗格中,但只有Jobitem信息可以编辑。
  3. 完成更改后,用户必须有意保存。否则,应丢弃更改并且不同步到数据库。
  4. 如何使用DataBinding实现此行为?

    特别是,我可以将一个完整的集合绑定到单个TextField一次,并通过ListViews中的选择所指示的位置移动吗?或者我是否必须为每个作业添加和删除单个DataBindings以用于用户进行的每个选择?

1 个答案:

答案 0 :(得分:4)

你真的是指“词典”吗?列表(IList / IListSource)可以使用Winform绑定,但不能使用字典。此外,ListView并不像其他控件那样容易绑定。

除此之外,它应该纯粹使用映射名称 - 我将尝试做一个简单的例子......


使用Northwind的基本示例进行编辑;请注意,数据上下文理想情况下应该不会长久存在;您可能还希望查看存储库实现等内容而不是直接绑定:

using System;
using System.Windows.Forms;
using SomeNamespaceWithMyDataContext;
static class Program
{
    [STAThread]
    static void Main() {
        MyDataContext ctx = new MyDataContext();
        BindingSource custs = new BindingSource() {
            DataSource = ctx.Customers};

        BindingSource orders = new BindingSource {
            DataMember = "Orders", DataSource = custs};

        Button btn;
        using (Form form = new Form
        {
            Controls = {
                new DataGridView() {
                    DataSource = orders, DataMember = "Order_Details",
                    Dock = DockStyle.Fill},
                new ComboBox() {
                    DataSource = orders, DisplayMember = "OrderID",
                    Dock = DockStyle.Top},
                new ComboBox() {
                    DataSource = custs, DisplayMember = "CompanyName",
                    Dock = DockStyle.Top},                
                (btn = new Button() {
                    Text = "Save", Dock = DockStyle.Bottom
                }), // **edit here re textbox etc**
                new TextBox {
                    DataBindings = {{"Text", orders, "ShipAddress"}},
                    Dock = DockStyle.Bottom
                },
                new Label {
                    DataBindings = {{"Text", custs, "ContactName"}},
                    Dock = DockStyle.Top
                },
                new Label {
                    DataBindings = {{"Text", orders, "RequiredDate"}},
                    Dock = DockStyle.Bottom
                }
            }
        })
        {
            btn.Click += delegate {
                form.Text = "Saving...";
                ctx.SubmitChanges();
                form.Text = "Saved";
            };
            Application.Run(form);
        }
    }
}

暂且不说 - 请注意语法:

DataBindings = {{"Text", orders, "ShipAddress"}}

相当于:

someTextBox.DataBindings.Add("Text", orders, "ShipAddress");

(我只添加这个,因为这是一个常见的问题)