我正在编写一份报告来代表给定客户的工作安排。该报告必须类似于日历,并显示跨越多天的工作订单作为类似于Outlook的生成栏。
我使用两个Tablix控件很快地制作了日历。我现在的问题,以及这个问题的原因,是代表跨越事件。
目前,我渲染(当然使用测试数据):http://i.imgur.com/KISNhsx.png
我在存储过程中确定了很多东西(给定事件跨越多少天,给定事件的哪一天)并操纵每个单元格的背景和边框以便它们出现将被合并。除了单元格文本之外,这个工作正常:如果事件的名称太长,它就会被切断。
我做了一些研究,看起来你无法以编程方式合并单元格。我认为我最大的希望可能是以某种方式允许事件的名称溢出(有点如何在Excel中看到单元格溢出)。
这可能吗?
作为参考,我们使用的是SQL Server 2012,但是我通过VS2008使用BIDS来编写报告。这是一份普通的RDL报告。我并不反对购买能够为我做这件事的控件。
谢谢!
答案 0 :(得分: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();
}