0

我想对一组项目执行例外操作。

代码是这样的:

IEnumerable<DataGridViewColumn> dgvColumns = dataGridView.Columns.OfType<DataGridViewColumn>();
IEnumerable<DataColumn> dsColumns = dataSet.Tables[0].Columns.OfType<DataColumn>();

现在,如何从 dataSet.Tables[0] 中选择不在 dgvColumns 中的列?我知道 DataGridView 中的列与 DataSet 中的列类型不同。我只想选择公共值的一个子集。像这样:

        var ColumnsInDGV = from c1 in dgvColumns
                           join c2 in dsColumns on c1.DataPropertyName equals c2.ColumnName
                           select new { c1.HeaderText, c1.DataPropertyName, c2.DataType, c1.Visible };

上面的代码选择了两组中的“列”。所以我坚持我将在 DataSet 中创建另一组“列”:

  var ColumnsInDS = from c2 in dsColumns select new { HeaderText = c2.ColumnName, DataPropertyName = c2.ColumnName, c2.DataType, Visible = false };

现在我将能够执行以下操作:

var ColumnsOnlyInDS = ColumnsInDS.Except<ColumnsInDGV>;

但我收到两个错误:

  1. 找不到类型或命名空间名称“ColumnsInDGV”(您是否缺少 using 指令或程序集引用?)
  2. 无法将方法组分配给隐式类型的局部变量

所以解决方案是构建一个类,然后使用它而不是隐式类型的局部变量。但我认为仅出于这个原因开发一个类并不是必要的开销。

这个问题还有其他解决方案吗?

4

1 回答 1

3

你几乎明白了。你只需要写:

// use () to pass a parameter
// type (should) be inferred
var ColumnsOnlyInDS = ColumnsInDS.Except(ColumnsInDGV);

代替:

// do not use <> - that passes a type parameter;
// ColumnsInDGV is not a type
var ColumnsOnlyInDS = ColumnsInDS.Except<ColumnsInDGV>;

更新:因此,上述内容实际上不起作用,因为Except取决于比较两个序列中的项目是否相等;显然,您的匿名类型没有被覆盖object.Equals,因此您创建的这种类型的每个对象都被视为一个不同的值。试试这个*:

var dgvColumns = dataGridView.Columns.Cast<DataGridViewColumn>();
var dsColumns = dataSet.Tables[0].Columns;

// This will give you an IEnumerable<DataColumn>
var dsDgvColumns = dgvColumns
    .Where(c => dsColumns.Contains(c.DataPropertyName))
    .Select(c => dsColumns[c.DataPropertyName]);

// Then you can do this
var columnsOnlyInDs = dsColumns.Cast<DataColumn>().Except(dsDgvColumn);

*注意:Where在上面的表达式中 for比因为它将对所有结果应用指定的过滤器dsDgvColumns更有意义。只会应用过滤器,只要它是真的,然后就会停止应用它。换句话说,如果您未绑定到您的开头,它将起作用;但如果它在中间或最后,则不是。SkipWhileSkipWhileDataGridViewColumnDataSetDataGridView

于 2010-07-22T12:54:48.937 回答