首页 文章

如何在RDLC报告中动态调整表格列宽

提问于
浏览
2

我在C#中有一个显示表格的RDLC报告 .

我正在为用户提供一个工具来选择要在报告中显示的所需列 .

因此,当报告中的列数减少时,右侧页面的一半显示为空白,因此报告的显示看起来很糟糕 .

I want to find out a way using which either I can set the column size of the visible columns dynamically.
OR
I can change the table location so that the table is displayed in the centre of the page.

到目前为止,我发现我无法编写Expression或pass参数来设置RDLC Report中控件的大小或位置 .

我想知道是否有其他方法可以实现这一目标 .

4 回答

  • 0

    How To adjust each column size, Check Image

    单击任何列 Headers ,您将看到该表格的结构在 table 上方以灰色显示,从那里您可以调整列大小 . 请参阅附图,顶部指向“红色箭头”,这是您的表格结构,并且您可以在其中修改表格的结构 . 希望能帮助到你 .

  • 4

    你可以做的是在运行时更改rdlc,它只是和xml文件,所以你可以解析它并以编程方式设置表的宽度 . 我使用这种方法来翻译我的多语言报告,它工作正常 .

    此链接向您显示如何翻译报告,但此代码是一个很好的起点 . 我认为您可以轻松地为您的目的定制它 . Change RDLC XML

  • 1

    这可能是另一种选择:

    • 使列变小

    • 添加组行

    • 在顶部组行中,添加将用于组中两行的"push" col宽度的图像

    • 在图像属性上,将其设置为使用外部图像源并使用报告参数设置要使用的图像

    • 在图像上,设置"keep original size"

    编辑:您也可以动态生成这样的“填充图像”以允许不同的宽度,例如在MVC中:

    public class ImageUtilController : Controller
    {
        public FileContentResult GenerateTransparentRectangle(int width, int height)
        {
            var image = new Bitmap(width, height, PixelFormat.Format32bppArgb);
            using (var g = Graphics.FromImage(image))
            {
                g.Clear(Color.Transparent);
                g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, width, height);
            }
            MemoryStream ms = new MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return File(ms.ToArray(), "image/png");
        }
    }
    
  • 2

    To make visible columns expand and fill the space of excluded (hidden) columns so that report width is maintained, work needs to be done is as under.

    rdlc文件是一个xml文档 . 它将列宽定义为以下xml(这特定于使用Visual Studio 2005创建的RDLC文件,对于其他版本可能不同) . xml下面表示表中有6列 .

    <TableColumns>
          <TableColumn>
            <Width>0.5in</Width>
          </TableColumn>
          <TableColumn>
            <Width>1.125in</Width>
          </TableColumn>
          <TableColumn>
            <Width>1in</Width>
          </TableColumn>
          <TableColumn>
            <Width>1in</Width>
          </TableColumn>
          <TableColumn>
            <Width>0.5in</Width>
          </TableColumn>
          <TableColumn>
            <Width>1.375in</Width>
          </TableColumn>
        </TableColumns>
    

    基本上逻辑很简单,只需增加可见列的宽度即可 . 但它的实现需要很少的代码行 .

    • 计算隐藏列宽度的总和,然后重新计算可见列的宽度
    float[] resizedwidth;
        // code for recalculation goes here
    
    • 将整个报告xml读入字符串变量'rptxml'
    String rptxml = System.IO.File.ReadAllText(@"D:\SO\WinFormQ\WinFormQ\Report1.rdlc");
    
    • 用修改后的xml段替换上面的xml段
    int start = rptxml.IndexOf("<TableColumns>");
        int end = rptxml.IndexOf("</TableColumns>") + "</TableColumns>".Length;
        String resizedcolumns = String.format(
            "<TableColumns>"
            + "<TableColumn><Width>{0}in</Width></TableColumn>"
            + "<TableColumn><Width>{1}in</Width></TableColumn>"
            + "<TableColumn><Width>{2}in</Width></TableColumn>"
            + "<TableColumn><Width>{3}in</Width></TableColumn>"
            + "<TableColumn><Width>{4}in</Width></TableColumn>"
            + "<TableColumn><Width>{5}in</Width></TableColumn>"
            + "</TableColumns>"
            , resizedwidth[0], resizedwidth[1], resizedwidth[2], resizedwidth[3], resizedwidth[4], resizedwidth[5]
            );
        rptxml = rptxml.Substring(0, start) + resizedcolumns + rptxml.Substring(end);
    
    • 从字符串变量'rptxml'创建TextReader
    TextReader tr = new StringReader(rptxml);
    
    • 使用LoadReportDefinition()方法加载修改后的报表定义
    reportViewer1.LocalReport.LoadReportDefinition(tr);
    

    继续指定DataSources和ReportParameters等,最后显示报告 . 注意:不要忘记关闭TextReader tr.Close() .

相关问题