根据第二列中的值过滤组合框项目

时间:2011-02-06 05:37:51

标签: c#

我有一个数据表(invTable),其中有19列,我是从csv文件创建的。从那个Datatable我使用column2(name)中的值来填充Combobox。

我需要做的是仅当column9(type)中的值与预设值匹配时,才会过滤出在Combobox中显示的column2(name)中的项目。即,仅当column9(type)中的值为15时才会显示。

我还需要能够根据Combobox中的选定项处理其余列中的值。将它们分配给诸如SelectedCol1-SelectedCol19之类的变量,以便它们可以在整个程序中用于其他计算。

编辑: 我能够通过以下代码找到适合我需求的东西。

var query = invTable.AsEnumerable().Where(c => c.Field<String>("Type").Equals("15"));
combo1.DataSource = query.AsDataView();
combo1.DisplayMember = "name";
combo1.ValueMember = "Index";

1 个答案:

答案 0 :(得分:0)

我不会试图在这里给你一个完整的解决方案,但我希望不会向你发送正确的方向。

基本上你需要使用DataView(这是原始DataSet的“过滤”视图。所以每次想要过滤时,你都会创建一个DataView,为它指定过滤条件。

http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx

上面的链接可以为您提供有效的解决方案。在时代的底部,他们也有例子。

按照您需要的方式过滤DataView后,您可以迭代它的行以填充相关的下拉列表。

已编辑,为OP提供简单的步骤。

开始简单。我假设您知道如何填充ComboBox。

步骤1:获取DataSet中的数据 第2步:使用DataView过滤DataSet Step3:使用DataView(而不是DataSet)填充ComboBox

伪代码:

DataSet dt = GetInvDataTable();
DataView dv = new DataView(dt, "type = 15", null,
        DataViewRowState.CurrentRows);

现在您可以使用DataView(变量dv)来填充CombobBox,就像您最初使用DataSet一样。

如果您正在使用BindingSource,那么只需将BindingSource的DataSource设置为DataView(在本例中为dv)。

您没有提到您正在使用的.NET版本,但如果您使用的是3.5或4,那么您也可以使用linq来过滤您的DataSet。您需要添加DataSetExtensions程序集作为对项目的引用。

DataTable invDataTable = GetInvDataTable();

EnumerableRowCollection<DataRow> query =
    from inv in invDataTable.AsEnumerable()
    where order.Field<int>("type") == 15
    select inv;

DataView dv = query.AsDataView();

bindingSource1.DataSource = dv;