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