使用lambda表达式的Columns.Add

时间:2018-12-08 13:36:37

标签: c#

我正在使用一些将Columns.Add与lambda表达式结合使用的代码,并且想了解它为什么/如何工作。这是一个代码段:

public ReportGrid(List<ReportRowDataContract> items)
            : base(items)
        {    
                if (items[0].ReportData1 != null)
                {
                    if (items[0].ReportData1.DecimalValue != null)
                    {

                        Columns.Add(m => m.ReportData1.DecimalValue).Titled(items[0].ReportData1.Name).Encoded(false).
                            Sanitized(false).RenderValueAs(
                                m => (string.IsNullOrEmpty(@m.ReportData1.DisplayFormat)) ? Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString("N") : Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString(@m.ReportData1.DisplayFormat));

                        if (items[0].ReportData1.SumValue || items[0].ReportData1.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData1.Name,
                                        AvgValue = items[0].ReportData1.AvgValue,
                                        DecimalValue = 0
                                    });
                        }
                    }
                    else if (items[0].ReportData1.IntValue != null)
                    {
                        Columns.Add(m => m.ReportData1.IntValue).Titled(items[0].ReportData1.Name);
                        if (items[0].ReportData1.SumValue || items[0].ReportData1.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData1.Name,
                                        AvgValue = items[0].ReportData1.AvgValue,
                                        IntValue = 0
                                    });
                        }
                    }
                    else
                    {
                        Columns.Add(m => m.ReportData1.StringValue).Titled(items[0].ReportData1.Name);
                    }
                }
                if (items[0].ReportData2 != null)
                {
                    if (items[0].ReportData2.DecimalValue != null)
                    {
                    Columns.Add(m => m.ReportData2.DecimalValue).Titled(items[0].ReportData2.Name).Encoded(false).
                       Sanitized(false).RenderValueAs(
                           m => (string.IsNullOrEmpty(@m.ReportData2.DisplayFormat)) ? Convert.ToDecimal(@m.ReportData2.DecimalValue).ToString("N") : Convert.ToDecimal(@m.ReportData2.DecimalValue).ToString(@m.ReportData1.DisplayFormat));

                    if (items[0].ReportData2.SumValue || items[0].ReportData2.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData2.Name,
                                        AvgValue = items[0].ReportData2.AvgValue,
                                        DecimalValue = 0
                                    });
                        }
                    }
                    else if (items[0].ReportData2.IntValue != null)
                    {
                        Columns.Add(m => m.ReportData2.IntValue).Titled(items[0].ReportData2.Name);
                        if (items[0].ReportData2.SumValue || items[0].ReportData2.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData2.Name,
                                        AvgValue = items[0].ReportData2.AvgValue,
                                        IntValue = 0
                                    });
                        }
                    }
                    else
                    {
                        Columns.Add(m => m.ReportData2.StringValue).Titled(items[0].ReportData2.Name);
                    }

                }

此方法由重复执行到ReportData6的代码组成,每次重复仅更改ReportData字段名称。

这是ReportRowDataContract类:

public class ReportRowDataContract
{   
    public ReportDataDataContract ReportData1 { get; set; }

    public ReportDataDataContract ReportData2 { get; set; }

    public ReportDataDataContract ReportData3 { get; set; }

    public ReportDataDataContract ReportData4 { get; set; }

    public ReportDataDataContract ReportData5 { get; set; }

    public ReportDataDataContract ReportData6 { get; set; }

    // an indexed property - for accessing report data fields by index
    public ReportDataDataContract this[int i]
    {
        get
        {
            return new ReportDataDataContract[]
            {
              ReportData1,
              ReportData2,
              ReportData3,
              ReportData4,
              ReportData5,
              ReportData6                  
            }[i];
        }
    }

    public int GetReportDataFieldCount()
    {
        return 6;
    }        
}

不幸的是,我无法更改此类的结构,因此我试图将第一个代码块转换为循环的方法。但是,我对Columns.Add实际添加的内容有所了解。

到目前为止,这是我的代码:

    public ReportGrid(List<ReportRowDataContract> items)
        : base(items)
    {
        // get count of how many fields exist in ReportRowDataContract                     
        int reportDataFieldCount = (new ReportRowDataContract()).GetReportDataFieldCount();

        // create columns for grid for each field in ReportRowDataContract
        //foreach (ReportRowDataContract item in items)
        //{
            int i = 0;
            while (i < reportDataFieldCount)
            {
                AddGridColumn(items[0][i]);
                i++;
            }
        //}
    }

    private void AddGridColumn(ReportDataDataContract reportColumn)
    {
        if (reportColumn != null)
        {
            if (reportColumn.DecimalValue != null)
            {
                Columns.Add(m => m.ReportData1.DecimalValue).Titled(reportColumn.Name).Encoded(false).
                    Sanitized(false).RenderValueAs(
                        m => (string.IsNullOrEmpty(@m.ReportData1.DisplayFormat)) ?
                            Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString("N") :
                            Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString(@m.ReportData1.DisplayFormat));

                if (reportColumn.SumValue || reportColumn.AvgValue)
                {
                    displaySummary = true;
                    SummaryData.Add(
                        new ReportDataDataContract
                        {
                            Name = reportColumn.Name,
                            AvgValue = reportColumn.AvgValue,
                            DecimalValue = 0
                        });
                }
            }
            else if (reportColumn.IntValue != null)
            {
                Columns.Add(m => m.ReportData1.IntValue).Titled(reportColumn.Name);
                if (reportColumn.SumValue || reportColumn.AvgValue)
                {
                    displaySummary = true;
                    SummaryData.Add(
                        new ReportDataDataContract
                        {
                            Name = reportColumn.Name,
                            AvgValue = reportColumn.AvgValue,
                            IntValue = 0
                        });
                }
            }
            else
            {
                Columns.Add(m => m.ReportData1.StringValue).Titled(reportColumn.Name);
            }
        }
    }

AddGridColumn方法中,有问题的部分是m => m.ReportData1。它不是动态的,因此第一个循环很好,但是在第二个循环中抛出异常:System.ArgumentException {"Column 'ReportData1.StringValue' already exist in the grid"}。我知道m.ReportData1需要更改或方法修改了……只是不知道该怎么做。

编辑#1::根据VitezslavSimon的见解禁用foreach。抛出相同的异常消息。

编辑#2:网格的基类(我认为)。

public class Grid<T> : GridBase<T>, IGrid where T : class
    {
        public Grid(IEnumerable<T> items);
        public Grid(IQueryable<T> items);

        public IGridColumnCollection<T> Columns { get; }
        public bool DefaultFilteringEnabled { get; set; }
        public bool DefaultSortEnabled { get; set; }
        public virtual int DisplayingItemsCount { get; }
        public bool EnablePaging { get; set; }
        public string Language { get; set; }
        public IGridPager Pager { get; set; }
        public GridRenderOptions RenderOptions { get; set; }
        public ISanitizer Sanitizer { get; set; }
        public override IGridSettingsProvider Settings { get; set; }

        public virtual void AutoGenerateColumns();
        protected internal virtual IEnumerable<T> GetItemsToDisplay();
    }

1 个答案:

答案 0 :(得分:0)

似乎您只需要在此添加一次列。尝试通过在那里声明一个标志来帮助它。这也取决于网格组件的工作方式。

您的代码以及建议的变更草案:

public ReportGrid(List<ReportRowDataContract> items)
    : base(items)
{
    // get count of how many fields exist in ReportRowDataContract                     
    int reportDataFieldCount = (new ReportRowDataContract()).GetReportDataFieldCount();

    // create columns for grid for each field in ReportRowDataContract
    bool flag = true;

    foreach (ReportRowDataContract item in items)
    {
        int i = 0;
        if (flag) {
        while (i < reportDataFieldCount)
        {
            AddGridColumn(items[0][i]);
            i++;
        }
        flag = false;
        }
    }
}