从DataTable配置动态列

时间:2013-09-08 22:26:06

标签: c# datagridview

我正在创建一个DataGridView库,我在其中传递DataTable但没有显示所有列,而是有一个选项来配置列并选择要在网格上显示的列。这是我的功能

public void ConfigureColumns(DataTable dataTable, params String[] columnNames)
{
  var _dataGridView = new DataGridView();
  var index = 0;
  foreach (DataColumn column in dataTable.Columns)
  {
     var colName = column.ColumnName;
     foreach (var newColumn in from columnName in columnNames
            where columnName == colName
            select new DataGridViewTextBoxColumn {Name = columnName, Visible = true})
     {
          _dataGridView.Columns.Insert(index, newColumn);
           index++;
      }
   }
}

我在这里使用foreach两次,我只是想知道是否有任何方法可以优化它,还有如何在这些列中显示DataRows?

2 个答案:

答案 0 :(得分:2)

是的,它可以优化,你真的不需要内部的foreach循环。使用更合适的数据结构(例如HashSet),“if”语句就足够了。另外,您可以使用Add来代替Insert方法,因此您不必创建和维护索引字段。

public void ConfigureColumns(DataTable dataTable, params String[] columnNames)
{
    var _dataGridView = new DataGridView();
    HashSet<String> columns = new HashSet<String>(columnNames);

    foreach (DataColumn column in dataTable.Columns)
    {
        var colName = column.ColumnName;
        if (columns.Contains(colName)) 
        {
            var newColumn = new DataGridViewTextBoxColumn() {Name = columnName, Visible = true};
            _dataGridView.Columns.Add(newColumn);
        }
    }
}

构建网格后,只需调用:

_dataGridView.AutoGenerateColumns = false; // As you want to display a subset of the columns
_dataGridView.DataSource = dataTable;

答案 1 :(得分:0)

最后这是如何解决的..动态显示列并显示其中的值。

public void ConfigureColumns(DataTable dataTable, params String[] columnNames)
{
  var _dataGridView = new DataGridView();
  HashSet<String> columns = new HashSet<String>(columnNames);

  foreach (DataColumn column in dataTable.Columns)
  {
     var colName = column.ColumnName;
     if (columns.Contains(colName)) 
     {
         var newColumn = new DataGridViewTextBoxColumn() {Name = columnName, Visible = true};
    //    _dataGridView.Columns.Add(newColumn);
     }
  }

   var newTable = dataTable.DefaultView.ToTable(false, columnNames);
  _dataGridView.DataSource = newTable;
}