我对如何通过使用DataBindings来优化我的程序感到有点困惑。我的程序使用几个存储数据的Linq2SQL绑定对象。所有ORM对象都存储在层次结构中。在第二个GUI项目中,我在一些Text和Combo Box字段中显示这些数据。
数据结构层次结构如下:
JobManager
包含Jobs
Jobitems
Article
Job
,Jobitem
和Article
均为Linq2SQL对象,代表ORM。
现在我有一个包含2个列表视图的GUI和一个选项卡窗格。选项卡窗格显示作业,作业项和文章的属性,并提供修改作业和作业项的可能性。 GUI应该像这样:
Job
时,相关的作业项目将显示在第二个ListView中,有关作业的详细信息将显示在选项卡窗格中。Jobitem
时,工作项详细信息和文章详细信息将显示在选项卡窗格中,但只有Jobitem信息可以编辑。如何使用DataBinding实现此行为?
特别是,我可以将一个完整的集合绑定到单个TextField一次,并通过ListViews中的选择所指示的位置移动吗?或者我是否必须为每个作业添加和删除单个DataBindings以用于用户进行的每个选择?
答案 0 :(得分:4)
你真的是指“词典”吗?列表(IList
/ IListSource
)可以使用Winform绑定,但不能使用字典。此外,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");
(我只添加这个,因为这是一个常见的问题)