Я надеюсь, что это правильно.Из того, что я могу расшифровать, это похоже на ситуацию типа «мастер-деталь».Это немного сбивает с толку, почему показанные данные выглядят как 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
.Наконец, для источника привязки «Адрес» задан список адресов «Учетные записи».
Надеюсь, это поможет.