如何将Linq2SQL集合数据绑定到Winform文本框

4
我有点困惑如何通过利用DataBindings来优化我的程序。我的程序使用多个Linq2SQL绑定对象存储数据。所有ORM对象都存储在层次结构中。在第二个GUI项目中,我在一些文本和组合框字段中显示这些数据。
数据结构层次结构如下:
- JobManager 包含一个 Jobs 字典 - 每个 Job 包含一个 Jobitems 字典 - 每个 Jobitem 包含一个 Article Job、Jobitem 和 Article 都是 Linq2SQL 对象,表示 ORM。
现在我有一个带有 2 个列表视图和选项卡窗格的 GUI。选项卡窗格显示作业、作业项和文章的属性,并提供修改作业和作业项的可能性。GUI 应该按以下方式运行:
- 当在第一个 ListView 中选择作业时,将显示相关作业项在第二个 ListView 中,同时在选项卡窗格中显示作业的详细信息。 - 当在第二个 ListView 中选择作业项时,将在选项卡窗格中显示作业项和文章的详细信息,但只能编辑作业项信息。 - 当进行更改时,用户必须有意保存它们。否则,更改应被丢弃并不同步到数据库。
如何使用 DataBinding 实现此行为?
特别地,我可以将完整的集合绑定到单个 TextField 上,并根据 ListViews 中的选择移动其位置吗?还是每次用户进行选择时,都必须为每个作业单独添加和删除数据绑定?

关于您的评论 - 我会添加一些文本字段... - Marc Gravell
1个回答

4
你真的是想用“字典”吗?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");

(我只是加上这个问题,因为它是一个常见的问题)
(我只是添加此内容,因为这是一个常见问题)

首先,感谢您详细的回复!我不知道它不能与字典一起使用,但是字典是我从现有设计中得到的。不过,我可以将它们转换为临时列表,然后当用户点击“保存”时,它们可以被转换回字典以将更改存储在数据库中。这也将解决我的第三个问题。那么文本字段呢?我该如何绑定单个作业的“名称”的文本文件?是使用完整作业列表作为数据源还是每次使用特定作业? - Michael Klement
通过使用例如 this.BindingContext[custs,"ContactName"].Position,我可以使单个作业在 TextField 中显示。 - Michael Klement
我不完全理解这个问题;但是,“custs”的“货币管理器”将被固定到所选的客户上;如果您想要一个特定的客户,请直接在绑定源中使用该客户实例... - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接