Другой элемент значения, тот же элемент управления
-
05-07-2019 - |
Вопрос
Правка 1
Я полагаю, что моя проблема проистекает из следующего.Функция, которая заполняет выпадающую часть, присваивает элементу Отображения значение CountyName.Затем, когда я пытаюсь установить SelectedText или EditValue, как было предложено, эта функция возвращает только идентификатор округа, который она пытается сопоставить с чем-либо в выпадающем списке DisplayMember .Мне нужно, чтобы это соответствовало чему-то в списке ValueMember.
Используя следующее, я заставил это работать, но это ВЗЛОМ, и я был бы очень признателен, если бы нашел реальное решение.
lkuResidenceCounty.ItemIndex = Convert.ToInt32(row["ResidencyCountyID"].ToString());
Оригинальное Сообщение
У меня есть поле подстановки (DevExpress) в форме участника, в которое я заполняю возможные значения из базы данных с помощью этого кода -->
lkuResidenceCounty.Properties.DataSource = ConnectBLL.BLL.Person.CountyList();
lkuResidenceCounty.Properties.PopulateColumns();
lkuResidenceCounty.Properties.DisplayMember = "CountyName";
lkuResidenceCounty.Properties.ValueMember = "CountyID";
lkuResidenceCounty.Properties.Columns[0].Visible = false;
lkuResidenceCounty.Properties.Columns[2].Visible = false;
lkuResidenceCounty.Properties.Columns[3].Visible = false;
Это работает просто отлично, так как CountyName отображается, как и ожидалось.
Однако, когда я пытаюсь загрузить значение существующего элемента для этого поля, используя приведенное ниже, которое является частью функции, которая принимает строку из набора данных ->
lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
Я получаю пустое поле.Я прошел через код, и для участника возвращается правильный идентификатор.
К сожалению, хранимая процедура для заполнения выпадающих параметров извлекается из таблицы обслуживания со столбцами "CountyName" и "CountyID".Так что это правильно.К сожалению, хранимая процедура для загрузки текущего округа конкретного человека извлекается из таблицы Person, где есть столбец с именем "ResidencyCountyID".Он назван так потому, что в нем также есть столбец "ResponsibilityCountyID".
Мне нужен способ, чтобы они оба сосуществовали, какие-нибудь решения?
Спасибо!
Решение
DisplayMember и ValueMember используются для заполнения элемента управления списком выбираемых значений.Чтобы задать выбранное значение заполненного элемента управления LookUpEdit, установите его Редактируемое значение свойство:
lkuResidenceCounty.EditValue = row["ResidencyCountyID"].ToString();
В ответ на вашу правку:Согласно документации:
Выбранная в данный момент строка определяет значения для редактируемого значения редактора и отображаемого текста.Значение для BaseEdit.EditValue получено из RepositoryItemLookUpEditBase.Поле ValueMember, в то время как текст для отображения в поле редактирования получен из RepositoryItemLookUpEditBase.Поле DisplayMember выбранной строки.
Когда вы изменяете BaseEdit.EditValue, редактор находит и выбирает строку, для которой RepositoryItemLookUpEditBase.ValueMember поле содержит новое значение.Текст в поле редактирования изменен, чтобы отразить вновь выбранную строку.
Я не использую эти элементы управления, но мне кажется, что это не должно работать так, как вы описали.Я думаю, что проблема в toString(), потому что EditValue принимает объект, поэтому он, вероятно, ожидает int для значения.Попробуй:
lkuResidenceCounty.EditValue = (int)row["ResidencyCountyID"];
Другие советы
Свойство ValueMember указывает списку, из какого поля извлекать данные при установке свойства Value.Как только вы установите для ValueMember значение "CountyID", затем, когда список будет привязан к данным, он установит для свойств значений всех элементов списка соответствующие поля CountyID объектов.
Следовательно, вам не следует делать:
lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
но скорее
lkuResidenceCounty.Properties.ValueMember = "CountyID";
все было в полном порядке, если вы правильно определили поле, которое пытаетесь привязать к данным.Как только список будет привязан к данным, вы должны увидеть результаты, которые вы ожидаете.
Однако, посмотрев на ваш код, кажется, что вы не соответствуете своему полю.В одном месте вы используете ResidencyCountyID, а в другом - CountyID.Скорее всего, это ваш источник замешательства.Выясните, каково фактическое имя поля, и убедитесь, что вы присвоили этому значению значение ValueMember.
Обновить
После прочтения вашего комментария то, что вы ищете, - это свойство SelectedValue .Свойство SelectedValue указывает списку принудительно вводить выбранное значение в любой ввод, который вы ему предоставите.
По сути, здесь происходят две вещи.ValueMember сообщает списку, что использовать в качестве значения из вашего источника данных, и SelectedValue, которое сообщает списку, каким должно быть текущее выбранное значение.
Почему вам нужно, чтобы один и тот же LookUpEdit имел два элемента значения?Используется ли он автономно или в сетке?Если вы автономны, вы могли бы поменять местами два редактора репозитория в зависимости от текущей строки.Но существует ли более 2 возможных значений для ValueMember?Это также усложнило бы ситуацию.
Обновить
Глядя на вашу правку, я думаю, что немного лучше понимаю, что происходит.Итак, вы не хотите изменять свой ValueMember (который ссылается на столбец данных), а скорее изменить значение редактора?Если это так, то вам обязательно следует использовать EditValue (не SelectedText, который, как я полагаю, не предназначен для установки) и присвоить его строке["value_field"] следующим образом:
lkuResidenceCounty.EditValue = row["ResidencyCountyID"];
Что происходит, когда вы это делаете?