从选择中排除DataGridView的最后一列

时间:2016-03-27 08:05:05

标签: c# winforms linq datagridview

我正在尝试获取除DataGridView之外的所有列名称的列表。

以下内容返回所有列:

var columnsList = datagridview.Columns
            .Cast<DataGridViewColumn>()
            .Select(c => c.Name);

我尝试使用Except删除返回值的最后一列:

 var columnsList = datagridview.Columns
            .Cast<DataGridViewColumn>()
            .Select(c => c.Name)
            .Except((datagridview.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.Visible).Name));

我收到IEnumerable<string>不包含Except定义的错误。

如何实现它?

3 个答案:

答案 0 :(得分:2)

您可以在takingn-1列中排除最后一列:

var columnsList = datagridview.Columns
                              .Cast<DataGridViewColumn>()
                              .Take(datagridview.Columns.Count-1)
                              .Select(c => c.Name);

答案 1 :(得分:1)

Except需要一个集合作为输入参数。这是一个设置操作:set1减去set2。所以技术上,它应该是

var lastColumn = datagridview.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.Visible).Name;
var columnsList = datagridview.Columns
            .Cast<DataGridViewColumn>()
            .Select(c => c.Name)
            .Except(new[] { lastColumn });

但是,当然,正如已经回答的那样,使用Take(n-1)要容易得多,其中n是列数。

答案 2 :(得分:1)

获取DataGridView的所有列名称列表,除了最后一个= 先取datagridview.Columns.Count - 1

由于Columns有一个索引器并且只实现IEnumerable(非泛型),我会在这里使用Enumerable.Range

var names = Enumerable.Range(0, datagridview.Columns.Count - 1)
                      .Select(idx => datagridview.Columns[idx].Name);