如何检查文本值是否在包含DataRowViews的控件的DataSource中?

时间:2019-01-15 15:10:29

标签: c# .net winforms data-binding

在验证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'

编辑:
我找到了另一种检查组合框的值是否在组合框的绑定源中的方法。尽管我最终使用了mm8's解决方案,因为它更干净。

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 :(得分:2)

尝试一下:

if (cmbo.Items.OfType<DataRowView>().Any(x => x["Person"]?.ToString() == ddPerson.Text))

答案 1 :(得分:1)

以下代码将不管数据绑定项的类型和显示成员属性如何都起作用:

var isValid = cmbo.Items.Cast<Object>().Any(x=>cmbo.GetItemText(x) == ddPerson.Text);