В форме Windows, как мне заполнить сетку данных на основе отношения многих ко многим? - PullRequest
0 голосов
/ 28 января 2019

У меня есть приложение C #, Windows Forms.Одна форма представляет собой страницу обслуживания для всех учетных записей.Он основывался на одной таблице в таблице, а навигатор привязки использовался, чтобы позволить пользователям перемещаться по списку учетных записей.У каждой учетной записи был только один адрес.Сейчас я пытаюсь изменить его, чтобы каждая учетная запись могла иметь несколько адресов.У меня есть новая таблица для хранения адресов и комбинированная таблица для сопоставления учетной записи с адресом.В форме я добавил сетку данных и добавил поле адресов (класс списка адресов) в класс учетной записи.То, что я хочу сделать, это основать новую сетку данных в поле адреса учетной записи.Я не могу понять точный синтаксис.Может кто-нибудь помочь мне разобраться, как привязать новую сетку данных к списку адресов?Спасибо!

Итак, мой код выглядит примерно так (я упростила данные, чтобы их было легче включить):

// This is how I originally bound my data source to the navigator on the form
List<Accounts> accounts = accountMaintenanceBLL.GetAccounts();
accountMaintenanceBindingSource.DataSource = accounts;

// Here's the original Account class; the addresses field is new to handle the multiple addresses
public class Account
{
    public int ID { get; set; }
    public string name { get; set; }
    public string account { get; set; }
    public List<Address> addresses { get; set; }
}

// Here's what the new address class looks like
public class Address
{
    public int AddressID { 
    public string Address { get; set; }
    public string City { get; set; }
}

Я хочу привязать новую сетку данных кполе адресов в учетной записи.Я попробовал несколько вещей, но в основном я хочу сделать что-то вроде этого:

this.dataGridView1.DataSource = this.addressBindingSource;
addressBindingSource.DataSource = ((Address)itemMaintenanceViewModelBindingSource.Current).addresses;

Это не работает, и я не могу понять, как это сделать.

Вот представление данных:

Account Table
----------------------------
|  ID  |  Name  |  Account  |
-----------------------------
| 123  |  Acme  |  98765    |
-----------------------------
| 124  | Binford|  34566    |
-----------------------------
| 125  | CoTech |  32232    |
-----------------------------

Address Table
----------------------------------
|  Address  |  Address  |  City  |
|    ID     |           |        | 
---------------------------------|
|  1        | 123 Main  | Detroit|
----------------------------------
|  2        | 13 Elm    | Denver |
----------------------------------
|  3        | 90 Rodeo  | LA     |
----------------------------------
|  4        | 57 Park   | NYC    |
----------------------------------

AccountAddress Table
-----------------------------
|  Comp. ID  |  Address ID  |
-----------------------------
|  123       |  1           |
-----------------------------
|  124       |  2           |
-----------------------------
|  125       |  3           |
-----------------------------
|  125       |  4           |
-----------------------------

Вот представление формы с навигатором привязки вверху, информация об учетной записи в виде текстовых полей с данными, а затем сетка, показывающая адреса для этогоаккаунт.

itemMaintenanceViewModelBindingNavigator

ID: 125     Name: Binford   Account: 34566
Addresses:

dataGridView1
------------------
| 90 Rodeo | LA  |
------------------
| 57 Park  | NYC |
------------------

1 Ответ

0 голосов
/ 03 февраля 2019

Я надеюсь, что это правильно.Из того, что я могу расшифровать, это похоже на ситуацию типа «мастер-деталь».Это немного сбивает с толку, почему показанные данные выглядят как DataTable s, однако код использует List<T> в качестве DataSource для сетки?

Ниже используется List<Account> в качестве DataSource до BindingSource.Как вы заметили, поскольку новое поле «адрес» теперь является «коллекцией», а не одним типом ... сетка будет «игнорировать» это свойство.Можно создать новое «свойство» (а не метод), которое будет возвращать «одну» строку с разрывами строк со всеми различными адресами, а затем отображать ее в «многострочной» ячейке в сетке.Или используя ваше предложение, которое следует за идеей мастер-детализации, это создать секунду DataGridView для отображения нескольких адресов.Содержимое этой сетки будет «динамическим» и будет меняться при изменении выбора в сетке «счета».

Использование класса Account, как указано в вопросе, и использование BindingSource, как в опубликованном коде…

List<Accounts> accounts = accountMaintenanceBLL.GetAccounts();
accountMaintenanceBindingSource.DataSource = accounts;

Затем мы используем это как DataSource дляСетка «Счета».

dgvAccounts.DataSource = accountMaintenanceBindingSource;

Следующим шагом является настройка сетки «Адрес» DataSource.Так как этот источник данных сеток является «динамическим» и будет меняться при изменении «выбора» сеток «Счета», эта переменная должна быть подвержена событию «Выбор изменен» в сетках «Счета».Это событие используется для «изменения» источника данных в сетках «Адрес».Я предполагаю, что есть другие способы добиться этого, и, возможно, потребуется точная настройка для вашей среды.

В этом случае для глобальных сеток «Адрес» используется «глобальная» переменная BindingSource AddressBindingSource.источник данных.

BindingSource AddressBindingSource = new BindingSource();

Событие загрузки форм может выглядеть примерно так:

private void Form1_Load(object sender, EventArgs e) {
  List<Account> accounts = GetAccounts();
  accountMaintenanceBindingSource.DataSource = accounts;
  dgvAccounts.DataSource = accountMaintenanceBindingSource;
  dgvAddresses.DataSource = AddressBindingSource;
}

Наконец, подключается сетка «Счета» SelectionChanged для изменения «адреса».сетка источника данных к выбранной в данный момент «учетной записи» ... это может выглядеть примерно так:

private void dataGridView1_SelectionChanged(object sender, EventArgs e) {
  int rowIndex = dgvAccounts.CurrentCell.RowIndex;
  Account acct = (Account)dgvAccounts.Rows[rowIndex].DataBoundItem;
  AddressBindingSource.DataSource = acct.Addresses;
}

Выше мы получаем индекс строки строки «текущие ячейки», затем эта строка отображается направильный объект «Account» в списке accounts.Наконец, для источника привязки «Адрес» задан список адресов «Учетные записи».

Надеюсь, это поможет.

...