C# 如何将Linq2SQL集合数据绑定到winform textfields

C# 如何将Linq2SQL集合数据绑定到winform textfields,c#,winforms,linq-to-sql,data-binding,C#,Winforms,Linq To Sql,Data Binding,对于如何通过使用数据绑定来优化我的程序,我有点困惑。我的程序使用几个Linq2SQL绑定的对象来存储数据。所有ORM对象都存储在一个层次结构中。在第二个GUI项目中,我在一些文本和组合框字段中显示这些数据 数据结构层次结构如下所示: JobManager包含一个作业字典 每个作业都包含一个Jobitems 每个Jobitem只包含一篇文章 Job、Jobitem和Article都是Linq2SQL对象,表示ORM 现在我有了一个GUI,它有两个列表视图和一个选项卡窗格。选项卡窗格显示作业、作

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

数据结构层次结构如下所示:

  • JobManager
    包含一个
    作业字典
  • 每个作业都包含一个
    Jobitems
  • 每个Jobitem只包含一篇
    文章
Job
Jobitem
Article
都是Linq2SQL对象,表示ORM

现在我有了一个GUI,它有两个列表视图和一个选项卡窗格。选项卡窗格显示作业、作业项和项目的属性,并提供修改作业和作业项的可能性。GUI的行为应如下所示:

  • 当在第一个列表视图中选择一个
    作业
    时,相关的作业项将显示在第二个列表视图中,有关该作业的详细信息将显示在选项卡窗格中
  • 当在第二个列表视图中选择了
    Jobitem
    时,选项卡窗格中会显示Jobitem详细信息和文章详细信息,但只有Jobitem信息是可编辑的
  • 更改完成后,用户必须有意保存这些更改。否则,应放弃更改,而不同步到数据库
  • 如何通过数据绑定实现这种行为

    特别是,我是否可以将一个完整的集合绑定到一个文本字段,然后在ListView中的选择所指示的位置之间切换?还是我必须为用户进行的每项选择在每个作业的基础上添加和删除单独的数据绑定?

    你真的是指“字典”吗?Winform绑定适用于列表(
    IList
    /
    IListSource
    ),但不适用于字典。此外,
    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");
    

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

    首先,感谢您详尽的回答!我不知道它不能与字典一起工作,但遗憾的是,字典是我从现有设计中得到的。不过,我可以将它们转换为临时列表,一旦用户点击“保存”,它们就可以被转移回字典中,以将更改存储在数据库中。这也解决了我的第三点。文本字段呢?如何为单个作业的“名称”绑定文本文件?一旦有完整的作业列表作为数据源,或者每次都有具体的作业在手?这样我就可以通过使用例如this.BindingContext[custs,“ContactName”]。Position在文本字段中显示单个作业?我不完全理解这个问题;但是“custs”的“currency manager”将固定到所选的自定义项上;如果您想要一个特定的客户,只需直接在绑定源中使用该客户实例…请回复您的评论-我将添加一些文本字段。。。