Какой элемент управления WinForm Привязать к списку (Из T)?

StackOverflow https://stackoverflow.com/questions/1070477

Вопрос

Я работал над тем, чтобы мой проект был объектно-ориентированным.В настоящее время я использую .DLL, который предоставляет все классы приложения проекту WinForms, выступающему в качестве уровня представления.

My .DLL, например, вернет SortableBindingList(из T) в код в форме.SortableBindingList(Из T) берется из здесь.Давайте предположим, что это SortableBindingList (Продукта).Предполагая, что функция .библиотеки DLL Services.Products.GetList() возвращает SortableBindingList(Of Product), я могу легко это сделать:

DataGridView1.DataSource = Services.Products.GetList()

Теперь DataGridView правильно заполнен моим списком продуктов.Прекрасно.Однако, это не так.Свойство SelectedItem, которое возвращает мне мой объект, который был выбран в DataGridView:

' Doesn't exist!
Dim p As Product = DataGridView1.SelectedItem
' Need to make another DB call by getting the Product ID 
' from the proper Cell of the DataGridView ... yuck!

Однако ComboBox или ListBox на самом деле сохраняют и возвращают объекты моего Продукта нетронутыми:

' Valid!
ComboBox1.DataSource = Services.Products.GetList()
Dim p as Product = ComboBox1.SelectedItem

Однако другое ...в ComboBox и ListBox отображаются не все поля объекта Product, а только значение свойства DisplayMember.

Есть ли в VB.NET 2008 хороший элемент управления, которого мне просто не хватает, который дает мне объектно-ориентированную функциональность, которую я хочу, которая фактически отображает поля всего объекта, а также возвращает этот объект обратно при выборе пользователем?Я в недоумении, почему бы и нет.

Это было полезно?

Решение

Похоже, вы ищете DataGridView для DataGridView Свойство selectedRows.Вы должны быть в состоянии использовать это для того, что вы описываете.

Вы используете его, чтобы получить DataBoundItem, а затем привести его к вашему исходному классу.Допустим, у меня был привязан список объектов Продукта, я бы использовал что-то вроде:

Dim p As Product = CType(dataGridView1.SelectedRows(0).DataBoundItem, Product)
MessageBox.Show(p.Name & " " & p.Price)

Это работает, если выбрана вся строка целиком, в противном случае вы можете получить исключение с нулевой ссылкой.В этом случае вы могли бы получить RowIndex текущей выбранной ячейки через:

dataGridView1.SelectedCells(0).RowIndex

Итак, все вместе это сейчас выглядит так:

If dataGridView1.SelectedCells.Count > 0 Then
    Dim index as Integer = dataGridView1.SelectedCells(0).RowIndex
    Dim p As Product = CType(dataGridView1.SelectedRows(index).DataBoundItem, Product)
    MessageBox.Show(p.Name & " " & p.Price)
End If

Редактировать: обновлено до VB.NET

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top