是否可以在多个列上使用BindingSource的Find方法?

例如,假设我有一个显示当前宠物的表格视图;两个组合框cboPetType和cboGender;一个按钮,用于基于这两个组合框的值在Pet表中创建新记录。

现在,假设我只希望每个PetType /性别组合之一(狗-M,猫-F等)。因此,如果我在BindingSource中有一个Dog-M宠物,并且用户从组合框中选择了Dog和M,则我想阻止用户通知他们组合已经存在。

过去,我曾使用BindingSource.Find方法执行类似的操作,但是据我所知,这仅对搜索一列有用(即BindingSource.Find(“ PetType”,cboPetType.SelectedValue);) 。

是否可以基于多个列搜索绑定源?如果没有,有什么建议可以达到我想要的结果?任何意见是极大的赞赏!

最佳答案

不,很遗憾,这是不可能的。尽管对于特定的数据源来说,这样的搜索可能会相当简单,但是以更通用的方式(如BindingSource)进行此操作的透明度会降低一些。首先,语法将不那么明显。这是一个人为设计的解决方案:

public class Key
{
    public string PropertyName {get; set;}
    public object Value {get; set;}
}

public static int Find(this BindingSource source, params Key[] keys)
{
    PropertyDescriptor[] properties = new PropertyDescriptor[keys.Length];

    ITypedList typedList = source as ITypedList;

    if(source.Count <= 0) return -1;

    PropertyDescriptorCollection props;

    if(typedList != null) // obtain the PropertyDescriptors from the list
    {
        props = typedList.GetItemProperties(null);
    }
    else // use the TypeDescriptor on the first element of the list
    {
        props = TypeDescriptor.GetProperties(source[0]);
    }

    for(int i = 0; i < keys.Length; i++)
    {
        properties[i] = props.Find(keys[i].PropertyName, true, true); // will throw if the property isn't found
    }

    for(int i = 0; i < source.Count; i++)
    {
        object row = source[i];
        bool match = true;

        for(int p = 0; p < keys.Count; p++)
        {
            if(properties[p].GetValue(row) != keys[p].Value))
            {
                match = false;
                break;
            }
        }

        if(match) return i;
    }

    return -1;
}


您可以这样称呼它:

BindingSource source = // your BindingSource, obviously

int index = source.Find(
    new Key { PropertyName = "PetType", Value = "Dog" },
    new Key { PropertyName = "Gender", Value = "M" });


请记住,要使此功能可用,您确实需要一个更智能的比较算法,但我将其留给读者练习。检查IComparable的实现是一个好的开始。但是,无论实施的那个特定点如何,该概念都应持续下去。

请注意,这不会利用基础数据源可能实现的任何可能的性能优化,而单列Find会使用。

关于c# - BindingSource.Find多列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1767018/

10-12 04:58