DataView rowfilter始终包含最后一组

时间:2017-04-03 14:33:50

标签: c# combobox datasource dataview rowfilter

使用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;

这应该只返回汉斯作为结果,但对我来说这给出了结果: 汉斯和卢多。

如果我过滤'Ludo',它只会产生'Ludo'。 为什么它总是返回最后一个元素,如何确保它只返回过滤后的集合?

-edit

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;
    }
}

1 个答案:

答案 0 :(得分:0)

其他人似乎有一个例外

  

必须在使用DataView

之前设置DataTable

(我建议你把它放在搜索引擎中)

虽然您没有获得例外,但您应该遵循此顺序。

幸运的是,在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;