0

我正在写一份报告来代表给定客户的工作时间表。该报告必须类似于日历,并将跨越多天的工作订单显示为类似于 Outlook 的跨栏。

我使用两个 tablix 控件相当快地制作了日历。我现在的问题以及这个问题的原因是代表跨越事件。

目前,我渲染(当然使用测试数据):http: //i.imgur.com/KISNhsx.png

我正在确定存储过程中的很多事情(给定事件跨越多少天,给定事件是哪一天)并操纵每个单元格的背景和边框,以便它们看起来是合并的。除了单元格文本之外,这可以正常工作:如果事件的名称太长,它将被切断。

我做了一些研究,看来您无法以编程方式合并单元格。我认为我最大的希望可能是以某种方式允许事件名称溢出(就像您在 Excel 中看到单元格溢出一样)。

那可能吗?

作为参考,我们使用的是 SQL Server 2012,但我通过 VS2008 使用 BIDS 来制作报告。这是一份普通的 RDL 报告。我不反对购买可以为我做这件事的控件。

谢谢!

4

1 回答 1

0

我制定了另一个解决方案,满足了上级提出的要求。

简而言之:我创建了一个包含事件的简单 HTML 日历。然后我将页面呈现为图像(如屏幕截图)并使用 SSRS 中的图像控件来加载它。SSRS 报告将其参数作为查询字符串传递给网页。

对于那些通过网络搜索找到这个问题的好奇者,这是我用来创建位图的方法:

private Bitmap CreateScreenshot(string url, int width, int height)
    {
        Bitmap screenshot = null;

        var thread = new Thread(() =>
            {
                using (var browser = new WebBrowser())
                {
                    browser.ScrollBarsEnabled = false;
                    browser.ScriptErrorsSuppressed = true;

                    browser.Width = width;
                    browser.Height = height;

                    browser.Navigate(url);

                    while (browser.ReadyState != WebBrowserReadyState.Complete)
                    {
                        Application.DoEvents();
                    }

                    screenshot = new Bitmap(width, height);
                    browser.DrawToBitmap(screenshot, new Rectangle(0, 0, width, height));
                }
            });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();

        return screenshot;
    }

我从控制器内部调用它:

public void Action()
    {
        var model = new ViewModel
            {
                StartDate = new DateTime(2013, 6, 30),
                EndDate = new DateTime(2013, 8, 10),
                OpsId = ####
            };


        var url = Url.Action("ActionThatCallsCalendar", "Controller", new { area = "Area", viewModel = new JavaScriptSerializer().Serialize(model) }, Request.Url.Scheme);


        Response.ContentType = "image/jpeg";
        Response.Clear();

        var screenshot = CreateScreenshot(url, 1400, 1050);
        screenshot.Save(Response.OutputStream, ImageFormat.Jpeg);

        Response.Flush();
    }
于 2013-07-25T00:15:23.907 回答