C# 如何将Linq2SQL集合数据绑定到winform textfields
对于如何通过使用数据绑定来优化我的程序,我有点困惑。我的程序使用几个Linq2SQL绑定的对象来存储数据。所有ORM对象都存储在一个层次结构中。在第二个GUI项目中,我在一些文本和组合框字段中显示这些数据 数据结构层次结构如下所示: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,它有两个列表视图和一个选项卡窗格。选项卡窗格显示作业、作
包含一个JobManager
作业字典
- 每个作业都包含一个
Jobitems
- 每个Jobitem只包含一篇
文章
Job
、Jobitem
和Article
都是Linq2SQL对象,表示ORM
现在我有了一个GUI,它有两个列表视图和一个选项卡窗格。选项卡窗格显示作业、作业项和项目的属性,并提供修改作业和作业项的可能性。GUI的行为应如下所示:
作业
时,相关的作业项将显示在第二个列表视图中,有关该作业的详细信息将显示在选项卡窗格中Jobitem
时,选项卡窗格中会显示Jobitem详细信息和文章详细信息,但只有Jobitem信息是可编辑的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”将固定到所选的自定义项上;如果您想要一个特定的客户,只需直接在绑定源中使用该客户实例…请回复您的评论-我将添加一些文本字段。。。