C# DataGridViewComboxColumn

C# DataGridViewComboxColumn,c#,datagridview,C#,Datagridview,我在运行时添加了两个datagridviewcomboxcolumn。我需要第一个datagridviewcomboxcolumn的项目在GridView的所有行中保持不变,但我希望第二个datagridviewcomboxcolumn的项目根据第一个datagridviewcomboxcolumn的所选项目在不同的行中有所不同 如果我们说第一个datagridviewcomboxcolumn表示位置,第二个datagridviewcomboxcolumn表示子位置。因此,我希望第二个datag

我在运行时添加了两个
datagridviewcomboxcolumn
。我需要第一个
datagridviewcomboxcolumn
的项目在
GridView
的所有行中保持不变,但我希望第二个
datagridviewcomboxcolumn
的项目根据第一个
datagridviewcomboxcolumn
的所选项目在不同的行中有所不同

如果我们说第一个
datagridviewcomboxcolumn
表示位置,第二个
datagridviewcomboxcolumn
表示子位置。因此,我希望第二个
datagridviewcomboxcolumn
项是第一个
datagridviewcomboxcolumn
中所选位置的子位置

如果选择了
加拿大
,则与此类似

国家(组合框项目)|州/省(组合框项目)
美国魁北克省
加拿大(选定)安大略省
英格兰马尼托巴省
阿尔伯塔省
然后,如果您选择
USA

国家(组合框项目)|州/省(组合框项目)
美国(选定)加利福尼亚州
加拿大纽约
英格兰蒙大拿州
俄亥俄州
重述您的问题:

您有一个数据集合,并希望对其进行筛选

这是一个关于这个主题的问题,它的范围更广一些。(具体地说,在将LINQtoSQL IQuerable对象激发到数据库之前,先对其进行过滤。)

我找到了两个解决问题的方法

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

以及更通用的解决方案

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);
    }
}
课堂记录
{
公共对象显示{get;set;}
公共对象值{get;set;}
}
IEnumerable源{get;set;}
字符串值成员{get;set;}
字符串显示成员{get;set;}
字符串筛选器成员{get;set;}
对象数据选择(对象标准)
{
列表结果=新列表();
foreach(源中的var记录)解析(发送方、记录、准则、结果);
返回结果;
}
私有void解析(对象记录、对象标准、列表结果)
{
MethodInfo DisplayGetter=null;
MethodInfo ValueGetter=null;
bool AddRecord=false;
foreach(记录中的PropertyInfo属性。GetType().GetProperties())
{
如果(property.Name==DisplayMember)DisplayGetter=property.getMethod();
如果(property.Name==ValueMember)ValueGetter=property.getMethod();
else if(property.Name==FilterMember)
{
MethodInfo ExternalGetter=property.getMethod();
if(ExternalGetter==null)中断;
其他的
{
objectexternalgetter.Invoke(记录,新对象[]{});
AddRecord=外部。等于(标准);
如果(!AddRecord)中断;
}
}
如果(AddRecord&&(DisplayGetter!=null)&&(ValueGetter!=null))中断;
}
if(AddRecord&&(DisplayGetter!=null)&&(ValueGetter!=null))
{
记录r=新记录();
r、 Display=(DisplayGetter!=null)
?DisplayGetter.Invoke(记录,新对象[]{})
:null;
r、 值=(ValueGetter!=null)
?ValueGetter.Invoke(记录,新对象[]{})
:null;
结果:添加(r);
}
}

标点符号是你的朋友。你的问题越清楚,就越有可能有人会花时间去阅读。我扫描了两次,我仍然不知道问题是什么。我同意BW。问一个问题。
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);
    }
}