Sha*_*pta 5 .net c# asp.net gridview crystal-reports
我想在水晶报告中显示图像.场景就是这样的.
我有一个数据库,我的图像路径是持久的.例如ftp://Images/1.jpg
现在我想在水晶报告中重复这个图像.
当我填写我的datatable它显示我完整的网址.当我在GridView中显示此字段时,我用它imageBox来显示我的图像,它对我很有用.
但是当我试图用水晶报告做同样的事情时,它开始让我显示图像路径.现在这里而不是路径我想要显示图像.
好的,所以通过网络在CR报告中显示图像的泪痕如下:
1)假设如下:
a)CR 2008又称CR 12.我不知道早期版本,但XIR2(11.5)可能有效.
b)需要在报告中显示图片,并进行本地工作站开发和预览
c)IIS,ASP.NET应用程序,.NET 4.0
d)正确安装了Crystal Reports(这是一个完全不同的讨论,但是可以说,你最好有一个名为aspnet_client的文件夹,其子目录如下:
**system_web
4_0_30319
crystalreportviewers12**
Run Code Online (Sandbox Code Playgroud)
等等
这与Web应用程序的位置并行. 还有更多 - 但不是在这里......
e)图像就像照片或其他任何东西,但尺寸合理,字节不太大.
f)存在每个图像的缩略图,或者可以使用默认缩略图文件.
g)它们是JPG,PNG或BMP图像.否则,你运气不好AFAICT.如果它们是您希望在同一列表中显示的Word,PDF等文档,那么您也需要一个缩略图.但是,让我们继续关注图像主题......
h)您将图像组织到Web服务器上的文件夹层次结构中,或者Web服务器可以访问,但无论如何,网站都可以访问.我们假设它们都在主要位置D:\ MyDocuments下
我还没有尝试过这样一个FTP网站,比如原始问题,但我觉得它会起作用.
2)您需要一个数据库表或Web服务器可访问的其他类型的存储库来注册您的图像.DB格式是灵活的,但我们假设它是一个键入您感兴趣的主域的列表,其中每个主项目有0:N个图像,例如,住宅的图片,或者桥梁的图片,或者图片的图片房屋检查.此表具有文件的完整路径,或相对路径,或文件夹位置以及专用文件名列.无论如何,但他们必须创建一个文件路径:
D:\MyDocuments\folderA\folder1\area51\whatever\myfile.png
Run Code Online (Sandbox Code Playgroud)
所以数据库包含整个事物,或者它的一部分,或者比特,或者其他什么.
3)在本地/独立/不使用浏览器查看报告时,根文件夹是D:\ MyDocuments.这是一个任意名称,但现在要跟踪它.
4)您注册该根文件夹,以便CR可以找到它.这可以硬连接到您的报告(坏)或从INI文件(嗯,OK)或数据库字段中查找(为什么不,因为您仍在注册图像?)或作为参数传递给您想要显示图片或文档链接的报告(简单,但在部署到其他文件系统时会发生什么?)
5)在显示图片的报告中,我假设在这里N /感兴趣的项目如上面(2)所述,你有一个插入CR设计师的图片.将它链接到一些真正虚假的图片或默认图像,以便您可以判断您是否正在解析文件名....
6)从数据库中检索图片缩略图的路径,并根据需要将其与BACK SLASHES组合成文件名.它将存储在报表中的Shared StringVar FullQualifiedThumbnailFileName (比方说)中,并包含文档根目录,您可以在步骤(4)中将其提供给报表,并存储在专用的Shared StringVar DocRoot中(假设)PLUS计算得出文件名.所以公式字段FullyQualifiedThumbnailFileName看起来像:{@DocRoot}&FolderLocationFromDB&ThumbnailFileNameFromDB或在现实生活中:
D:\MyDocuments\folderA\folder1\area51\whatever\tn_myfile.png
Run Code Online (Sandbox Code Playgroud)
7)所以现在你有一个缩略图文件名.将其放在草稿报告的任何位置,这样您就可以在设计过程中看到它正在解决的问题.做同样的事情来引用REAL文件名并创建一个名为FullyQualifiedThumbnailFileName的变量.如果图片浏览器构造正确,它应该可以打开.把它放在某个地方,这样你就可以阅读它并用它来测试.
8)右键单击报表上的图片对象,选择"格式图形",单击图片选项卡,然后打开图片位置的公式图标.
在你开始抱怨我之前,请先看看顶部的假设 - 我不知道哪个早期版本的CR支持这个,或者他们是否采用不同的方式.
然后,在公式编辑器中,输入以下内容:
您在一分钟前创建的{@FullQualifiedThumbnailFileName}.您的缩略图是指向Web服务器或开发工作站上本地文件名的Windows DOS路径.
9)现在在报表中添加一个参数,或者创建一个公式变量,或者其他什么,默认情况下由字符串"file://"组成.这将在运行时使用httpContext.Current.Session应用程序根进行REPLACED,但我们将在一分钟内完成.我想你可以早点完成这个....命名这个WebURLRoot
10)创建一个名为txtImageURL的公式字段 无论如何,这个名称取决于你,但猜猜这里有什么?类似于以下内容:
if lowercase( {@WebURLRoot} ) = "file://" THEN
{@WebURLRoot} &
REPLACE( {@txtDocumentFileFullyQualifiedName},"/","\")
else
URLENCODE( {@WebURLRoot} &
REPLACE(
{*DocumentFileNameFromYourSource*}
,"\","/") )
Run Code Online (Sandbox Code Playgroud)
将文件名DocumentFileNameFromYourSource附加到WebURLRoot对我来说很有用,因为我的情况中的相对路径不包含DocRoot.你的情况可能会有所不同.无论如何,在独立模式下,此变量应解析为:
file://D:\MyDocuments\folderA\folder1\area51\whatever\myfile.png
Run Code Online (Sandbox Code Playgroud)
这不是缩略图.在Web上运行时,它应解析为:
http://somewebhost/website/folderA/folder1/area51/whatever/myfile.png
Run Code Online (Sandbox Code Playgroud)
因为我们要以某种方式向变量WebURLRoot提供http:// localhost/website.我是使用从Web应用程序传递的参数来完成的.它可以被查找或硬连线但请记住,如果网站被重新安置会发生什么?
将{@txtImageURL}放入超链接计算的文件名公式中,然后单击选项以指示它来自Internet上的网站AKA您的本地开发服务器或其他任何内容.
在独立模式下,txtImageURL中的文件字符串具有反斜杠.在运行时,它们被设置为正斜杠以获取完整的文件名.Crystal的URLEncode函数使它们非常适合Web用途.
再次将txtImageURL拖放到开发表面上,直到它变直.
11)你现在有一个CR RPT
a)包含文档树C:\ MyDocuments的Windows根目录的变量,您以任何方式提供给报表.我将它存储在我的应用程序连接的数据库中.
b)保存缩略图的Window路径的变量,由数据库中的缩略图名称和文档根构成
c)一个变量,它将Windows路径保存到您的真实文件名,再次由数据库中的实际文件名和文档根构成
d)一个网站的网址干这是文件://开发过程中和HTTP://本地主机/网站/在运行的网站.你正在通过这个
e)将网站URL干与实际文件组合在一起的图像文件的工作URL.
目前很好?拿一杯啤酒.也许2.
C#的变化
1)好的,所以我们需要调整我们的世界,以便在运行时将网站URL主干作为参数传递给报告.您无法使用Crystal Reports Viewer在Web上执行此操作.假设您已经关注了如何加载,参数化和显示来自Web应用程序的报告的众多示例之一,并且我认为您可以通过Google找到这些,请确保在您的应用程序中执行此操作.我在Session_Start事件中找到我的Global.asax.cs,根据authoer看起来非常合理... 请注意,信用是由于引用的URL人物......:
// so Crystal can receive the APP_Path as an argument
// Code that runs when a new session is started
// http://aquesthosting.headtreez.com/doc/d9ccf4d8-1873-469e-9dca-815e5854b963
string appPath = System.Web.HttpContext.Current.Request.ApplicationPath.ToLower();
if (appPath == "/") //a site
appPath = "/";
else if (!appPath.EndsWith(@"/")) //a virtual directory i.e. in a subfolder
appPath += @"/";
Session["APP_Path"] = appPath; //stores the value to a session variable for us to use
Run Code Online (Sandbox Code Playgroud)
2)现在,您可以在其中为报表创建参数,请确保将Session ["APP_Path"]作为参数传递,如下所示:
// START CHANGE
// this next check seems unlikely
if(! (HttpContext.Current.Session == null))
{
// pass HttpContext.Current.Session["APP_Path"].ToString() as a parameter
if (!(String.IsNullOrEmpty(HttpContext.Current.Session["APP_Path"].ToString())))// set in Global.asax.cs Start_Session
exporter.Arguments.Add(exporter.Arguments.Count, HttpContext.Current.Session["APP_Path"].ToString()); // to last parameter position
else
exporter.Arguments.Add(exporter.Arguments.Count, String.Empty); // or nothing to last parameter position
// end change
}
Run Code Online (Sandbox Code Playgroud)
其中exporter.Arguments包含我的报告的参数. 毫无疑问,你的情况会有所不同. 一个有点重要的事情是将此参数始终放在第一位或总是最后,这样其他参数就不会被它搞砸了.对报告本身中的参数使用相同的顺序.无论如何,这些参数显然将名称与名称相关联,但我认为混合它们是一个坏主意并最终令人困惑.
3)现在,您可以独立运行报告,当提示输入网站URL时,请输入file://.当在网络上运行相同的确切报告时,应用程序会发送它,无论网站是什么,但http:// localhost/website /.
陷阱:
1)在开发过程中,在报告中显示变量.确保对于缩略图,您始终使用服务器相关但完整的Windows/DOS路径,对于图片,开发期间的完整Windows/DOS路径前置为file://您始终可以在生产之前隐藏它们.
2)注意太多的斜线等.很容易得到一个双斜杠,搞砸了URL ...
3)请记住,Crystal通过某种神秘的序列来评估公式,但我知道在详细信息之前会处理页眉.我将所有常见变量,即DocRoot和WebSiteRootURL放在页眉中(甚至报表头,因为它们不会更改),因此它们首先被量化,细节带可以使用它们.
4)我将所有显示和列出的图片委托给嵌入式子报表.它使用Shared StringVar xyz方法共享所需的变量.它有点松鼠,但基本上子报告总是从容器报告中获取其常见内容的值(参见上面的注释3).为了布置那个子报告,我做了一个更小的子报告作为公共变量的持有者,所以我不必运行整个怪物.
5)这些'变量holderportports无法被抑制或值似乎无法解析.因此,使它们非常小和无边框,然后挤压页眉或任何隐藏它们的东西.我想文本和背景也可以设置相同,以便进一步隐藏它们,但是在完成摆弄布局等之后不要这样做,否则你将不得不四处寻找itty-bitty子报告.它们是您的本地内存变量.
6)独立的图像/文档/链接文件必须使用传统的DOS/Windows文件名路径(没有正斜杠).这些可以解决网站,但要制作一个超链接,斜杠必须前进,据我所知,所以假设你将不得不翻转.
7)作为旁注,我可以通过使用Junction Magic将〜/ MyDocuments重新映射到D:\ MyDocuments等,在开发期间将我的文档重新定位到网站层次结构中.Web服务器似乎并不关心它实际上是遍历D:\ MyDocuments但认为它位于网站的子文件夹中.但是,您可能必须使用虚拟目录方法 - 预先警告.或者,将文档存储在网站下,但不知何故,这似乎是klutzy.
8)我提到了许可问题了吗?不,但他们可能会咬你.确保IIS_IUSR和任何可以访问文件/文件夹等.
9)这不应该更容易吗?哦,谢谢你,无论如何SAP ......
显然,Request对象也拥有网站的URL干.如果您不想走全球路线,请使用它.
另外,我可能没有明确说明它,但CR OLE对象只能理解Windows ...而不是unix文件名约定.作为进一步的考虑,路径长度必须符合.最后,当我在网页上显示文件名时,我隐藏了DOS/Windows根目录和网站词干,只显示相对路径,例如〜/ Folder/Folder/File.png,这样文件的方式就不太明显了安排在网站上 - 可能是不必要的偏执,但也有好处,如果网站移动用户不要感到困惑.
问题可能会也可能不会得到答案.玩得开心.
Ray*_*Ray -1
我知道如果您使用的是 Visual Studio 附带的 Crystal Reports,则不支持此功能。它将显示存储在 db 字段中的图像,但不显示来自 url 的图像。
我认为(但不确定)Crystal 的任何版本都不支持用于显示图像的 ftp 协议。