这两天一直在用LINQ做开发,也是第一次尝试用LINQ做开发,效率没的说,开发过程中遇到一个问题困扰了我好久,今天问题终于解决了,发上来和大家分享一下,也给自己做个备忘。

项目我采用了三层结构,我把LINQ的映射文件放到了DAL这个层中,映射文件自动由VS2008生成,在原来的机器上一直正常,一点问题都没有,当我把程序移到了另外一台机子上面时候,情况就发生了变化,怎么都连接不上数据库,这个问题折腾了我好几天,改了DAL下的app.config,也改了Web下的web.config但是都没有效果,一连接数据库就报这个错误 Timeout expired 错误,郁闷好几天,最后从LINQ的映射文件中才发现原来数据库连接字符串一直是调用的Properties下面的Setting.Setting,找到问题,修改了连接字符串,马上就没有问题了。

posted @ 2010-03-05 11:23 Forrest Gump 阅读(345) 评论(0) 编辑
                项目开发经验-ASP.NET项目开发中的异常处理

 

            前言:异常的处理在项目开发中是很有必要的,异常的处理不仅仅只是try..catch..finally就完事了的。异常处理绝对可以称开发中的重要组成部分。必须正确的面对异常,因为即使是最能干的开发人员,也要面对这个问题 ....


       我们不知道客户是怎么样使用我们开发的软件的,所以我们必须处理这样的情况:如果系统不按照我们的设计时所想的运行,我们改怎么办?

       下面我们就来具体的介绍在ASP.NET项目开发中的异常的处理方式,希望看完后,大家可以回答上面的问题。

       本篇的话题如下:

       应用程序级别异常处理的错误处理
       页面级别异常处理
       方法级别异常处理
       web.config文件异常处理配置
       健康监视(Health Monitoring)
       Enterprise Application Blocks异常处理模块
 

 

      一.在应用程序级别的异常处理:
       相信大家对Application对象不陌生,而且在项目中添加过Global.asax文件。确实,ASP.NET在应用程序级别处理异常的代码都是放在Global.asax的Application_Error事件处理下的:
 

void Application_Error(object sender, EventArgs e)
 
{
  
// Code that runs when an unhandled error occurs
 }
 

 

       我们可以在上面的事件处理的方法中捕获所有的异常,而且还可以把异常记录到日志文件,并且同时发送Email告诉开发人员出现了什么问题,如下

      


Exception error = Server.GetLastError().GetBaseException();
//在事件日志中记录异常
if (!EventLog.SourceExists("ApplicationException"))
{
        EventLog.CreateEventSource(
"ApplicationException""Application");
}


EventLog eventLog 
= new EventLog();
eventLog.Log 
= "Application";
eventLog.Source 
= "ApplicationException";
eventLog.WriteEntry(error.ToString(), EventLogEntryType.Error);

//发送Email给开发人员
MailMessage email = new MailMessage("administrator@xiaoyang.com",
"vince.varallo@PoweredByV2.com");
email.Body 
= error.ToString();
email.Subject 
= "An error occurred in the  Application";
SmtpClient smtpClient 
= new SmtpClient("127.0.0.1"25);
smtpClient.Send(email);
Response.Redirect(
"ErrorPage.aspx");




        当然,上面的代码要正确的运行,我们海必须在Global.asax中加入相应的命名空间,而且在发送邮件的时候,上面的"127.0.0.1"要换为我们自己的邮件服务器的地址:
 

<%@ Import Namespace="System.Diagnostics" %>
 
<%@ Import Namespace="System.Net.Mail" %>


 
 
       还有一点要注意的就是,ASP.NET运行时是以ASPNET账户运行的,这个账户的权限是有限的,如果我们想要使得上面的代码可以运行,那么就必须要给ASPNET账户访问注册表的权限。如果你不给权限,那么上面的代码就报错。


       我们赋予ASPNET账户访问在"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog"节点以及字节点的权限。
       下面就讲讲如何配置权限:
       1.打开"运行"菜单
       2.输入"regedit",然后确定
       3.导航到"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog"节点。
       4.右击这个节点,并且选择"权限",此时就会弹出权限配置的窗口。
       5.点击"添加",在弹出的窗口中点击"高级",之后再点击"查找",最后在下面的窗口找到"ASPNET"账户,确定。
       6.最后给予ASPNET账户读的权限就OK了。

       上面的代码,如果我们不在最后加了Response.Redirect方法,出错后,用户看到的就是那个很经典的黄颜色的报错的页面。我们也知道,那个经典的报错页面会暴露很多的信息,所以我们常常导航到我们自定义的错误页面。
 
 
 


       二.页面级的异常处理


       除了在Global.asax中编写处理代码,我们还可以在页面的Page_Error中编写代码:

 public void Page_Error(object sender, EventArgs e)
 {
  
//Insert same code that is in the Application_Error event.
 }


 
       如果在该页面中发生了错误,那么页面中的上面的那段代码就会执行,我们可以把之前写在Application_Error事件中的代码全部copy到Page_Error处理方法中。但是,如果这样,那么我们的Application_Error中的代码就不运行了,因为异常已经在之前,也就是Page_Error中被处理了。
 
       三 方法级别的处理
       相信这点大家非常的熟悉了,就是常见的try..catch..finally语句块的运用,这里不赘述。
 
       四 web.config配置 

      我们处理异常一般在web.config文件中配置 <customErrors />节点:
            

 <customErrors mode="RemoteOnly" defaultRedirect="ErrorPage.aspx">
  
<error statusCode="403" redirect="NoAccess.htm" />
  
<error statusCode="404" redirect="FileNotFound.htm" />
 
</customErrors>

 

       节点中的一些属性,大家也应该很熟悉,我不罗嗦了。

       五 健康监视(Health Monitoring)
 
       Health Monitoring是ASP.NET2.0以后版本添加的新的特性。它可以允许开发人员监视应用程序中发生的异常的事件。而且监视应用程序的启动,关闭,验证等都有相对应的事件来监视。而且我们还可以创建自定义的事件来监视应用程序中的特定的部分。我们也可以在Health Monitoring中配置把应用程序中的异常是记录在系统的日志中还是Sql Server中,或者是以Email形式发送出去。最重要的一点就是:只要通过配置,我们可以少写,甚至不写代码就可以实现强大的异常处理策略(和类似Enterprise Application Blocks,我们后面会提到的)。
 

       同样,我们还是在web.config中添加配置,在system.web节点中添加<healthMonitoring />节点:

       默认情况下是禁用的,我们启用就应该如下:
 
 
       


<healthMonitoring enabled=”true>
  
<eventMappings></eventMappings>
  
<providers></providers>
  
<rules>..</rules>
  
<profiles>..</profiles>
  
<bufferModes>..</bufferModes>
 
</healthMonitoring>

 

       下面就看看该节点下的一些配置:
       eventMappings节点通过指定事件类型来注册事件类。也就说,要注明我们在应用程序中要监听哪些事件,如下配置:

 <eventMappings>
  
<clear />
  
<add name=”CustomException” type=”System.Web.Management.WebBaseErrorEvent” />
 
</eventMappings>


 
       前面的"name"属性是我们自己为后面的事件取的友好的名称,从<eventMappings>的字面意思也可以知道:事件的映射。
       后面的"type"就是我们要在程序中监听的事件。之前也说过,我们可以监听很多的事件:系统的启动,关闭,验证失败等。

       如上所见:"System.Web.Management.WebBaseErrorEvent" 是所有事件的基类。它的子类有很多:

       WebApplicationLifetimeEvent--在应用程序的运行过程触发的事情,如,当应用程序开启,关闭时
       WebAuthenticationFailureAuditEvent--当ASP.NET验证失败是触发
       WebAuthenticationSuccessAuditEvent--验证成功时触发
       WebRequestErrorEvent--请求出错时触发
 
       除此之外,我们还可以自定义一些类,派生自基类。
 
 
       当我们确定了要监听的事件之后,我们就要选择事件的provider,也就说,事件触发后,我们把事情的信息记录到那里。
       配置如下:
 

 <providers>
  
<clear />
  
<add name=”EventLogProvider” type=”System.Web.Management.EventLogWebEventProvider” />
 
</providers>


 
       这之前一样:System.Web.Management.EventLogWebEventProvider是个基类,有很多的子类,这些子类可以使得我们把异常的记录在如sql数据库中,系统日志中等:
       SqlWebEventProvider--把异常信息记录到数据库中的提供程序
       SimpleMailEventProvider--把异常信息通过Email发送的提供程序
 
       还有一些,大家参看MSDN。
 
       好了,到这里,我们把要监听的事件选择好了,如要监听WebApplicationLifetimeEvent,WebRequestErrorEvent;而且我们也准备把异常系统通过Email发送,我们选择了SimpleMailEventProvider,通过也想把异常记录到数据库中,我们也选择了SqlWebEventProvider。那么我们的配置就如下:
       


<healthMonitoring enabled=”true>
  
<eventMappings>
   
<clear />
   
<add name=”CustomException” type=”System.Web.Management.WebApplicationLifetimeEvent” />
   
<add name=”AnotherException" type=”System.Web.Management.WebRequestErrorEvent” />
  
</eventMappings>

  
<providers>
   
<clear />
   
<add name=”EmailProvider” type=”System.Web.Management.SimpleMailEventProvider” />
   
<add name=”SqlProvider” type=”System.Web.Management.WebRequestErrorEvent” />
  
</providers>
  
 
</healthMonitoring>


         注意:providers节点中的"name"属性也是我们自己取的友好的名称。

       好了,该定义的定义好了,现在还是不能按照我们的要求工作,那是因为我们还缺少一个"规则":
       如下:

 

            


<rules>
  
<clear />
  
<add name=”Unhandled Exceptions Rule”
   eventName
=”Unhandled Exceptions”
   provider
=”EventLogProvider”
   
profile=”Default”
   
minInstances=”1”
   
maxLimit=”Infinite”
   
minInterval=”00:00:00” />
 
</rules>

 实际上,rules就是把我们之前定义的要监听的事件和相应的provider对象上来:
 
 
<rules>
  
<clear />
  
<add name=”MyRules1”
   
eventName=”CustomException”
   
provider=”EmailProvider”
   
profile=”Default”
   
minInstances=”1”
   
maxLimit=”Infinite”
   
minInterval=”00:00:00” />
 
</rules>


        注意上面的name属性,其实和之前一样,我们是给这个规则取个名字而已。eventName就是之前我们定义的事件名称,如"CustomException",provider为之前定义的“EmailProvider” ,本条规则就是说,让EmailProvider来处理CustomException的异常信息。其他的同理。
 
       最后一点要注意的就是:如果我们决定发送Email,那么我们还要配置节点:
 

<system.net>
  
<mailSettings>
   
<smtp deliveryMethod=”PickupDirectoryFromIis”>
    
<network defaultCredentials=”true” host=”127.0.0.1” />
   
</smtp>
  
</mailSettings>
 
</system.net>

 

       这样就行了。
 


       六 Enterprise Application Blocks 

      关于Enterprise Application Blocks,相信大家都知道,在异常处理的时候我们一般用Exception Handling Application Block(后面简称 :异常处理的模块),Logging Application Block。
       在决定用Enterprise Application Blocks的时候,我们必须首先下载安装包. 
       得到了安装包之后,我们就开始安装,如果在安装的过程中,全部采用默认的安装设置,那么我们就会有c:\EntLib4Src\Quick Starts文件夹。而且在ExceptionHandling\CS子文件夹下有ExceptionHandlingBasicQuickStart.sln 和ExceptionHanldingWithLoggingQuickStart.sln。打开ExceptionHandlingWithLoggingQuickStart解决方案,这个方案是个告诉我们如果使用异常处理模块的Demo。


       而且这个Demo是WinForm的,因为我们谈的是在ASP.NET使用异常处理的模块。所以我们谈谈在ASP.NET如何使用。
       在此之前,我们要熟悉一些配置节点,其实这些节点的结构和我们之前谈的"健康监视"很相似:

 <exceptionTypes>
  
<add name=”Exception” type=”System.Exception, mscorlib, Version=2.0.0.0,
   
Culture=neutral, PublicKeyToken=b77a5c561934e089” postHandlingAction=”None”>

 
</exceptionTypes>


       上面节点表示要处理的异常,和之前的<eventMappings>相似。

 

 <exceptionHandlers>
  
<add name=”Application Message Handler” type=”ExceptionHandlingQuickStart.AppMessageExceptionHandler,
   
ExceptionHandlingWithLoggingQuickStart”/>
 
</exceptionHandlers>

 

       异常处理模块,就是异常发生后,如何处理。和之前的providers节点类似。
 
       下面的节点,看起来很吓人的,其实是声明异常信息以什么格式记录:

       

Code


       最后的节点如下,也不难理解,和之前说的rules节点类似:
             

Code

 

       其实Enterprise Application Blocks的功能不仅强大,而且还有最大的好处就是可以用GUI图形化的形式来配置,不必项之前一样要亲自在配置文件中写配置。而且在代码调用方面也很简单,几句话就OK了。
 

       说完上面的之后,我们就用图文结合的方式,展示如何使用异常处理模块。      


       首先,我们把Program Files\Microsoft Enterprise Library 4.1 - October 2008\bin目录下的几个dll引入到我们的ASP.NET项目中:
       Microsoft.Practices.EnterpriseLibrary.Common
       Microsoft.Practices.EnterpriseLibrary.ExceptionHandling
       Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging
       Microsoft.Practices.EnterpriseLibrary.Logging
       Microsoft.Practices.ObjectBuilder2

       下面开始配置:


       1.在我们的ASP.NET项目的web.config文件上点击右键,就会弹出"Edit Enterprise Library Configuration"选项。点击后就会看见如下界面:

 

 


       2.在弹出的界面中选中"web.config",点击右键 "新建"-"Logging Application Block",这样就把添加了日志记录的模块的节点,如下:
       

 

 

       3.在默认情况下,在event log 的 trace listener节点有一个Trace Listeners,因为我们要发送Email,所以要添加个e-mail trace listener。在Trace Listeners点击右键,"新建"-"Email Trace Listener",之后就添加了"Email TraceListener"节点,然后选中"Email TraceListener",查看属性,可以设置发送Email的设置。如图:

      


 

 

             并且设置Formatter属性并且选择"Text Formatter",设置信息格式为文本的形式。
 
       4.现在点击"web.config"添加异常handler。"新建"-"Exception Handling Application Block",如下:
 


 
       然后在"Exception Handling Application Block"上右击"新建"-"Exception Policy",然后我们可以重新命名为"MyPolicy".然后在"MyPolicy"上右键,选中"New Exception Type",然后选择我们要处理的异常,如图:

 
       我们一般是选择默认设置:处理所有异常。

 

       好了,现在我们把事件的处理程序也添加了,那么下面就要加类似于"rules"的设置。
 
       5.在"Exception"节点上右击"新建"-"Logging Handler",然后选择"Logging Handler"节点,并且展开,选中"FormatterType",展开并且选"TextExceptionFormatter",最后确认就OK了。如下:
 
////

 

       6.然后在点击"Logging Application Block\Special Source\All Events"的那个节点,右击"新建"-"Trace Listener Reference"添加"Trace Listener Reference",并且设置"ReferencedTrace Listener"属性为"Email Trace Listener",最后保存就行了。

       7.我们在Global.asax文件下添加引用:
       

<%@ Import Namespace=”Microsoft.Practices.EnterpriseLibrary.ExceptionHandling” %>


       添加代码:
 

void Application_Error(object sender, EventArgs e)
 {
  
// Code that runs when an unhandled error occurs
  ExceptionPolicy.HandleException(Server.GetLastError(), “Global Policy”);
 }


 
       就行了,强大异常处理就成功了。

posted @ 2009-05-10 00:10 Forrest Gump 阅读(207) 评论(1) 编辑

关于模态窗口(showModalDialog)的专题【收藏】

转自:http://www.cnblogs.com/donnet/articles/1039509.html
1.模态窗口的打开,model window open
2.模态窗口的关闭,model window close
3.模态窗口的传递参数,model window    get valuse
4.其他....,other ..


1.window.showModalDialog("DialogPage.aspx","newwin","dialogHeight: 200px; dialogWidth: 150px; dialogTop: 458px; dialogLeft: 166px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes;");

2.window.close();

3.传值
ParentPage.aspx:
window.showModalDialog("DialogPage.aspx?para1=aaa&para2=bbb");

DialogPage.aspx:
string str1=Request.QueryString["para1"].toString();
string str2=Request.QueryString["para2"].toString();

返回值
DialogPage.aspx:
window.returnValue="aaa";

ParentPage.aspx:
var str=window.showModalDialog("DialogPage.aspx");

4.
aspx页面在showmodeldialog情况下为什么一提交就重新打开一个页面?
showmodaldialog打开的页面中在<head></head>之间加入一行:<base target="_self">

浅析js中的showModalDialog的实战应用
IE提供的showModalDialog()方法是一个很好用的Web应用功能,虽然一般的网站应用不是很常见,但一旦涉及到企业应用级的Web开发则就很有用了。现在我用一个简单易懂的例子来说明一下:

这一应用需要两个web文件:

1、父窗口(也即用来控制弹出窗口的那个页面)
showModalDialog.html
---------------------------------------------------------------------------------------
<html>
<head>
<title>showModalDialog</title>
<script language="JavaScript">
<!--
//aInfo作为数组对象,将被showModalDialog传递出去
//也可用var oMyobject=new Object();
//oMyobject.firstProperty = value; oMyobject.lastProperty = value;的方式定义一个对象(firstProperty,lastProperty是自己按需定义的对象属性,可是任意取名并赋值)
var aInfo    = new Array(3);
aInfo[0] = "aaaaaaaaaaa";
aInfo[1] = "bbbbbbbbbbb";
aInfo[2] = "ccccccccccc";
var url = "dialog.html";
var sFeatures = "dialogWidth=500px;dialogHeight=500px;dialogLeft=0;dialogTop=0;";
/*sFeatures的各项可选参数:
*dialogWidth:弹出窗口的宽度;
*dialogHeight:弹出窗口的高度;
*dialogLeft:弹出窗口的左边距
*dialogTop:
*edge:sunken | raised
*center: yes|no|1|0|on|off
*dialogHide: yes|no|1|0|on|off
*help: yes|no|1|0|on|off
*resizable: yes|no|1|0|on|off
*scroll: yes|no|1|0|on|off
*status: yes|no|1|0|on|off
*unadorned: yes|no|1|0|on|off
*/

function showDialog(){
//弹出一个showModalDialog,并以returnValue来获取返回值
var returnValue = window.showModalDialog(url,aInfo,sFeatures);
if(returnValue!=null){
    //for(var i=0;i<returnValue.length;i++){
     //document.all.info.innerHTML = returnValue[i]+"<br>";
    //}
    //输出返回值
    document.all.info.innerHTML=returnValue;
}
//

}
//-->
</script>
</head>

<body>
<h3><a href="#" onclick="showDialog()">打开Dialog窗口</a></h3>
<div id="info"></div>
</body>
</html>


2、子窗口(即将被弹出的那个页面)
dialog.html
-----------------------------------------------------------------------------------------
<html>
<head>
<title>Dialog</title>
</head>

<body>
<script language="JavaScript">
<!--
//获取父窗口传来的对象(本例中就是父页面中的“oInfo”数组对象,也可用“window”对象,以便对父页面进行操作。总之,只要是object类型就成。)
var args = window.dialogArguments;
if(args!=null){
//document.write(args);
for(var i=0;i<args.length;i++){
    document.writeln(args[i]+" "+(i+1)*10);
}
}else{
document.writeln("对不起,参数为空");
}
//向父窗口返回的值
window.returnValue = "这是子窗口返回来的值";
//-->
</script>
</body>
</html>
--------------------------------------------------------------------

好了,运行showModalDialog.html即可看出其中的端倪来了。。。

通过这些工作,我实现了将值在父页面和子页面中的相互传递和处理。我想这也正是ms设计showModalDialog()方法的初衷之所在吧。当然,这个例子太简单了。但我的目的只是通过它了解showModalDialog的执行机制。实际应用中需要举一反三才行呢。(完)

 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=488153

http://blog.csdn.net/ll_feng/archive/2005/09/23/488153.aspx

 

【9、终极应用--弹出的窗口之Cookie控制】  回想一下,上面的弹出窗口虽然酷,
但是有一点小毛病(沉浸在喜悦之中,一定没有发现?)比如你将上面的脚本放在一
个需要频繁经过的页面里(例如首页),那么每次刷新这个页面,窗口都会弹出一次,
是不是非常烦人?:-(  有解决的办法吗?当然有!我们使用cookie来控制一下就可
以了。首先,将如下代码加入主页面HTML的〈HEAD〉区:  〈script〉 
 function openwin(){  window.open("page.html","","width=200,height=200")  }
  function get_cookie(Name) {  var search = Name + "="  var returnvalue = ""; 
 if (document.cookie.length 〉 0) {  offset = document.cookie.indexOf(search) 
 if (offset != -1) {  offset += search.length  end = document.cookie.indexOf(";", offset); 
 if (end == -1)  end = document.cookie.length;  
returnvalue=unescape(document.cookie.substring(offset, end))  }  }
  return returnvalue;  }  function loadpopup(){ 
 if (get_cookie(′popped′)==′′){  openwin()  
document.cookie="popped=yes"  }  }  
〈/script〉   
然后,用〈body onload="loadpopup()"〉
(注意不是openwin而是loadpop啊!)
替换主页面中原有的〈BODY〉这一句即可。
你可以试着刷新一下这个页面或重新进入该页面,
窗口再也不会弹出了。真正的Pop-Only-Once!  
写到这里弹出窗口的制作和应用技巧基本上算是完成了,
俺也累坏了,一口气说了这么多,
希望对正在制作网页的朋友有所帮助俺就非常欣慰了。
需要注意的是,JS脚本中的的大小写最好前后保持一致


JS:window.showModalDialog和window.returnValue的应用  
fireForm.htm:点击“上传”按钮弹出内部窗口(showModalDialog),代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<script language="javascript">
function onObjMore(url,name,height,width,formName) {
//window.alert(formName.file.type);
var feature = "dialogWidth:"+width+"px;dialogHeight:"+height+"px;scroll:yes;status:no;help:no;center:1";
var returnTarget = window.showModalDialog(url, name, feature);
if(returnTarget != undefined && returnTarget.length > 1) {
    //document.location = returnTarget;
    formName.file.value=returnTarget;
}
return false;
}
</script>
<link href="css/aljoin.css" rel="stylesheet" type="text/css">
</head>

<body>
<form name="proForm" method="post" action="">
    <table width="400" border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td width="93" height="25" style="white-space:nowrap " nowrap>文件</td>
        <td width="307" height="25"><input name="file" type="text" id="file"></td>
      </tr>
      <tr>
        <td height="25"> </td>
        <td height="25"><input type="button" name="Submit" value="上传文件" onClick="onObjMore('upfile.htm','upfile',300,300,proForm)"></td>
      </tr>
    </table>
</form>
</body>
</html>


upfile.htm:点击”关闭”按钮返回window.returnValue值给opener,代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<script language="javascript">
function exit() {
window.returnValue = "images/upload/2004080512.jpg";
window.close();
}
</script>
</head>
<body>
<input name="" type="button" value="关闭窗口" onClick="exit()">
</body>
</html>

showModalDialog() (IE 4+ 支持)
showModelessDialog() (IE 5+ 支持)
window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框。
window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。

使用方法:
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])

参数说明:
sURL--
必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
vArguments--
可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
sFeatures--
可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
1.dialogHeight :对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
2.dialogWidth: 对话框宽度。
3.dialogLeft: 离屏幕左的距离。
4.dialogTop: 离屏幕上的距离。
5.center: {yes | no | 1 | 0 }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
6.help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。
7.resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。
8.status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为yes。
下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11.edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

参数传递:
1.要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:
-------------------------------
parent.htm
<script>
var obj = new Object();
obj.name="51js";
window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");
</script>
modal.htm
<script>
var obj = window.dialogArguments
alert("您传递的参数为:" + obj.name)
</script>
-------------------------------
2.可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:
------------------------------
parent.htm
<script>
str =window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");
alert(str);
</script>
modal.htm
<script>
window.returnValue="http://www.51js.com";
</script>


现在用asp.net2.0,要实现一个功能:a页面点击一个按钮,弹出一个窗口,选择数据,然后数据返回到a页面的某个textbox里面。
以前我用
if(!IsClientScriptBlockRegistered("clientScript2"))
    {
    string strScript2= "<script>function OpenWin2(){var str=window.showModalDialog('user.aspx',document.Form1.sx.value,'dialogWidth:455px; dialogHeight:450px;');document.Form1.sx.value=str}</script>";
    RegisterClientScriptBlock("clientScript2", strScript2);
    }
    nw.Attributes.Add("onclick", "OpenWin()");
这样去做,不知道还有其他更好的方法吗?

用window.open也可以,在弹出窗口中调用父窗口的js函数,实现传值:opener.someFunction("someValue");

模式窗口showModalDialog的用法总结
      最近几天一直在处理模式窗口的问题,索性写了这篇总结,以供参考:

1。打开窗口:
var handle = window.showModalDialog(url, objects, feathers);
其中:objects可以为参数(包括数组),也可以是对象。
通常的用法 objects = {window} ,把父窗体的对象共享给子窗体。

2。关闭子窗口:
window.close();

3。从子窗体传参数给父窗体:
window.returnVal = string;

3。清除缓存,防止模式窗口页面不更新的情况:
HTML
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Mon, 23 Jan 1978 20:52:30 GMT">
ASP
<%
Response.Expires = -1
Response.ExpiresAbsolute = Now() - 1
Response.cachecontrol = "no-cache"
%>
PHP
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
JSP
response.setHeader("Pragma","No-Cache");
response.setHeader("Cache-Control","No-Cache");
response.setDateHeader("Expires", 0);

4。防止打开新窗口(如提交表单):
<base target="_self">

5。在模式窗口使用F5刷新页面:
<base target="_self">
<body onkeydown="if (event.keyCode==116){reload.click()}">
<a id="reload" href="filename.htm" style="display:none">reload...</a>
其中:filename为窗口页面。

6。防止模式窗口打开的页面出现cookie丢失的情况:
模式窗口打开新窗口时,仅可以使用 showModalDialog(url,window,feathers); 方法,且 objects 为 window 。

7。在弹出窗口中获得或设置主窗口的任何值:
打开弹出窗口时用:showModalDialog(url, window, feathers)
在弹出窗口中使用 window.dialogArguments 对象(即主窗口传递过来的 window 对象集),即可以获得或者设置主窗口的值


[js]如何得到showModalDialog的opener?

用window.open可以在弹出的窗口里得到window.opener,但是用多模的窗口却得不到这个window.opener,有什么办法在多模的窗口里得到父页面对象?

用parent或者top,看你层次结构了

父对象dialogArguments

parent,top,dialogArguments都不行,都是说找不到对象,不知道是不是我的方法用得不对。

我的页面结构:
a页面弹出b页面,b页面操作完把数据返回给a页面。
b页面的JS:
[code]
if(parent){ //if(top),if(window.dialogArguments)这些写法都报错。
         .........
}
[/code]
用window.open的话,我用以下代码正常运行。
[code]
if(window.opener){
     ........
}
[/code]

showModalDialog没有opener,因为showModalDialog就好像alert一样,弹出的是模式对话框,这时候父窗口不可用

showModelessDialog可以用opener访问父窗口的,如果你试了还是不能那么
[code]
win=showModelessDialog()
win.opener=top
[/code]
,然后在无模式对话框中setTimeout一下再去访问opener即可

俺以前用过的,这种方法肯定可行

ft,一步一步找对象,终于找到了window.dialogArguments这个对象了。

window.dialogArguments取到的是showModalDialog时的第二个参数值,这个值是什么(类型),dialogArguments就是什么(类型),先前一直用字符串,并非对象,所以一直报找不到对象的错误,将父页面对象传到该参数里,现在正常获取并操作了。

谢谢各位。

hutia在上个帖子中说
呵呵,不能采用无模式窗口,因为我弹出窗口之后父页面的操作是不允许的,不过还是谢谢你告诉我这个方法。
另外我有一个问题就是,你第二句的win.opener = top是什么意思?这是一个等式还是一个赋值操作?

这也是老早前整理的了,也贴出来吧:

1. showModalDialog和showModelessDialog的异同

同:两者弹出的窗体不能刷新

异:前者是模态窗口,始终获得焦点;后者是非模态窗口,只不过弹出一个页面,还可以操作父窗口。

2. 关闭showModalDialog和showModelessDialog弹出的窗口

<INPUT type="button" value="ButtonClick" onclick="self.close();">

3. 怎样才让在showModalDialog和showModelessDialog的弹出新窗口里操作button,不弹出新窗口?

在<head>和</head>之间加<base target="_self">

4. showModalDialog的返回值

参照例子:

t1.html:

<script language="javascript">
function showpage()
{
alert(showModalDialog("t2.html"));
}
</script>
<input type="button" value="getval" onClick="showpage();">

t2.html
<HTML>
<HEAD>
<Script language="javascript">
<
function SetVal()
{
returnValue="abc";
close();
}
//-->
</Script>
</HEAD>
<BODY>
<input type="button" value="Btn1" onClick="SetVal();">
</BODY>
</HTML>

 


是用   
    windwo.open('./a.aspx?str='+type,'window','height=……');   
    子窗口返回值:   
    window.opener.document.all.a.value=document.all.b.value;格式   
    能帮忙解决为盼!

现在越来越多的浏览器会屏蔽掉 window.open() 这个让程序员大为头痛。
有办法解决吗?看看这个文章或许对你有帮助!

showModalDialog()、showModelessDialog()方法使用详解


Javascript有许多内建的方法来产生对话框,如:window.alert(), window.confirm(),window.prompt().等。 然而IE提供更多的方法支持对话框。如:

  showModalDialog() (IE 4 支持)
  showModelessDialog() (IE 5 支持)


window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框,由于是对话框,因此它并没有一般用window.open()打开的窗口的所有属性。
window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。

当我们用showModelessDialog()打开窗口时,不必用window.close()去关闭它,当以非模态方式[IE5]打开时, 打开对话框的窗口仍可以进行其他的操作,即对话框不总是最上面的焦点,当打开它的窗口URL改变时,它自动关闭。而模态[IE4]方式的对话框始终有焦点(焦点不可移走,直到它关闭)。模态对话框和打开它的窗口相联系,因此我们打开另外的窗口时,他们的链接关系依然保存,并且隐藏在活动窗口的下面。

使用方法如下:
vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])
参数说明:
sURL
必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
vArguments
可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
sFeatures
可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
dialogHeight 对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
  dialogWidth: 对话框宽度。
  dialogLeft: 距离桌面左的距离。
  dialogTop: 离桌面上的距离。
  center: {yes | no | 1 | 0 }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
  help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。
  resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。
  status: {yes | no | 1 | 0 } [IE5 ]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为yes。

还有几个属性是用在HTA中的,在一般的网页中一般不使用。
dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

传入参数:
要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如:

test1.htm
====================
<script>
var mxh1 = new Array("mxh","net_lover","孟子E章")
var mxh2 = window.open("about:blank","window_mxh")
// 向对话框传递数组
window.showModalDialog("test2.htm",mxh1)
// 向对话框传递window对象
window.showModalDialog("test3.htm",mxh2)
</script>

test2.htm
====================
<script>
var a = window.dialogArguments
alert("您传递的参数为:" a)
</script>

test3.htm
====================
<script>
var a = window.dialogArguments
alert("您传递的参数为window对象,名称:" a.name)
</script>

可以通过window.returnValue向打开对话框的窗口返回信息,当然也可以是对象。例如:

test4.htm
===================
<script>
var a = window.showModalDialog("test5.htm")
for(i=0;i<a.length;i ) alert(a[i])
</script>

test5.htm
===================
<script>
function sendTo()
{
var a=new Array("a","b")
window.returnValue = a
window.close()
}
</script>
<body>
<form>
<input value="返回" type=button onclick="sendTo()">
</form>

常见问题:
1,如何在模态对话框中进行提交而不新开窗口?
如果你 的 浏览器是IE5.5 ,可以在对话框中使用带name属性的iframe,提交时可以制定target为该iframe的name。对于IE4 ,你可以用高度为0的frame来作:例子,

test6.htm
===================
<script>
window.showModalDialog("test7.htm")
</script>

test7.htm
===================
if(window.location.search) alert(window.location.search)
<frameset rows="0,*">
<frame src="about:blank">
<frame src="test8.htm">
</frameset>

test8.htm
===================
<form target="_self" method="get">
<input name=txt value="test">
<input type=submit>
</form>
<script>
if(window.location.search) alert(window.location.search)
</script>
2,可以通过http://servername/virtualdirname/test.htm?name=mxh方式直接向对话框传递参数吗?
答案是不能。但在frame里是可以的。


http://www.2ed.cn/Article-107-11846.shtml

js模式对话框实现用户登录
关键字: 企业应用     js showModalDialog     
以前看过别人写的用js的showModalDialog做用户登录 今天闲着没事做了一下 感觉不错
采用ModalDialog做登录,最大优点就是省去了传递url的麻烦
下面列出关键代码 当作备忘吧
父窗口代码:window.showModalDialog('login.jsp', window);//这个window作为参数传递到子窗口,当登录成功后可通过这个对象刷新父窗口
子窗口代码:
window.dialogArguments.document.location.reload();//刷新父窗口
window.close(); //关闭自己

还有一个关键代码:
<base target="_self">
如果不加这段代码,在登录返回之后会打开一个新窗口

我99的兼容IE,FF ,Opera
var win=new MdiWindow(/*width*/ 300 ,/*height*/ 200 , /*left*/ 1 , /*top*/ 100, /*下方不可操作*/ true);
win.setSize(300,200);//设置大小
win.setWindowArguments({window:window});
//或win.setWindowArguments(window)
win.load("login.html");
win.frame.location.reload();//刷新
win.onClose=function(){
//闭时回调函数
}
win.close();//关闭

//子窗口代码:
parent.initWindowArguments(window);
window.close();//关闭自己
var opener=windowArguments.window;
opener.reload();//刷新父页面
windowHandler.btnClose.hide();//隐藏关闭按钮。

js中showModalDialog()问题!会的来帮帮忙,谢谢!楼主lcwlyl(网络幽灵)2005-10-27 12:13:30 在 Java / Web 开发 提问
我在网页上用showModalDialog()弹出一个网页对话框(a),里面是jsp内容,然后再在弹出的对话框(a)中,再弹出一个网页对话框(b),我把(b)关掉后,(a)里面的内容怎么刷新。想了好久,没有解决办法,请各位帮一下忙。
问题点数:50、回复次数:10
Top

1 楼lcwlyl(网络幽灵)回复于 2005-10-27 12:17:05 得分 0 如果在对话框(a)的基础上,再用confirm()方法弹出对话框(c),再经过处理,倒是可以刷新(a)。但(b)要处理的时候,必须先关掉窗口,但是用"window.close()"后,下面的处理代码就不会执行了。
Top

2 楼Croatia(Croatia)回复于 2005-10-27 12:47:44 得分 0 你打开窗口的时候,比如说,window.open,这个函数的返回值就是那个新窗口的句柄。   
    
    通过它,你可以刷新那个新的窗口。
Top

3 楼lcwlyl(网络幽灵)回复于 2005-10-27 13:16:28 得分 0 但(a)和(b)都是对话框啊,是用showModalDialog()方法打开的。即使有返回值,但再怎么操作呢?
Top

4 楼lcwlyl(网络幽灵)回复于 2005-10-27 13:18:36 得分 0 如果关掉(a)的话,因为它的上级是一个jsp页面,倒是可以自动刷新,相当于用了alert()。
Top

5 楼jianggl88(亮)回复于 2005-10-27 15:02:04 得分 5你说得很乱哪!           刷新在     html     <head>     里面加     <base     target="_self">     就会在本页面刷新了
Top

6 楼liu_you(滴水藏海)回复于 2005-10-27 16:18:03 得分 5在b中定义一些变量;vars   
    在c中window.close()前为b中变量赋值:parent.vars.value=...   
    以及调用parent.refresh()类似的function.
Top

7 楼Croatia(Croatia)回复于 2005-10-27 16:25:25 得分 35例子:   
    test3.html   
    
    <html>   
    <head>   
    <script>   
      function     newwin(){   
          window.showModalDialog("test4.html")   
      }   
      </script>   
      </head>   
    <body>   
      <body>   
      <form>   
        <input     value="Open3"     type=button     onclick="newwin()">   
      </form>   
    </body>   
    </html>     
    
    test4.html   
    <html>   
    <head>   
    <script>   
    
      function     newn(){   
        var     s     =     window.showModalDialog("test5.html")   
        alert(s);   
        if     (s     =     "1"){   
          reload();   
        }   
      }   
      
      function     reload(){   
          window.location.reload(true);   
      }   
    
      </script>   
    </head>   
    <body>   
      <body>   
      Form4   
      <form     name="frm4">   
        <input     value="new4"     type=button     onclick="newn()">   
        <input     value="test4"     type=text     value="test">   
      </form>   
      <script>   
      alert(1);   
      </script>   
      
    </body>   
    </html>     
    
    test5.html   
    <html>   
    <head>   
    <script>   
      function     bak(){   
        window.returnValue     =     '1'   
        window.close()   
      }   
    </script>   
    </head>   
    <body>   
      <body>   
      <form>   
        <input     value="back5"     type=button     onclick="bak()">   
      </form>   
    </body>   
    </html>   
    
    打开test3.html就可以看到了。
Top

8 楼liutang2(Believe I Can Fly!)回复于 2005-10-27 16:38:48 得分 5父页面中的函数   
    
    function     add(){   
    var     flag=showModalDialog("ForOutpersonlist.do?act=preAdd&ID="+PID);   
    if(flag=='okLoad'){   
    winReload();   
    }   
    }   
    
    子页面中的函数   
        function     saveThis(){   
        form1.submit();   
        returnValue='okLoad';   
        window.close();   
        }

posted @ 2009-02-05 19:43 Forrest Gump 阅读(3201) 评论(0) 编辑
posted @ 2008-12-28 22:39 Forrest Gump 阅读(664) 评论(1) 编辑
一、asp.net中导出Excel的方法:

在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上;一种是将文件直接将文件输出流写给浏览器。在Response输出时,t分隔的数据,导出Excel时,等价于分列,n等价于换行。
1、将整个html全部输出Excel

此法将html中所有的内容,如按钮,表格,图片等全部输出到Excel中。
   Response.Clear();    
   Response.Buffer=   true;    
   Response.AppendHeader("Content-Disposition","attachment;filename="+DateTime.Now.ToString("yyyyMMdd")+".xls");          
   Response.ContentEncoding=System.Text.Encoding.UTF8;  
   Response.ContentType   =   "application/vnd.ms-excel";  
   this.EnableViewState   =   false;  

这里我们利用了ContentType属性,它默认的属性为text/html,这时将输出为超文本,即我们常见的网页格式到客户端,如果改为ms-excel将将输出excel格式,也就是说以电子表格的格式输出到客户端,这时浏览器将提示你下载保存。ContentType的属性还包括:image/JPEG;text/HTML;image/GIF;vnd.ms-excel/msword 。同理,我们也可以输出(导出)图片、word文档等。下面的方法,也均用了这个属性。

2、将DataGrid控件中的数据导出Excel

上述方法虽然实现了导出的功能,但同时把按钮、分页框等html中的所有输出信息导了进去。而我们一般要导出的是数据,DataGrid控件上的数据。
System.Web.UI.Control ctl=this.DataGrid1;
//DataGrid1是你在窗体中拖放的控件
HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls");
HttpContext.Current.Response.Charset ="UTF-8";    
HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.Default;
HttpContext.Current.Response.ContentType ="application/ms-excel";
ctl.Page.EnableViewState =false;   
System.IO.StringWriter  tw = new System.IO.StringWriter() ;
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
ctl.RenderControl(hw);
HttpContext.Current.Response.Write(tw.ToString());
HttpContext.Current.Response.End();

如果你的DataGrid用了分页,它导出的是当前页的信息,也就是它导出的是DataGrid中显示的信息。而不是你select语句的全部信息。

为方便使用,写成方法如下:
public void DGToExcel(System.Web.UI.Control ctl)  
  {
   HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls");
   HttpContext.Current.Response.Charset ="UTF-8";    
   HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.Default;
   HttpContext.Current.Response.ContentType ="application/ms-excel";
   ctl.Page.EnableViewState =false;   
   System.IO.StringWriter  tw = new System.IO.StringWriter() ;
   System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
   ctl.RenderControl(hw);
   HttpContext.Current.Response.Write(tw.ToString());
   HttpContext.Current.Response.End();
  }

   用法:DGToExcel(datagrid1);
  
3、将DataSet中的数据导出Excel

有了上边的思路,就是将在导出的信息,输出(Response)客户端,这样就可以导出了。那么把DataSet中的数据导出,也就是把DataSet中的表中的各行信息,以ms-excel的格式Response到http流,这样就OK了。说明:参数ds应为填充有数据表的DataSet,文件名是全名,包括后缀名,如Excel2006.xls

public  void CreateExcel(DataSet ds,string FileName) 
{
 HttpResponse resp;
 resp = Page.Response;
 resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
 resp.AppendHeader("Content-Disposition", "attachment;filename="+FileName);   
 string colHeaders= "", ls_item="";   
 
 //定义表对象与行对象,同时用DataSet对其值进行初始化
 DataTable dt=ds.Tables[0];
 DataRow[] myRow=dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
        int i=0;
        int cl=dt.Columns.Count;
    
 //取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
 for(i=0;i<cl;i++)
 {
 if(i==(cl-1))//最后一列,加n
 {
 colHeaders +=dt.Columns[i].Caption.ToString() +"n";
 }
 else
 {
 colHeaders+=dt.Columns[i].Caption.ToString()+"t";
 }
      
 }
 resp.Write(colHeaders);
 //向HTTP输出流中写入取得的数据信息
   
 //逐行处理数据  
 foreach(DataRow row in myRow)
 {     
 //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据    
 for(i=0;i<cl;i++)
 {
 if(i==(cl-1))//最后一列,加n
 {
 ls_item +=row[i].ToString()+"n";
 }
 else
 {
 ls_item+=row[i].ToString()+"t";
 }
  
 }
 resp.Write(ls_item);
 ls_item="";
    
 }    
 resp.End(); 
 }

4、将dataview导出excel
若想实现更加富于变化或者行列不规则的excel导出时,可用本法。
public void OutputExcel(DataView dv,string str)
{
   //dv为要输出到Excel的数据,str为标题名称
   GC.Collect();
   Application excel;// = new Application();
   int rowIndex=4;
   int colIndex=1;
 
   _Workbook xBk;
   _Worksheet xSt;
 
   excel= new ApplicationClass();
  
   xBk = excel.Workbooks.Add(true);
   
   xSt = (_Worksheet)xBk.ActiveSheet;
 
   //
   //取得标题
   //
   foreach(DataColumn col in dv.Table.Columns)
   {
    colIndex++;
    excel.Cells[4,colIndex] = col.ColumnName;
    xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐
   }
 
   //
   //取得表格中的数据
   //
   foreach(DataRowView row in dv)
   {
    rowIndex ++;
    colIndex = 1;
    foreach(DataColumn col in dv.Table.Columns)
    {
     colIndex ++;
     if(col.DataType == System.Type.GetType("System.DateTime"))
     {
      excel.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
      xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
     }
     else
      if(col.DataType == System.Type.GetType("System.String"))
     {
      excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
      xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
     }
     else
     {
      excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
     }
    }
   }
   //
   //加载一个合计行
   //
   int rowSum = rowIndex + 1;
   int colSum = 2;
   excel.Cells[rowSum,2] = "合计";
   xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter;
   //
   //设置选中的部分的颜色
   //
   xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select();
   xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
   //
   //取得整个报表的标题
   //
   excel.Cells[2,2] = str;
   //
   //设置整个报表的标题格式
   //
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;
   //
   //设置报表表格为最适应宽度
   //
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();
   //
   //设置整个报表的标题为跨列居中
   //
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection;
   //
   //绘制边框
   //
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//设置左边线加粗
   xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//设置上边线加粗
   xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//设置右边线加粗
   xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//设置下边线加粗
   //
   //显示效果
   //
   excel.Visible=true;
 
   //xSt.Export(Server.MapPath(".")+""+this.xlfile.Text+".xls",SheetExportActionEnum.ssExportActionNone,Microsoft.Office.Interop.OWC.SheetExportFormat.ssExportHTML);
   xBk.SaveCopyAs(Server.MapPath(".")+""+this.xlfile.Text+".xls");
 
   ds = null;
            xBk.Close(false, null,null);
   
            excel.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
            xBk = null;
            excel = null;
   xSt = null;
            GC.Collect();
   string path = Server.MapPath(this.xlfile.Text+".xls");
 
   System.IO.FileInfo file = new System.IO.FileInfo(path);
   Response.Clear();
   Response.Charset="GB2312";
   Response.ContentEncoding=System.Text.Encoding.UTF8;
   // 添加头信息,为"文件下载/另存为"对话框指定默认文件名
   Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name));
   // 添加头信息,指定文件大小,让浏览器能够显示下载进度
   Response.AddHeader("Content-Length", file.Length.ToString());
   
   // 指定返回的是一个不能被客户端读取的流,必须被下载
   Response.ContentType = "application/ms-excel";
   
   // 把文件流发送到客户端
   Response.WriteFile(file.FullName);
   // 停止页面的执行
  
   Response.End();
}

  
   上面的方面,均将要导出的excel数据,直接给浏览器输出文件流,下面的方法是首先将其存到服务器的某个文件夹中,然后把文件发送到客户端。这样可以持久的把导出的文件存起来,以便实现其它功能。
5、将excel文件导出到服务器上,再下载。

二、winForm中导出Excel的方法:

1、方法1:

   SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
   SqlDataAdapter da=new SqlDataAdapter("select * from tb1",conn);
   DataSet ds=new DataSet();
   da.Fill(ds,"table1");
   DataTable dt=ds.Tables["table1"];
   string name=System.Configuration.ConfigurationSettings.AppSettings["downloadurl"].ToString()+DateTime.Today.ToString("yyyyMMdd")+new Random(DateTime.Now.Millisecond).Next(10000).ToString()+".csv";//存放到web.config中downloadurl指定的路径,文件格式为当前日期+4位随机数
   FileStream fs=new FileStream(name,FileMode.Create,FileAccess.Write);
   StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding("gb2312"));
   sw.WriteLine("自动编号,姓名,年龄");
   foreach(DataRow dr in dt.Rows)
   {
    sw.WriteLine(dr["ID"]+","+dr["vName"]+","+dr["iAge"]);
   }
   sw.Close();
   Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
   Response.ContentType = "application/ms-excel";// 指定返回的是一个不能被客户端读取的流,必须被下载
   Response.WriteFile(name); // 把文件流发送到客户端
   Response.End();

 
public void Out2Excel(string sTableName,string url)
{
Excel.Application oExcel=new Excel.Application();
Workbooks oBooks;
Workbook oBook;
Sheets oSheets;
Worksheet oSheet;
Range oCells;
string sFile="",sTemplate="";
//
System.Data.DataTable dt=TableOut(sTableName).Tables[0];

sFile=url+"myExcel.xls";
sTemplate=url+"MyTemplate.xls";
//
oExcel.Visible=false;
oExcel.DisplayAlerts=false;
//定义一个新的工作簿
oBooks=oExcel.Workbooks;
oBooks.Open(sTemplate,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing, Type.Missing);
oBook=oBooks.get_Item(1);
oSheets=oBook.Worksheets;
oSheet=(Worksheet)oSheets.get_Item(1);
//命名该sheet
oSheet.Name="Sheet1";

oCells=oSheet.Cells;
//调用dumpdata过程,将数据导入到Excel中去
DumpData(dt,oCells);
//保存
oSheet.SaveAs(sFile,Excel.XlFileFormat.xlTemplate,Type.Missing,Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
oBook.Close(false, Type.Missing,Type.Missing);
//退出Excel,并且释放调用的COM资源
oExcel.Quit();

GC.Collect();
KillProcess("Excel");
}

private void KillProcess(string processName)
{
System.Diagnostics.Process myproc= new System.Diagnostics.Process();
//得到所有打开的进程
try
{
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
if(!thisproc.CloseMainWindow())
{
thisproc.Kill();
}
}
}
catch(Exception Exc)
{
throw new Exception("",Exc);
}
}

2、方法2:


 

protected void ExportExcel()
  {
   gridbind();
   if(ds1==null) return;
 
   string saveFileName="";
//   bool fileSaved=false;
   SaveFileDialog saveDialog=new SaveFileDialog();
   saveDialog.DefaultExt ="xls";
   saveDialog.Filter="Excel文件|*.xls";
   saveDialog.FileName ="Sheet1";
   saveDialog.ShowDialog();
   saveFileName=saveDialog.FileName;
   if(saveFileName.IndexOf(":")<0) return; //被点了取消
//   excelapp.Workbooks.Open   (App.path & 工程进度表.xls)
  
   Excel.Application xlApp=new Excel.Application();
   object missing=System.Reflection.Missing.Value;
 

   if(xlApp==null)
   {
    MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
    return;
   }
   Excel.Workbooks workbooks=xlApp.Workbooks;
   Excel.Workbook workbook=workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
   Excel.Worksheet worksheet=(Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
   Excel.Range range;
   
 
   string oldCaption=Title_label .Text.Trim ();
   long totalCount=ds1.Tables[0].Rows.Count;
   long rowRead=0;
   float percent=0;
 
   worksheet.Cells[1,1]=Title_label .Text.Trim ();
   //写入字段
   for(int i=0;i<ds1.Tables[0].Columns.Count;i++)
   {
    worksheet.Cells[2,i+1]=ds1.Tables[0].ColumnsIdea [I].ColumnName; 
    range=(Excel.Range)worksheet.Cells[2,i+1];
    range.Interior.ColorIndex = 15;
    range.Font.Bold = true;
 
   }
   //写入数值
   Caption .Visible = true;
   for(int r=0;r<ds1.Tables[0].Rows.Count;r++)
   {
    for(int i=0;i<ds1.Tables[0].Columns.Count;i++)
    {
     worksheet.Cells[r+3,i+1]=ds1.Tables[0].Rows[r];    
    }
    rowRead++;
    percent=((float)(100*rowRead))/totalCount;   
    this.Caption.Text= "正在导出数据["+ percent.ToString("0.00")  +"%]...";
    Application.DoEvents();
   }
   worksheet.SaveAs(saveFileName,missing,missing,missing,missing,missing,missing,missing,missing);
   
   this.Caption.Visible= false;
   this.Caption.Text= oldCaption;
 
   range=worksheet.get_Range(worksheet.Cells[2,1],worksheet.Cells[ds1.Tables[0].Rows.Count+2,ds1.Tables[0].Columns.Count]);
   range.BorderAround(Excel.XlLineStyle.xlContinuous,Excel.XlBorderWeight.xlThin,Excel.XlColorIndex.xlColorIndexAutomatic,null);
  
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle =Excel.XlLineStyle.xlContinuous;
   range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight =Excel.XlBorderWeight.xlThin;
 
   if(ds1.Tables[0].Columns.Count>1)
   {
    range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex=Excel.XlColorIndex.xlColorIndexAutomatic;
    }
   workbook.Close(missing,missing,missing);
   xlApp.Quit();
  }

三、附注:
虽然都是实现导出excel的功能,但在asp.net和winform的程序中,实现的代码是各不相同的。在asp.net中,是在服务器端读取数据,在服务器端把数据以ms-excel的格式,以Response输出到浏览器(客户端);而在winform中,是把数据读到客户端(因为winform运行端就是客户端),然后调用客户端安装的office组件,将读到的数据写在excel
posted @ 2008-09-26 10:41 Forrest Gump 阅读(11809) 评论(2) 编辑
摘要: 关于Assembly.CreateInstance()与Activator.CreateInstance()方法

动态创建类对象,大多是Activator.CreateInstance()和Activator.CreateInstance()方法,非常好用,一般都用了Assembly.Load("AssemblyName").CreateInstance ("ClassName");的方法,研究一下这两者到底有什么区别,在msdn里,查到了两个方法的介绍:
阅读全文
posted @ 2008-05-02 01:07 Forrest Gump 阅读(3957) 评论(2) 编辑
posted @ 2008-04-02 01:14 Forrest Gump 阅读(928) 评论(2) 编辑
posted @ 2008-03-27 16:48 Forrest Gump 阅读(224) 评论(3) 编辑
摘要: 适用于:
Microsoft .NET Framework 2.0
Microsoft Visual Studio 2005
Microsoft Windows Server 2003
Microsoft InterNET Information Services
Microsoft Message Queuing
Microsoft SQL Server 2005
Oracle 10G Database

摘要:.NET Pet Shop 应用程序的设计说明了构建企业 n 层 .NET 2.0 应用程序的最佳做法,这种应用程序可能需要支持各种数据库平台和部署方案。

阅读全文
posted @ 2008-02-26 11:06 Forrest Gump 阅读(186) 评论(0) 编辑
posted @ 2008-02-22 17:35 Forrest Gump 阅读(1755) 评论(1) 编辑