DataView rowfilter 始终包含集合中的最后一个
DataView rowfilter always includes last of the set
使用 dataView.RowFilter 时,我总是得到包含数据集最后一个元素的过滤结果。
我有一个测试数据集:
private TestClass[] items =
{
new TestClass{name = "Hans", age = 10 },
new TestClass{name = "Bert", age = 5 },
new TestClass{name = "Gerda", age = 41 },
new TestClass{name = "Dolf", age = 73 },
new TestClass{name = "Ludo", age = 35 },
};
正在创建数据视图:
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Columns.Add("TestItem", typeof(TestClass));
DataView dataView = new DataView(dataTable);
foreach(var item in items)
{
dataView.AddNew(item.name, item.age, item);
}
设置过滤器和数据源:
dataView.RowFilter = "[Name] = 'Hans'";
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "TestItem";
comboBox1.DataSource = dataView;
这应该 return 只有汉斯作为结果,但对我来说这给出了结果:
汉斯和卢多。
如果我在 'Ludo' 上进行过滤,结果只会是 'Ludo'。
为什么它总是 return 最后一个元素,我如何确保它只 return 过滤后的集合?
-编辑
public static class DataViewExtensions
{
public static DataRowView AddNew(this DataView dataView, params object[] parameters)
{
DataRowView dataRowView = dataView.AddNew();
int index = 0;
foreach (var parameter in parameters)
{
dataRowView[index++] = parameter;
}
return dataRowView;
}
}
有一个例外,其他人似乎得到了
DataTable must be set prior to using DataView
(我建议你把它放在搜索引擎中)
虽然你没有得到异常,但你应该按照这个顺序。
幸运的是,在 DataView 之前设置 DataTable 可以用更少的代码完成,并且没有扩展方法。
TestClass[] items =
{
new TestClass{name = "Hans", age = 10 },
new TestClass{name = "Bert", age = 5 },
new TestClass{name = "Gerda", age = 41 },
new TestClass{name = "Dolf", age = 73 },
new TestClass{name = "Ludo", age = 35 },
};
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Columns.Add("TestItem", typeof(TestClass));
// set up the DataTable first
foreach (var item in items)
{
dataTable.Rows.Add(item.name, item.age, item);
}
// then use the DataView
DataView dataView = new DataView(dataTable);
dataView.RowFilter = "[Name] = 'Hans'";
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "TestItem";
comboBox1.DataSource = dataView;
使用 dataView.RowFilter 时,我总是得到包含数据集最后一个元素的过滤结果。
我有一个测试数据集:
private TestClass[] items =
{
new TestClass{name = "Hans", age = 10 },
new TestClass{name = "Bert", age = 5 },
new TestClass{name = "Gerda", age = 41 },
new TestClass{name = "Dolf", age = 73 },
new TestClass{name = "Ludo", age = 35 },
};
正在创建数据视图:
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Columns.Add("TestItem", typeof(TestClass));
DataView dataView = new DataView(dataTable);
foreach(var item in items)
{
dataView.AddNew(item.name, item.age, item);
}
设置过滤器和数据源:
dataView.RowFilter = "[Name] = 'Hans'";
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "TestItem";
comboBox1.DataSource = dataView;
这应该 return 只有汉斯作为结果,但对我来说这给出了结果: 汉斯和卢多。
如果我在 'Ludo' 上进行过滤,结果只会是 'Ludo'。 为什么它总是 return 最后一个元素,我如何确保它只 return 过滤后的集合?
-编辑
public static class DataViewExtensions
{
public static DataRowView AddNew(this DataView dataView, params object[] parameters)
{
DataRowView dataRowView = dataView.AddNew();
int index = 0;
foreach (var parameter in parameters)
{
dataRowView[index++] = parameter;
}
return dataRowView;
}
}
有一个例外,其他人似乎得到了
DataTable must be set prior to using DataView
(我建议你把它放在搜索引擎中)
虽然你没有得到异常,但你应该按照这个顺序。
幸运的是,在 DataView 之前设置 DataTable 可以用更少的代码完成,并且没有扩展方法。
TestClass[] items =
{
new TestClass{name = "Hans", age = 10 },
new TestClass{name = "Bert", age = 5 },
new TestClass{name = "Gerda", age = 41 },
new TestClass{name = "Dolf", age = 73 },
new TestClass{name = "Ludo", age = 35 },
};
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));
dataTable.Columns.Add("TestItem", typeof(TestClass));
// set up the DataTable first
foreach (var item in items)
{
dataTable.Rows.Add(item.name, item.age, item);
}
// then use the DataView
DataView dataView = new DataView(dataTable);
dataView.RowFilter = "[Name] = 'Hans'";
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "TestItem";
comboBox1.DataSource = dataView;