Набор данных - это набор данных. Обычно вы привязываете свой список только к одному объекту данных. Вы можете установить для свойства DataSource набор данных, но затем вам также нужно будет установить для свойства DataMember имя таблицы в наборе данных, чтобы привязка знала, какую таблицу искать в
myListBox.DataSource = dataSet
myListBox.DataMember = "Person" 'whatever your table name is
или установитьчтобы ссылаться на таблицу напрямую:
myListBox.DataSource = dataSet.Tables("Person")
. Как прокомментировали другие ответы, вы должны затем установить DisplayMember (выбирает, какой текст появится в элементе управления) и ValueMember (выбирает, какое значение выводится из списка .SelectedValueсвойство) свойства строк, представляющих имена столбцов. Если я хочу показать свое имя в списке, но его адрес электронной почты будет выбранным значением:
myListBox.DisplayMember = "FullName" 'fullname is a column in the datatable
myListBox.ValueMember = "Email"
Если вы не установите ValueMember
, будет возвращено все DataRow
выбранного человекаот SelectedValue
. (Пояснение: на самом деле, это DataRowView
, потому что связывание с данными на самом деле происходит с DataView
, экспортируемым свойством .DefaultView
- подробнее об этом позже)
Итак, мы связали наш список. DataSource в datatable и установите свойства diplay / valuemember. Как мы можем получить информацию о том, какой человек выбран в настоящее время? Поместите кнопку в форму, которая имеет следующий код обработчика:
MessageBox.Show(DirectCast(listbox.SelectedValue, string)) 'shows e.g. john.smith@hotmail.com
Запустите программу, нажмите «Джон Смит» в списке и нажмите кнопку. В окне сообщения будет показан адрес электронной почты выбранного человека
. Я упоминал ранее, что привязка данных происходит с объектом DataView
, экспортируемым из свойства таблицы .DefaultView
. DataView - это коллекция объектов DataRowView, а DataRowView - это тонкая оболочка для DataRow. DataRows существуют в различных версиях, таких как исходные или обновленные значения. DataRowView - это способ выбора одной из этих версий для презентации, по умолчанию текущей версии. Вы можете обращаться к нему так же, как к DataRow:
'accessing the email address of a datatable row
Dim myDataRow = myPersonTable.Rows(0)
Dim email as String = DirectCast(myDataRow("EmailAddress"), string)
'accessing the email address of the dataview exported by the table defaultview
Dim myDataRowView = myPersonTable.DefaultView(0)
Dim email as String = DirectCast(myDataRowView("EmailAddress"), string)
Как видите, между ними нет большой разницы - как уже было отмечено, в представлении просто показана одна из различных версий, в которых может существовать база данных. Если вы хотите получить доступ к базовой строке, вы можете сделать это через свойство Row:
Dim myDataRowView = myPersonTable.DefaultView(0) 'or however you ended up holding a DataRowView object
Dim dr as DataRow = myDataRowView.Row
Если вы используете строго типизированные таблицы данных (обсуждаемые ниже) и хотите получить строго типизированную строку:
Dim dr as PersonDataRow = DirectCast(myDataRowView.Row, PersonDataRow)
Полезный аспект привязки списка к .DefaultView DataView заключается в том, что он может иметь свои собственные настройки фильтрации и сортировки:
Dim dv = dataSet.Tables("Person").DefaultView
dv.Sort = "[FullName] ASC"
dv.RowFilter = "[FullName] LIKE 'J*'"
Подробнее об этом см. документация для dataview
Теперь, смена моря: вам не нужно ничего делать вручную. Все это может быть связано и сделано визуальной студией, и для этого есть веские причины. По той же причине, по которой вы не пишете коды форм вручную, вручную выкладывая все свои элементы управления и т. Д., Вы можете визуально проектировать и поддерживать свой слой доступа к данным
Добавить новый файл dataSet в свой проект, открыть егощелкните правой кнопкой мыши область конструктора и выберите добавление табличного адаптера, пройдите мастер, установив строку подключения и выбрав, что это хранимая процедура, которая предоставляет вам данные. В конце вы увидите представление данных и все столбцы, возвращаемые вашей хранимой процедурой
Если вы теперь покажете окно источников данных, когда находитесь в конструкторе форм, вы увидите узел, представляющийваша таблица из вашего dataSet, и вы можете либо перетащить этот узел на форму, чтобы создать DataGridview, который подключен к листам, или вы можете развернуть узел в окне источников данных, чтобы увидеть отдельные столбцы, вы можете изменить тип элемента управления насоздать для этого свойства, и вы можете оставить их в форме. (Я не могу вспомнить, является ли listbox одним из них, но я знаю, что ComboBox есть). Удаление их в форме просто создает элемент управления, уже имеющий имя и связанный с нужным набором свойств DataSource, Member и DisplayMember, и вы можете изменить эти и другие свойства, например член-значение в сетке свойств.
Самое главное отличие, все создаваемые конструктором элементы управления связаны через устройство, называемое источником привязки - это отслеживает строку в таблице данных, которую вы просматриваете в данный момент, и синхронизирует элементы управления привязкой данных. Если один элемент управления, такой как сетка или список, способен отображать несколько строк, щелчок по разным строкам изменяет свойство Current источника привязки, вызывая обновление других элементов управления (которые отображают данные только одной строки данных), таких как текстовые поля, до нового Currentзначения строк
Таким образом, элементы управления списком могут работать в одном или двух режимах: они либо служат устройством, которое может перемещаться по строкам таблицы данных, позволяя выбрать одну из нескольких строк, чтобы можно было редактировать значения, используя другие текстовые поля. и т. д., или списки служат способом отображения набора значений, с которыми пользователь может справиться, и заставляют свойство другого datarow обновляться до этого выбранного значения. Различие в этих двух режимах происходит от того, связано ли свойство selectedvalue с чем-то другим или нет. В качестве простого примера в контексте, который я уже обсуждал, у нас может быть набор данных с двумя таблицами;личность и пол;таблица person имеет гендерный столбец с одним символом M или F, а гендерная таблица имеет два столбца, один из которых - один символ M или F, а другой - текстовый столбец Male или Female (я не буду вдаваться в случаи для других половпрямо сейчас, но систему легко расширить, добавив больше строк). После этого у вас может появиться форма, в которой таблица person и ее источник привязки приводят к тому, что список людей отображается в первом списке, а щелчок по другим элементам в списке приводит к изменению всех других текстовых полей (FullName) в форме, так что выможете редактировать эти детали. У вас также может быть второй список, связанный с гендерной таблицей через его собственный источник привязки (или прямой, не имеет значения), для которого DisplayMember установлен в столбец «Male / female», а его значение - в «m / f»столбца и его свойства SelectedValue, привязанного к основному столбцу Person bindingsource Person.gender. Когда вы выбираете человека из первого списка, текущее значение символа его Пола будет использоваться для установки текущего элемента, выбранного в списке пола, но если вы измените значение в комбинированном / списке пола, то будет записано новое выбранное значение обратно. в столбец person.gender
Это 101 привязка форм Windows;Я рекомендую добавить набор данных в ваш проект, потому что тогда он дает вам наборы данных, которые специально напечатаны с именованными свойствами. Ваш код выглядит так:
ForEach PersonDataRow r in myDataset.Person
r.Age += 1
Вместо этого:
ForEach DataRow r in myDataset.Tables("Person").Rows
r("Age") = DirectCast(r("Age"), Integer) +1