ScottJohnson13483 Ответов: 1

Привязать LINQ-запроса в поле со списком только текст, без изменения предметов коллекционирования


Я столкнулся с интересной проблемой связывания поля со списком с запросом Linq. Я уверен, что просто не набираю правильную комбинацию, но это меня расстраивает и преследует мой хвост.

Например, у меня есть запрос linq, который просто загружает всю таблицу в запрос (без предложения where) для моей стаи цыплят.

Private Sub frmBirds_Shown(sender As Object, e As EventArgs) Handles Me.Shown
       Dim BirdQuery = (From b In Main.db.Birds Select b)
       BindingSource1.DataSource = BirdQuery
   End Sub


I have a combo box showing that birds gender, and set the item collection to Male, Female, and Undetermined (it's pretty tough knowing a baby chick's gender) and the text is bound to the query's field. As long as I don't try to change anything, the bindings work fine. However, if I change something from say Undetermined to Female, the whole form changes to the data for the first record with Female. (the datasource pointer changes to that record) Also, it populates the item collection with all of the records. I might have hundreds of Males, Females and Undetermined. It's behaving like a pretty cool search/browse form with every field being a new search.

Дизайнер сгенерировал код для этого репрезентативного combobox:

'ComboBox1
'
Me.ComboBox1.DataBindings.Add(New System.Windows.Forms.Binding("SelectedValue", Me.BindingSource1, "Gender", True))
Me.ComboBox1.DataSource = Me.BindingSource1
Me.ComboBox1.DisplayMember = "Gender"
Me.ComboBox1.FormattingEnabled = True
Me.ComboBox1.Location = New System.Drawing.Point(165, 150)
Me.ComboBox1.Name = "ComboBox1"
Me.ComboBox1.Size = New System.Drawing.Size(121, 21)
Me.ComboBox1.TabIndex = 3


Похоже, что только комбо-боксы вызывают изменение записи. Текстовые поля и Трекбары, похоже, ведут себя нормально.

Мой вопрос заключается в том, что я должен привязать, чтобы повлиять только на текстовое значение, а не на значения списка для этого поля со списком. Пол-это не единственное поле со списком, которое должно быть заполнено различными опциями. Для большинства из этих полей со списком предусмотрены статические элементы списка, а другие будут предоставлены через другой запрос (еще не написанный), который будет перечислять другие идентификаторы птиц для происхождения, назначения стаи и т. д., Однако эти элементы списка не являются частью исходного запроса BirdQuery и не будут изменены.

Как намекал мой первоначальный (не усовершенствованный) вопрос, это очень простой код. Логика на форме еще не была запущена, потому что сама форма еще не ведет себя. Я только начинаю изучать Linq. В прошлом я бы вручную закодировал форму Без Привязок и использования объектов к SqlDataReader. Я пытаюсь научиться более эффективным способам, и написание кода для моего личного использования-это один из способов, которым я это делаю, а также наслаждаюсь своим хобби. Прошу прощения за туманный первоначальный вопрос.

Что я уже пробовал:

Я пробовал менять привязки для каждой комбинации я могу себе представить, отображения элемента, значение выбранного элемента значение. Кажется, ничто не влияет на результат вообще.

Maciej Los

Нет кода - нет ответов.
Примечание: мы не можем читать в вашем уме или непосредственно с вашего экрана. Пожалуйста, улучшите свой вопрос, предоставив код, который вы используете.

Gerry Schmitz

У меня сложилось впечатление, что вы ожидаете, что поле со списком сделает что-то, на что оно не способно. Ваш акцент на поле со списком (которое обычно немного проигрывает чему-то другому) и отсутствие упоминания о "сетке" или "навигаторе" и т. д. это подводит меня к такому выводу.

ScottJohnson13483

Никакой сетки, просто форма ввода данных, показывающая одну запись за раз. Извините, что не уточнил этого. В какой-то момент у меня был навигатор привязки на форме для просмотра, но у меня возникла эта проблема и я ее удалил. Проблема продолжалась, так что, насколько я могу судить, это не проблема. Ни один из его кодов не остается позади. По сути, я бы хотел, чтобы поля со списком имели статический выпадающий список допустимых вариантов выбора и только фактическое значение было привязано. К сожалению, он заполняет список результатами всей таблицы для этого поля. Я не уверен, что смогу опубликовать скриншот этой формы.

Gerry Schmitz

Ваше поле со списком (так, как вы его описываете) должно иметь 3 "константы": мужской, женский, неопределенный. Он будет использоваться для присвоения "действительного" пола новой записи. Период.

"Запрос", загруженный в поле со списком (и все остальное), является "нелогичным" и "не вычисляется".

ScottJohnson13483

Теперь ты там же, где и я! *улыбка* Там нет запроса для констант, хотя по какой - то причине он заполняет элементы combobox результатами запроса (хотя я никогда не связывал элемент отображения или элемент значения). Единственное свойство, которое привязано к запросу, - это выбранное значение... которое, как я понимаю, отображается в виде текста и должно быть записано обратно в базу данных, если оно изменено. К сожалению, когда он изменяется, указатель источника данных перемещается на совершенно новую (другую, а не новую как вставка) запись и перетаскивает связанные элементы управления вместе с ней.

К сожалению, это то, что я не могу отправить вам код для воспроизведения-и посмотреть, что я вижу, - если вы не хотите, чтобы я отправил по электронной почте все решение и базу данных. Он подключен к базе данных SqlExpress на моем локальном компьютере.

Gerry Schmitz

В твоих устах это звучит как загадка. Вы назначаете запрос здесь:

Меня.Поле combobox1.Источник Данных = Меня.BindingSource1

Вы должны назначить "гендерный список".

ScottJohnson13483

Я думал, что это то, что я сделал здесь:

Меня.Поле combobox1.Привязка данных.Добавить(Новая Система.Окна.Формы.Binding("SelectedValue", Me.BindingSource1, "Gender", True))
Меня.Поле combobox1.Источник Данных = Меня.BindingSource1
Me.ComboBox1.DisplayMember = "Пол"

Может быть, я не понимаю этого так хорошо, как мне казалось. Если понадобится, я вернусь к своему старому способу делать вещи и напишу логику, чтобы справиться с этим вручную. Я подумал, что было бы немного эффективнее позволить BindingSource справиться с этим. Я предполагаю, что мое замешательство происходит от идеи, что мой список опций статичен (или из списка), определенного в коде, но результат должен быть отправлен в Bindingsource. Может быть, вы правы, и я прошу простое поле со списком сделать то, для чего оно не предназначено, а в прошлом просто заставлял его делать это, написав код события.

1 Ответов

Рейтинг:
2

ScottJohnson13483

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

При настройке Привязок данных я использовал инструмент, предусмотренный в самом элементе управления combobox (маленькая стрелка в верхнем углу combobox в конструкторе). По-видимому, использование этого делает вещи иначе, чем использование функций привязки данных в поле свойств.

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

'
       'ComboBox1
       '
       Me.ComboBox1.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.BindingSource1, "Gender", True))
       Me.ComboBox1.FormattingEnabled = True
       Me.ComboBox1.Items.AddRange(New Object() {"Female", "Male", "Undetermined"})
       Me.ComboBox1.Location = New System.Drawing.Point(165, 150)
       Me.ComboBox1.Name = "ComboBox1"
       Me.ComboBox1.Size = New System.Drawing.Size(121, 21)
       Me.ComboBox1.TabIndex = 3


Как видите, на этот раз он сохранил предметы.AddRange и привязал элемент "пол" источника привязки к свойству Text, а не к SelectedValue. Хотя я до сих пор не знаю, почему произошло предыдущее поведение. По крайней мере, эта конкретная проблема кажется решенной. Изменение пола на существующей записи не отображало другую запись, и это сделал обновите таблицу при запуске SubmitChanges.

Сегодня я узнал кое-что новое, и я ценю всю вашу помощь. Иногда достаточно просто пнуть меня по голове, чтобы заставить думать проще, чем я думаю.