我在运行时添加了两个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
答案 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);
}
}