Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataView行筛选器始终包含集合的最后一个_C#_Combobox_Datasource_Dataview_Rowfilter - Fatal编程技术网

C# DataView行筛选器始终包含集合的最后一个

C# DataView行筛选器始终包含集合的最后一个,c#,combobox,datasource,dataview,rowfilter,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 = "Do

使用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;
这应该只返回Hans作为结果,但对我来说,这给出了结果: 汉斯和卢多

如果我对“Ludo”进行筛选,则只会得到“Ludo”。 为什么它总是返回最后一个元素,如何确保它只返回过滤集

-编辑

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

其他人似乎也有例外

必须在使用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;

我正在测试您的代码,我没有
DatView.AddNew(arg1,arg2,arg3)
的重载,只是。您是否在不同的命名空间中重写了此方法?当填充datatable而不是dataView,然后从填充的datatable创建dataView时,它可以工作。@djv是的,很抱歉,我使用这个函数不必为每一列本身赋值。相反,我做了一个扩展,在参数上循环以分配值。感谢您的清晰解释和研究。这就把事情弄清楚了。