【问题标题】:How to databind a Linq2SQL collection to winform textfields如何将 Linq2SQL 集合数据绑定到 winform 文本字段
【发布时间】:2010-10-27 06:47:01
【问题描述】:

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

数据结构层次如下:

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

JobJobitemArticle 都是 Linq2SQL 对象,代表一个 ORM。

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

  1. 在第一个 ListView 中选择 Job 时,相关作业项将显示在第二个 ListView 中,有关作业的详细信息将显示在选项卡窗格中。
  2. 在第二个 ListView 中选择 Jobitem 时,jobitem 详细信息和文章详细信息会显示在选项卡窗格中,但只有 Jobitem 信息是可编辑的。
  3. 更改完成后,用户必须有意保存它们。否则,更改应该被丢弃并且不会同步到数据库。

如何使用 DataBinding 实现此行为?

特别是,我可以一次将完整的集合绑定到单个 TextField 并在 ListViews 中的选择指定的位置移动吗?还是我必须为用户执行的每个选择在每个作业的基础上添加和删除单独的 DataBinding?

【问题讨论】:

  • 回复您的评论 - 我将添加一些文本字段...

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


【解决方案1】:

您真的是指“字典”吗? 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");

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

【讨论】:

  • 首先感谢您的精心回复!我不知道它不适用于字典,但是字典是我从现有设计中得到的。不过,我可以将它们转换为临时列表,一旦用户点击“保存”,它们就可以被转移回字典以将更改存储在数据库中。这也将解决我的第三点。文本字段呢?如何为单个作业的“名称”绑定文本文件?一次使用完整的作业列表作为数据源,还是每次使用手头的特定作业?
  • 这样我可以通过使用例如在 TextField 中显示单个作业。 this.BindingContext[custs,"ContactName"].Position?
  • 我不完全理解这个问题;但是“custs”的“货币经理”将被固定到任何选定的自定义;如果您需要特定客户,只需在绑定源中直接使用该客户实例...
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 2023-03-26
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多