Как проверить, находится ли текстовое значение в DataSource элемента управления, который содержит DataRowViews? - PullRequest
0 голосов
/ 15 января 2019

При проверке ComboBox я пытаюсь проверить, находится ли значение в ComboBox в списке значений, привязанных к данным ComboBox.
Источником данных является BindingSource, а базовые элементы имеют тип DataRowView.
Поэтому я не могу понять, как сравнить значение в выпадающем списке с полем «Персона» в DataRowView источника данных

Также, прежде чем кто-то предложит просто установить DropDownStyle в DropDownList, это не вариант для этого случая.

Что я пробовал:

private void ddPerson_Validating(object sender, CancelEventArgs e)
    {
        ComboBox cmbo = sender as ComboBox;
        if (!string.IsNullOrWhiteSpace(ddPerson.Text))
        {
            if (cmbo.Items.Contains(ddPerson.Text))
            {
                errorProvider1.SetError(cmbo, "");
            }
            else
            {
                errorProvider1.SetError(cmbo, "\"" + person.Text + "\" is not in the list of accepted values");
            }
        }
        else
        {
            errorProvider1.SetError(cmbo, cmbo.DisplayMember + " is required");
        }
    }

Я тоже пробовал

if (personBindingSource.Contains(ddPerson.Text))
Два вышеупомянутых решения, которые я попробовал, не работают, потому что personBindingSource и cmbo.Items - это просто списки объектов DataRowView.

И отсюда https://stackoverflow.com/a/24126821/3490417 Я пытался
if (cmbo.Items.Cast<DataRowView>().Select(x => Convert.ToString(x["Person"]).Contains(ddPerson.Text))
Это не компилируется с ошибкой "Не удается неявно преобразовать тип 'System.Collections.Generic.IEnumerable' в 'bool'

EDIT:
Я нашел альтернативный способ проверки того, находится ли значение поля со списком в связующем источнике со списком. Хотя в итоге я использовал mm8 решение, так как оно чище.

int found = personBindingSource.Find("Person", ddPerson.Text);
if (found < 0)
{ errorProvider1.SetError(cmbo, "\"" + person.Text + "\" 
  is not in the list of accepted values"); }           

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Следующий код будет работать независимо от типа элемента с привязкой к данным и свойства отображаемого элемента:

var isValid = cmbo.Items.Cast<Object>().Any(x=>cmbo.GetItemText(x) == ddPerson.Text);
0 голосов
/ 15 января 2019

Попробуйте это:

if (cmbo.Items.OfType<DataRowView>().Any(x => x["Person"]?.ToString() == ddPerson.Text))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...