Элемент отображения DataGridViewComboboxCell не отображается - PullRequest
0 голосов
/ 07 мая 2020

Цель

Dataagridview SteelTypes имеет столбец, привязанный к dataview ( SteelThickness ). Я могу выбрать данные и правильно их установить. Однако я не могу загрузить ту же информацию. Моя ячейка со списком datagridview содержит значение и отредактированный форматированный текст, но я не могу установить информацию об отображаемом элементе.

Текущая проблема

У меня все столбцы текстового поля загружаются правильно, кроме столбца со списком. Переменная cbCol установлена ​​правильно, а EditedFormattedValue и FormattedValue содержат нужное мне значение! Однако displayMember не реплицируется в ячейку datagridviewcombobox.

Я пытаюсь отобразить «3» в столбце Épaisseur (толщина), установив для него значение первичного ключа (PK_SteelThickness):

enter image description here

См. Результаты ниже. Все, кроме моей comboboxcell, заполнено: enter image description here

Заранее оцените помощь, это меня свело с ума :)

Ответы [ 3 ]

3 голосов
/ 07 мая 2020

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

  • DataSource на что-то, что обеспечивает поиск ключа / значения, например, DataSource SteelThickness с двумя столбцами Disp и Val и строками типа "Thick",1 "Medium", 2 "Thin", 3,
  • DisplayMember установлен в строку имени столбца из таблицы поиска, которая содержит текст для отображения, например, «Disp»,
  • ValueMember установлен в строковое имя столбца из поиска, имеющее значение, относящееся к отображаемому тексту, например «Val» и
  • DataPropertyName, установленным на имя свойства (столбца) в другой таблице, значение которой быть декодированным (одно из значений в столбце Val таблицы поиска) (например, таблица Products со столбцом SteelThicknessID).

datagridview привязан к элементам данных продуктов, комбинация найдет например, 3 в столбце steelthicknessid, он будет искать 3 в столбце Val таблицы steelthickities и отображать текст он находит в столбце Disp этой строки из steelthickesses. если пользователь изменит значение, показанное, отбросив комбинированный список и выбрав Толстый, он будет работать в обратном порядке и возьмет 1 из столбца Val и обновит таблицу продуктов новым значением 1 для стали толщиной id. Если вы этого не хотите, сделайте столбец или datagridview только для чтения

Для более активного обсуждения см. Мой ответ в DataGridView Загрузка из LINQ

3 голосов
/ 07 мая 2020

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

Например, предположим, что у вас есть таблица Handedness, например:

Id Name
 1 Right
 2 Left
 3 Ambidextrous

и у вас есть таблица Person, например:

Id Name  HandednessId
 1 Peter            2
 2 Paul             1
 3 Mary             3

В вашей сетке вы должны создать DataGridViewComboBoxColumn и установить для его свойства DataPropertyName значение «HandednessId». Когда вы затем привязываете свою таблицу Person к сетке, столбец HandednessId будет привязан к столбцу поля со списком. Вы должны привязать свою таблицу Handedness к столбцу и установить для DisplayMember и ValueMember значения «Имя» и «Идентификатор» соответственно. В сетке будут отображаться «Левый», «Правый» и «Амбидекстр» для «Петра», «Пола» и «Мэри» соответственно. Если вы хотите сделать Питера амбидекстром, вы должны установить HandednessId ячейку Value на 3, и тогда будет отображаться «Ambidextrous».

См. Это для получения дополнительной информации:

Добавление столбца ComboBox в DataGridView

0 голосов
/ 13 мая 2020

Это странное поведение, но я обнаружил, что изменение вызовов метода загрузки с new () на форму Load () заставило его работать ...

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

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    LoadSteelPlates()
    LoadPlateQuotes()
End Sub

На это:

Private Sub frmQuotePads_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    LoadSteelPlates()
    LoadPlateQuotes()
End Sub

Это единственный код, который был изменен и теперь он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...