DataGridViewComboBoxColumn - PullRequest
       5

DataGridViewComboBoxColumn

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

У меня есть два 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 Ответ

1 голос
/ 04 ноября 2012

Резюме вашей проблемы:

У вас есть коллекция данных, и вы хотите отфильтровать ее.

Это вопрос с той же проблемой , которая распространяется на эту тему немного больше. (Если быть точным, отфильтруйте объект LINQtoSQL IQueriable до его запуска в базе данных.)

Я нашел два решения, которые могут быть интересны для нашей проблемы.

Я нашел способ сделать это для данных в DataSets (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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...