2009-05-19 36 views
4

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

的数据结构的层次结构如下:

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

JobJobitemArticle每个都是Linq2SQL代表ORM的对象。

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

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

如何通过DataBinding实现此行为?

特别是,我可以绑定一个完整的集合到一个单独的TextField,并通过它在ListViews中的选择决定的位置移动吗?或者,我是否必须为每个用户进行的选择添加和删除单个数据绑定?

+0

重新评论 - 我会添加一些文本字段... – 2009-05-19 11:16:23

回答

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"); 

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

+0

首先,感谢您的精心答复! 我不知道它不是与字典一起工作,但可用的字典是我从现有设计中获得的。不过,我可以将它们转换为临时列表,只要用户点击“保存”,就可以将它们转移回字典中,以便将更改存储在数据库中。这也将解决我的第三点。 textfields怎么样?我如何将一个文本文件绑定为单个作业的“名称”?将完整的工作列表作为数据源或每次使用特定的工作完成后? – 2009-05-19 11:07:58

相关问题