Есть ли способ получить DataMember BindingSource как объект коллекции самостоятельно? - PullRequest
0 голосов
/ 26 октября 2011

Скажем, у нас есть класс Customer , у которого есть дочерний объект Orders . В нашем приложении Winforms мы можем привязать основную форму к списку Customers . Сетка в главной форме перечисляет заказов клиента .

Это все основные формы win / master. Мы можем установить CustomerBindingSource.DataSource в наш список клиентов. Значение DataSource сетки равно , а также CustomerBindingSource, а DataMember - это строка "Orders". Orders является собственностью Customer.

Во время выполнения я хочу, чтобы достиг содержимого сетки как набора заказов. В моем случае (по разным причинам) у меня есть доступ только к сетке и ее содержимому, у меня нет доступа к первоначальному клиенту (поэтому я не могу ссылаться на Customer.Orders)

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

CType(CType(OrdersGrid.DataSource, BindingSource).DataSource, Orders)

Однако, конечно, это не сработает. В классической форме Master / Detail такого типа DataSource Сетки на самом деле является CustomerBindingSource объектом, а ордера - просто DataMember, к которым я могу получить доступ только в виде строки.

Есть ли какой-нибудь способ достичь этой коллекции Orders через сетку?

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Если я не неправильно читаю вас, вы сможете получить доступ к текущему клиенту через источник привязки.

Customer c = bs.Current as Customer;

if (c != null)
{
    Orders o = c.Orders;
}

Вы также можете использовать предложенный метод GertArnold, хотя вам нужно будет изменить егокод, поскольку DataGridViewRowCollection не реализует IEnumerable.

var orders = dataGridView1.Rows.Cast<DataGridViewRow>() 
               .Select(row => row.DataBoundItem).Cast<Orders>();
1 голос
/ 26 октября 2011

Это должно сделать это (печатать от руки):

var orders = ordersGrid.Rows.Select(row => row.DataBoundItem).Cast<Order>();
...