根据数据源字段动态设置报表中的列数量以及列宽度

在报表系统中,我们通常会有这样的需求,就是由用户来决定报表中需要显示的数据,比如数据源中共有八列数据,用户可以自己选择在报表中显示哪些列,并且能够自动调整列的宽度,已铺满整个页面。本文就讲解一下ActiveReports中该功能的实现方法。

第一步:设计包含所有列的报表模板,将数据源中的所有列先放置到报表设计界面,并设置你需要的列宽,最终界面如下:

第二步:在报表的后台代码中添加一个Columns的属性,用于接收用户选择的列,同时,在报表的ReportStart事件中添加以下代码:

    /// <summary>
    /// 用户选择的列名称
    /// </summary>
    public List<string> Columns;

    private void Report1_ReportStart(object sender, EventArgs e)
    {
        // 定义临时变量
        int count = 0;
        float width = 0;
        Label tmp = null;

        // 列头控件
        List<Label> headers = new List<Label>();
        headers.Add(this.label1);
        headers.Add(this.label2);
        headers.Add(this.label3);
        headers.Add(this.label4);
        headers.Add(this.label5);
        headers.Add(this.label6);
        headers.Add(this.label7);
        headers.Add(this.label8);

        // 数据控件
        List<TextBox> cols = new List<TextBox>();
        cols.Add(this.textBox1);
        cols.Add(this.textBox2);
        cols.Add(this.textBox3);
        cols.Add(this.textBox4);
        cols.Add(this.textBox5);
        cols.Add(this.textBox6);
        cols.Add(this.textBox7);
        cols.Add(this.textBox8);

        List<CrossSectionLine> lines = new List<CrossSectionLine>();
        lines.Add(crossSectionLine1);
        lines.Add(crossSectionLine2);
        lines.Add(crossSectionLine3);
        lines.Add(crossSectionLine4);
        lines.Add(crossSectionLine5);
        lines.Add(crossSectionLine6);
        lines.Add(crossSectionLine7);

        // 隐藏不需要显示的控件,并计算需要显示控件的总宽度
        for (int c = 0; c < cols.Count; c++)
        {
            if (!Columns.Contains(cols[c].DataField))
            {
                headers[c].Visible = false;
                cols[c].Visible = false;
                if (c < cols.Count - 1)
                {
                    lines[c].Visible = false;
                }
            }
            else
            {
                width += headers[c].Width;
            }
        }

        // 调整列的位置以及宽度
        for (int c = 0; c < cols.Count; c++)
        {
            // 隐藏控件不需要处理
            if (cols[c].Visible == false)
            {
                continue;
            }

            headers[c].Width = headers[c].Width * (this.PrintWidth / width);
            cols[c].Width = headers[c].Width;

            // 设置控件坐标
            if (tmp == null)
            {
                // 设置需要显示的第一列坐标
                headers[c].Location = new PointF(0, headers[c].Location.Y);
                cols[c].Location = new PointF(headers[c].Location.X, cols[c].Location.Y);
            }
            else
            {
                // 设置需要显示的非第一列坐标,应该为前一列坐标加上宽度
                headers[c].Location = new PointF(tmp.Location.X + tmp.Width, headers[c].Location.Y);
                cols[c].Location = new PointF(headers[c].Location.X, cols[c].Location.Y);
            }


            // 调整边线位置
            if (c < headers.Count - 1)
            {
                lines[c].Start = new PointF(headers[c].Location.X + headers[c].Width, lines[c].Start.Y);
                lines[c].End = lines[c].Start;
            }
            count += 1;
            tmp = headers[c];
        }
    }

第三步:运行报表,在运行报表之前需要指定用户选择的列:

 

 

源码下载:

 

 

动态设置报表中的列数量以及列宽度

时间: 2024-10-25 03:52:39

根据数据源字段动态设置报表中的列数量以及列宽度的相关文章

如何动态切换报表中的图表类型

今天被人问到这样一个问题:如何动态地切换报表中的图表类型,例如能不 能同时支持柱状图和饼图,而且用户可以切换? 开发的环境是Reporting Service. 我为此做了一些研究,下面这个范例可以解释这个问题 为了做这个演示,我们需要在Northwind数据库中,准备一个特殊的存储过程,它可以根据国家统计出来销售额. CREATE procedure [dbo].[SaleReportByCountry] @Beginning_Date DateTime, @Ending_Date DateT

请问如何设置myfaces中的panelTab组件tab的宽度?

问题描述 使用此组件生成tab页.但tab自动占满100%宽度.比如如有两个tab页,每个tab的宽度就是整个宽度的一半.现在想把tab变小一点,让他只占50px的宽度,如何设置?谢谢! 解决方案 解决方案二:把知道,没看到有什么地方可以设置

如何在水晶报表中动态添加字段

原文:如何在水晶报表中动态添加字段 问题:水晶报表中,因为数据源的字段是不固定的,可否在运行时动态添加字段,就象在winform中动态添加控件一样?(更新:2003-11-05)--------------------------------------解决方案:用"公式字段"1.根据字段的最大数量,定义若干个"公式字段",FormulaFeild1.FormulaFeild2--,公式为空:2.把"公式字段"按顺序放在"详细资料&qu

怎么动态设置水晶报表字段宽度

问题描述 怎么动态设置水晶报表字段宽度?用公式还是什么方法?如两列字段A.字段B,如果字段B为空的话,字段A的宽度=字段A的宽度+字段B的宽度CrystalReportSource1.ReportDocument.ReportDefinition.ReportObjects["custDesc1"].Width=CrystalReportSource1.ReportDocument.ReportDefinition.ReportObjects["custDesc1"

谁能告诉我水晶报表中怎么能设置字段的垂直居中属性!!!

问题描述 谁能告诉我水晶报表中怎么能设置字段的垂直居中属性!!!本人刚注册没多少分.谁告诉我了以后一定把分送上! 解决方案 解决方案二:水平居中是可以设置的,垂直还没发现不过可以拖动字段的框来改变位置

flash中在文本字段上设置网格实例

创建一个新的 Flash 文档,并将其另存为 gridfittype.fla.     从"库"面板右上角的弹出菜单中选择"新建字型".     从"字体"下拉菜单中选择"Arial"字体,并将字体大小设置为 10 磅.     在"名称"文本框键入字体名称 Arial-10 (embedded),然后单击"确定".     右键单击库中的字体元件,然后选择"链接"打

css 中table的列宽怎样动态设置?

问题描述 css 中table的列宽怎样动态设置? css 中table的列宽怎样取外界div宽度与列中内容长度的最大值? 如上图,未对table的列宽做设置,当列中内容很长超出外界div宽度时,出现滚动条, 显示正常,但当列中内容长度小于外界div宽度时,蓝色阴影只是内容的长度,不能填充整行.求大神们帮忙解答一下,谢谢~~~ 解决方案 通过style设置min-width:30px为你div的宽度 解决方案二: jquery遍历一遍取div的scrollWidth,然后设置下td的宽度. 解决

数据源-ETL中的SSIS问题, 列字段如何拆分成行字段 求解?

问题描述 ETL中的SSIS问题, 列字段如何拆分成行字段 求解? 碰到个问题,原数据源的SQL语句查询出一条信息,值为3,如果通过SSIS去拆解成三条信息? 例子: SQL语句查询出这样一条信息: 表 A ID str 1001 3 用什么方法.什么控件,提取成这样 表B ID str 1001 1 1001 1 1001 1 解决方案 自己搞定了.写存储过程.打扰各位了. 解决方案二: 自己找了下,有个"透视"控件,但只是将列转换为行:这里需要先判断列值里的数字值,根据数字值转换成

vb.net泛型-怎么动态设置VB.NET的(of T)中的T值

问题描述 怎么动态设置VB.NET的(of T)中的T值 VB.Net中,可以使用function AAA(Of T)(xxx as T) As String这种形式设置参数类型.在调用的时候,如果是AAA(Of String)这种形式来调用的话,没问题,现在有需求如下有一个数组类型为Type,需要根据数组的值来调用AAA方法,并取得返回值. dim supportTypes as list(of type) supportTypes.Add(GetType(String)) supportTy