C# 如何检查文本值是否位于包含DataRowView的控件的数据源中?

C# 如何检查文本值是否位于包含DataRowView的控件的数据源中?,c#,.net,winforms,data-binding,C#,.net,Winforms,Data Binding,在验证组合框时,我试图检查组合框中的值是否在数据绑定到所述组合框的值列表中。 数据源是BindingSource,基础项的类型为DataRowView。 因此,我不知道如何将组合框的值与数据源的DataRowView的“Person”字段进行比较 还有,在有人建议将DropDownStyle设置为DropDownList之前,这不是本例的选项 我所尝试的: private void ddPerson_Validating(object sender, CancelEventArgs e)

在验证组合框时,我试图检查组合框中的值是否在数据绑定到所述组合框的值列表中。 数据源是BindingSource,基础项的类型为DataRowView。 因此,我不知道如何将组合框的值与数据源的DataRowView的“Person”字段进行比较

还有,在有人建议将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");
        }
    }
我也试过了

如果personBindingSource.containsDperson.Text 我尝试的上述两种解决方案不起作用,因为personBindingSource和cmbo.Items只是DataRowView对象的列表

从这里开始 我试过了 如果cmbo.Items.Cast.Selectx=>Convert.ToStringx[Person]。ContainsddPerson.Text 此未编译,错误为无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“bool”

编辑: 我找到了另一种检查combobox的值是否在combobox的bindingsource中的方法。虽然我最终使用了更干净的溶液

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

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

无论数据绑定项类型和显示成员属性如何,以下代码都将正常工作:

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

对不起,我的意思是说,您能为ddPerson显示数据源吗?实际上不是,因为它是数据绑定到数据集表的。但是我可以告诉你,在这个表中,只有“ID”和“Person”两个字段。如果您将ValueMember设置为ID,那么您只需检查ddPerson.SelectedValue==null,那么列表中就没有任何内容。要获取项的显示值,几乎总是最好使用GetItemText。