我使用VS2005开发WEB系统,需要打印报表,使用Reporting Service 2005,但调试到打印时,出现自定义纸张21*14,宽超过高时,就出现自动横向页,强制纵向打印就失真了,无办法,只好放弃,使用VS2005自带的水晶报表,我放到三四级目录时,调试老是提示“加载报表失败。”不知为何,我已经搜索过相关文章需要用相关路径改为"../../xxx/xxx"时,在CrystalReportViewer控件内可正常阅览,但调试在WEB中打开就提示“加载报表失败”,郁闷,新建立一个项目,将所有东西都放到项目根目录一且正常,又不知为和,现在就是将PrintMode="ActiveX"后,点打印按钮弹出一个摸态窗,但毫无反应,也不提示安装ActiveX,这回是真不知道为什么了,但如果是打印为PDF是正常弹出,也是正常打印出PDF,晕。

发到CSDN也是没有回答,只有人问。

我GOOGLE遍所有地方都未找到答案,也只是老是见到有人问这个问题,就是没有人回答,真是心寒呀。

水晶报表调试的确比较麻烦,因为一直看到别人发贴说麻烦,搞得没有用就开始心荒了,上面是我前几天遇到的问题。

问题解决,找到原因了,有两个原因
不知道是不是巧合,前两天因深圳有小地震,说是光缆坏了,访问国外网站有点慢。
不知道为什么水晶报表不把ActiveX提供给用户自已放到自已服务器下载,一定要链接到他的服务去下载,导致我很久连接不上,搞得ActiveX安装失败。
还有就是不知道是不是我安了IE7的原因,说IE权限不够,不能安装,我将权限都打开,再将ActiveX用迅雷下载回来放到本地,自已写代码安装后成功了。

这里是在家里调试的结果,因为家里安装的是IE7,下面的第二天在办公室调试的结果,办公室是IE6.

===================================
微软MSDN给的答案

使用 ActiveX 控制項列印

在 Crystal Reports 的更新版本中,您可以使用新的 CrystalReportViewer.PrintMode 屬性來指定列印模式。其中包含兩個列舉型別:ActiveX 和 PDF。

當屬性設定為 PrintMode.PDF 時,報表會在 Web 伺服器上匯出為 PDF,然後以資料流傳送到瀏覽器。使用者可以利用選項,直接列印至印表機。這個選項是跨平台相容的。
當屬性設定為 PrintMode.ActiveX 時,ActiveX 列印控制項允許使用者將報表直接列印至本機印表機。
注意   在 Crystal Reports for Visual Studio 2005 中,為符合 Microsoft 安全性需求起見,並沒有將 ActiveX 列印控制項安裝在本機電腦上。而是必須製成 .cab 檔案,讓人從外部 URL 來存取。PrintControl.cab 檔案可以從 Business Objects 技術支援網站下載取得,這時就可以將 cab 檔案放在 Web 伺服器虛擬目錄中,以供 URL 存取之用。
若要在 Crystal Reports for Visual Studio 2005 網站顯示 cab 檔案,請將下列 xml 加入網站的 web.config 檔案:
<configSections>
  <sectionGroup name="businessObjects">
    <sectionGroup name="crystalReports">
      <section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
    </sectionGroup>
  </sectionGroup>
</configSections>

<businessObjects>
  <crystalReports>
    <printControl>
      <add key="url" value="http://myserver/PrintControl.cab" />
    </printControl>
  </crystalReports>
</businessObjects>
注意   只有 Internet Explorer 才會支援 ActiveX 控制項。若從非 Internet Explorer 的用戶端 (FireFox、Safari、Mozilla 等) 列印,將會回復到 PDF 匯出對話方塊。
=====================================

经过我的测试,是IE升级了补丁,对摸态窗的安全加强了,所以就算你将文件放到本地服务器估计也安装失败,除非你自已写代码连续弹出两次摸态窗,才会提示安装,不过这样给用户是不可能的。

我测试过,将代码写入摸态窗,打开页面就自动弹出执行会出错,除非你设个定时器,过30秒或一分钟后再弹出是正常的。

所以完全可以将他的CAB下载回来放到本地服务器,然后写下面代码放到一个单独的页面放用户先安好。

先下载http://support.businessobjects.com/CRforVS2005/PrintControl.cab,放到自已的服务器上。

<object id="CrystalPrintControl" classid="CLSID:BAEE131D-290A-4541-A50A-8936F159563A" codebase="http://127.0.0.1/rpt/PrintControl.cab" #Version="10,2,0,1078" viewastext></object>

#Version是版本号,如果你是其他的版本将版本号修改一下即可。



接着是加载报表失败的问题,因为我新建立一个空项目是正常的,代码是肯定没有问题,所以问题一定在WEB.CONFIG配制文件里,因为我的环境比较复杂,所以WEB.CONFIG是很多配制,就一个一个拆吧,拆到<identity impersonate="true"/>时,也,正常了,原来是不能将他设为true,将他改为<identity impersonate="false"/>就正常了。

调试到一段落,再来后面还会遇到很多麻烦,再一个一个去解决吧。


posted @ 2006-12-31 14:12 BookWorm 阅读(3646) | 评论 (8)编辑

附件是MDaemon邮件服务器的用户邮件配置文件
/Files/bookworm/IMAP.rar

使用MDaemon邮件服务器的朋友应该不少,我也使用了几年,与办公系统整合等都没有问题,但有一个问题一直困扰着我,我查遍了MDaemon老巢都未找到如何获得用户有多少封未读(新)邮件的方法,MDUSERCOMLib.dll所以提供的方法我都试过了,看了MDaemon论坛提示只能通过imap.mrk来获得。

所以我想写一个应用服务在服务器,定时去读取分析每个用户的imap.mrk文件,获得他的新邮件数,再写到SQL中,但我怎么查也查不到他的编码方式,我在CSDN发个贴无人能解,希望有解码高手或是知道别的方式获得新邮件方法的朋友帮个忙,谢谢。

posted @ 2006-10-17 11:04 BookWorm 阅读(375) | 评论 (0)编辑
     摘要: 五舍六入:
Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.
四舍五入:
Math.Round(3.445, 1); //Returns 3.4.
Math.Round(3.455, 1); //Returns 3.5.
Math.Round(3.465, 1); //Returns 3.5.
  阅读全文
posted @ 2006-08-03 15:54 BookWorm 阅读(8267) | 评论 (21)编辑

如图,查了很久,未找到如何修改与显示摘要信息的内容,哪位知道提示一下,谢谢。
我主要是想动态修改图片的摘要信息。
posted @ 2006-04-11 16:16 BookWorm 阅读(1018) | 评论 (3)编辑
以前写程序都是使用拼音来命名,后期一个查东西时麻烦,二是自己看了很不爽,所以现在写程序所有的字段与页面、按钮、TextBox等等都使用了标准的英文命名,因为英文不是很好,为了要准确的表达意思,在命名查证上花了不少时间。

使用SQL2000与VS2005时命名不能与该系统默认命名重名,将我遇到到几个重名列出,希望见文者不要在此浪费时间(常见的我就不写了)。

SQL2000做得还是比较好的,在字段命名时都会自动检查加上[]来区分,但在数据库命名是没有做更详细的判断,记得昨天我还在园子里回了一贴命名的问题,问的是字段命名,可不可以加.来命名,我回了没有试字段,数据库名可以,结果我晚上就碰到了倒霉的事,我的数据库命名为XXX.COM.CN,因为是网站程序,我就用了别人的网站域名命名,使用上不成在问题,备份这些都很正常,但在导入导出时问题来了,他只认出了XXX这个名,后面的.COM.CN忽略了,怎么也导不了,只能手动自已导出,或是用第三方软件了。

VS2005我用C#,加入了很多默认命名,以前写网页Title题标时需要自己定义或是拖一个Literal控件,在2005时不用了,Page.Title="我的主页";但问题也来了,因为Title这个名用得很广泛,这回得改个名了。

以后碰到继续补。
posted @ 2006-04-11 11:36 BookWorm 阅读(155) | 评论 (0)编辑

(图一)

(图二)

大家看到上面两张图,我分别拖入了两个DataList与ObjectDataSource控件了,又分别放到两个ContentPlaceHolder控件内,选择数据源时可以看到ObjectDataSource1与ObjectDataSource2,但只能选择各自ContentPlaceHolder嵌套内的ObjectDataSource控件,如果content3选择content4内的ObjectDataSource2,运行时提示未发现数据源控件ID。

还未有时间去看ContentPlaceHolder说明,但如果是不允许这么用,就索性选择时不列出ID名,列出来又不能选,有些多余了,当然不只是ObjectDataSource控件有这个问题,一些类似的选择ID控件在ContentPlaceHolder内都有这个问题。
如果可以跨ContentPlaceHolder选择的话,我其实不需要拖入两个ObjectDataSource,希望VS下一个版模板功能有所改进。
posted @ 2006-03-28 19:17 BookWorm 阅读(1556) | 评论 (1)编辑

基于一个老的系统基础上开发时因为使用的一个字段存取不同的值,因为这个字段的内容有很多属性,也有空值,所以不能实用DropDownListr的数据绑定,当然这是基于特定条件下我才这么做的,这是一个新闻系统,里面有几种不同的新闻格式,有些字段在一些显示模式中是不需要的,如果我只做一个添加页的话就必须在不同模式添加时将一些TextBox与DropDownListr隐藏,(文件范围DropDownListr)就是一个要设为Visible = false的控件,另一种模式时他是要显示的(可能是我对执行顺序掌握得还不够熟),我无法在使用ObjectDataSource绑定FormView后获得DropDownListr1的执行顺序,DropDownListr绑定后才能DropDownListr1.Visible = false,在一个不需要他显示的模式里文件范围范围字段是空值,执行就会报错,找不到选定值,他不象手动DropDownListr1.SelectedValue="文件";这样来设选定值,如果值不存在他选则第一个,(不明白这两个模式有什么不同微软要这样做,晕菜菜).





于是我只能使用Form的方式来提交,开始在FormField填写FileArea怎么也或不到值,感觉有些奇怪,相起ASP时代的Form,右键看网页源代码,原来他的文件名变为FormView1$FileArea,于是填上FormView1$FileArea,OK搞定.

数据容器内使用Form方式获取值时必须要加载后更变的名称,这有些让我不安,一怕哪天微软搞个什么新补丁,要不在非IE下会不同名,加入个模板什么的后名称就变了,可能我想多了,基于原来的数据上修改没办法,总之这样的方式少用,不然哪里听到程序出错我心脏跳得厉害.

posted @ 2006-03-21 18:48 BookWorm 阅读(244) | 评论 (0)编辑


<input name="ctl00$cph$Title" type="text" maxlength="30" id="ctl00_cph_Title" />
 <span id="ctl00_cph_RequiredFieldValidator1" style="color:Red;visibility:hidden;">请输入投诉标题</span>

<input type="text" name="ctl00$cph$ComplainTime" id="ctl00$cph$ComplainTime" style='width:65px;'' value="2006-1-10" />
<span id="ctl00_cph_RequiredFieldValidator3" style="color:Red;display:none;">请输入投诉时间</span>

<script type="text/javascript">
<!--
var ctl00_cph_RequiredFieldValidator1 = document.all ? document.all["ctl00_cph_RequiredFieldValidator1"] : document.getElementById("ctl00_cph_RequiredFieldValidator1");
ctl00_cph_RequiredFieldValidator1.controltovalidate = "ctl00_cph_Title";
ctl00_cph_RequiredFieldValidator1.errormessage = "请输入投诉标题";
ctl00_cph_RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
ctl00_cph_RequiredFieldValidator1.initialvalue = "";

var ctl00_cph_RequiredFieldValidator3 = document.all ? document.all["ctl00_cph_RequiredFieldValidator3"] : document.getElementById("ctl00_cph_RequiredFieldValidator3");
ctl00_cph_RequiredFieldValidator3.controltovalidate = "ctl00_cph_ComplainTime";
ctl00_cph_RequiredFieldValidator3.errormessage = "请输入投诉时间";
ctl00_cph_RequiredFieldValidator3.display = "Dynamic";
ctl00_cph_RequiredFieldValidator3.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
ctl00_cph_RequiredFieldValidator3.initialvalue = "";
// -->
</script>

使用VS2005的主题功能,当然就需要实用ContentPlaceHolder控件,自定义控件使用this.UniqueID.ToString()获得控件ID,嵌套在ContentPlaceHolder控件后,使用出现ID名乱变,使用验证倥件自然无法对其进行严正,这种现象是不确定的,我的两个控件,获得的ID名有时就会交替,奇怪。



<select id="ctl00$cph$ComplainTime2_Hour" onChange="GetGCalTimeSelect('ctl00_cph_ComplainTime2');">
<option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17" selected="selected">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option>
</select>
:
<select id="ctl00$cph$ComplainTime2_Minute" onChange="GetGCalTimeSelect('ctl00_cph_ComplainTime2');">
<option value="00">00</option><option value="05" selected="selected">05</option><option value="10">10</option><option value="15">15</option><option value="20">20</option><option value="25">25</option><option value="30">30</option><option value="35">35</option><option value="40">40</option><option value="45">45</option><option value="50">50</option><option value="55">55
</option>

<input type="hidden" name="ctl00$cph$ComplainTime2" id="ctl00$cph$ComplainTime2" value="17:05" />

真是超级郁闷。。。
晚上试试自已将$自已替换掉行不行。

=====================================================
测试后替换不行,后找到原因
<input type=\"text\" name=\"" + this.UniqueID.ToString() + "\" id=\"" + this.ClientID.ToString() +"\">
Name用this.UniqueID.ToString()获得
ID用this.ClientID.ToString()获得
就正常了,看来是我学艺不精。

但上面我遇到的用this.UniqueID.ToString()获得ID,的确有时候会有获得不同的ID的时候,奇怪。
posted @ 2006-01-10 17:32 BookWorm 阅读(553) | 评论 (0)编辑