DataGridViewComboBoxColumn

时间:2009-01-15 12:09:22

标签: c# datagridview

我在运行时添加了两个DataGridViewComboBoxColumn。我需要第一个DataGridViewComboBoxColumn的项目在GridView的所有行中保持不变,但我希望第二个DataGridViewComboBoxColumn的项目在行之间不同,具体取决于第一个DataGridViewComboBoxColumn的所选项目。

如果我们说第一个DataGridViewComboBoxColumn代表位置,第二个DataGridViewComboBoxColumn代表子位置。因此,我希望第二个DataGridViewComboBoxColumn项成为第一个DataGridViewComboBoxColumn中所选位置的子位置。

如果选择了Canada,就像这样。

Country(comboBoxItems)  |     State/Province(ComboBox Items)
USA                           Quebec
CANADA(selected)              Ontario
ENGLAND                       Manitoba
                              Alberta

然后,如果您选择USA

Country(comboBoxItems)  |     State/Province(ComboBox Items)
USA (Selected)                California
CANADA                        New York
ENGLAND                       Montana
                              Ohio

1 个答案:

答案 0 :(得分:1)

回顾你的问题:

您拥有一组数据,并希望对其进行过滤。

这是一个same problem的问题,它在这个问题上有所扩展。 (具体而言,在将LINQtoSQL IQueriable对象触发到数据库之前对其进行过滤。)

我找到了两个可能对我们的问题感兴趣的解决方案。

我找到了一种方法来处理DataSet中的数据(ADO.NET)

DataTable source { get; set; }
String ValueMember { get; set; }
String DisplayMember { get; set; }
String FilterMember { get; set; }

Object ADOSelect(Object criterium)
{
    if ((source == null) || (criterium == null)) return null;

    return
    (
        from r in source.AsEnumerable()
        where (r[FilterMember] == criterium)
        select new
        {
            Value = r[ValueMember],
            Display = r[DisplayMember]
        }
    ).ToList();
}

更通用的解决方案。

class Record
{
    public object Display { get; set; }
    public object Value { get; set; }
}

IEnumerable<Object> source { get; set; }
String ValueMember { get; set; }
String DisplayMember { get; set; }
String FilterMember { get; set; }

Object DataSelect(Object criterium)
{
    List<Record> result = new List<Record>();
    foreach (var record in source) Parse(sender, record, criterium, result);
    return result;
}

private void Parse(object record, Object criterium, List<Record> result)
{
    MethodInfo DisplayGetter = null;
    MethodInfo ValueGetter = null;
    bool AddRecord = false;

    foreach (PropertyInfo property in record.GetType().GetProperties())
    {
        if (property.Name == DisplayMember) DisplayGetter = property.GetGetMethod();
        else if (property.Name == ValueMember) ValueGetter = property.GetGetMethod();
        else if (property.Name == FilterMember)
        {
            MethodInfo ExternalGetter = property.GetGetMethod();
            if (ExternalGetter == null) break;
            else
            {
                object external = ExternalGetter.Invoke(record, new object[] { });
                AddRecord = external.Equals(criterium);
                if (!AddRecord) break;
            }
        }
        if (AddRecord && (DisplayGetter != null) && (ValueGetter != null)) break;
    }

    if (AddRecord && (DisplayGetter != null) && (ValueGetter != null))
    {
        Record r = new Record();
        r.Display = (DisplayGetter != null) 
            ? DisplayGetter.Invoke(record, new object[] { })
            : null;
        r.Value = (ValueGetter != null) 
            ? ValueGetter.Invoke(record, new object[] { })
            : null;
        result.Add(r);
    }
}