【问题标题】:Dynamically add columns to a gridview in C# - Too many if statements在 C# 中将列动态添加到 gridview - if 语句过多
【发布时间】:2012-05-09 15:10:50
【问题描述】:

我正在清理一些代码,我正在使用的是在 C# 的代码隐藏中创建的 gridview。创建的 boundfields 有一个 visible 属性,稍后将确定它是否添加到 gridView 将包含的列集合中。

gridView 构建时,它引用一个表示默认列集合的属性,但在此属性中,每个 boundfield 的可见属性都使用 if 语句进行评估,如果它是可见的,则将其添加到集合中。代码如下所示:

private GridView.BaseFieldCollection _defaultColumns;

private GridView.BaseFieldCollection DefaultColumns
{
    get
    {
        if (Col1.Visible)
        {
            _defaultColumns.Add(Col1);
        }
        if (Col2.Visible)
        {
            _defaultColumns.Add(Col2);
        }
        if (Col3.Visible)
        {
            _defaultColumns.Add(Col3);
        }
        if (Col4.Visible)
        {
            _defaultColumns.Add(Col4);
        }
        if (Col5.Visible)
        {
            _defaultColumns.Add(Col5);
        }
    }
}

问题是要评估大约 30 个字段,并且有 30 个左右的 if 语句不适合我。我希望可能有一个更优雅的解决方案。尽管我想到将所有列添加到某种集合对象(列表、数组等)中,然后循环遍历它,但这样做似乎效率较低。

关于如何更优雅地做这样的事情有什么想法吗?我被难住了……

谢谢

【问题讨论】:

  • 为什么不添加所有列并让可见性决定它们是否显示?
  • 你不能把这些Col[x] 字段变成一个数组并循环遍历它吗?
  • zneak 的解决方案将使您能够使用 LINQ:columns.Where(c => c.Visible)

标签: c# gridview if-statement


【解决方案1】:

但似乎这样做可能效率较低

在此代码成为瓶颈之前,这​​无关紧要。投入一些,例如,数据库访问,这部分代码永远不会成为瓶颈。

var cols = new[] {Col1,Col2,Col3}; // etc
foreach(var col in cols)
{
  if(col.IsVisible)
    _defaultColumns.Add(col);
}

或许:

var cols = new[] {Col1,Col2,Col3}; // etc
_defaultColumns.AddRange(cols.Where(c => c.IsVisible));

【讨论】:

  • 你打败了我,你使用 LINQ 让你的答案更出色
【解决方案2】:

您可以使用转换器显示(或不显示)在其可见性属性上绑定的列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多