从数据表配置动态列

本文关键字:动态 配置 数据表 | 更新日期: 2023-09-27 18:30:40

我正在创建一个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?

从数据表配置动态列

是的,它可以优化,你真的不需要内部 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;
最后这就是

解决它的方法。动态显示列并显示其中的值。

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