Как связать данные из коллекции Linq2SQL с текстовыми полями winform - PullRequest
4 голосов
/ 19 мая 2009

Я немного озадачен тем, как я могу оптимизировать свою программу, используя DataBindings. Моя программа использует несколько связанных с Linq2SQL объектов, хранящих данные. Все объекты ORM хранятся в иерархии. Во втором проекте GUI я отображаю эти данные в некоторых полях Text и Combo Box.

Иерархия структуры данных выглядит следующим образом:

  • JobManager содержит словарь Jobs
  • Каждое задание содержит словарь Jobitems
  • В каждом рабочем месте содержится ровно один Article

Job, Jobitem и Article каждый являются объектами Linq2SQL, представляющими ORM.

Теперь у меня есть графический интерфейс с 2 видами списка и панелью вкладок. Панель вкладок отображает свойства заданий, элементов заданий и статей и предлагает возможность изменять задания и элементы заданий. GUI должен вести себя так:

  1. Если в первом ListView выбран Job, связанные элементы задания будут отображаться во втором ListView, а подробная информация о задании отображается на панели вкладок.
  2. Когда во втором ListView выбран Jobitem, сведения о задании и статье отображаются на панели вкладок, но редактируются только сведения о задании.
  3. Когда изменения сделаны, пользователь должен их намеренно сохранить. В противном случае изменения должны быть отброшены и не синхронизированы с базой данных.

Как мне добиться такого поведения с помощью DataBinding?

В частности, могу ли я привязать полную коллекцию к одному TextField один раз и сдвинуть ее позицию, продиктованную выбором в ListViews? Или мне нужно добавлять и удалять отдельные привязки данных для каждого задания для каждого выбора, выполняемого пользователем?

1 Ответ

4 голосов
/ 19 мая 2009

Вы действительно имеете в виду "словарь"? Привязка 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");

(я только добавляю это, поскольку это общий вопрос)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...