Какой элемент управления WinForm Привязать к списку (Из T)?
-
21-08-2019 - |
Вопрос
Я работал над тем, чтобы мой проект был объектно-ориентированным.В настоящее время я использую .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