随笔-22  评论-2  文章-60  trackbacks-0
  2011年6月30日
本文转自: http://www.xfrog.cn/blog/article.asp?id=62
Ajax的一个最大的特点是无需刷新页面便可向服务器传输或读写数据(又称无刷新更新页面),这一特点主要得益于XMLHTTP组件XMLHTTPRequest对象。这样就可以向再发桌面应用程序只同服务器进行数据层面的交换,而不用每次都刷新界面也不用每次将数据处理的工作提交给服务器来做,这样即减轻了服务器的负担又加快了响应速度、缩短了用户等候时间。
  最早应用XMLHTTP的是微软,IE(IE5以上)通过允许开发人员在Web页面内部使用XMLHTTP ActiveX组件扩展自身的功能,开发人员可以不用从当前的Web页面导航而直接传输数据到服务器上或者从服务器取数据。这个功能是很重要的,因为它帮助减少了无状态连接的痛苦,它还可以排除下载冗余HTML的需要,从而提高进程的速度。Mozilla(Mozilla1.0以上及NetScape7以上)做出的回应是创建它自己的继承XML代理类:XMLHttpRequest类。Konqueror (和Safari v1.2,同样也是基于KHTML的浏览器)也支持XMLHttpRequest对象,而Opera也将在其v7.6x+以后的版本中支持XMLHttpRequest对象。对于大多数情况,XMLHttpRequest对象和XMLHTTP组件很相似,方法和属性也类似,只是有一小部分属性不支持。

XMLHttpRequest的应用:
XMLHttpRequest对象在JS中的应用
var xmlhttp = new XMLHttpRequest();
微软的XMLHTTP组件在JS中的应用
var xmlhttp = new ActiveXObject(Microsoft.XMLHTTP);
var xmlhttp = new ActiveXObject(Msxml2.XMLHTTP);
XMLHttpRequest 对象方法
/**
* Cross-browser XMLHttpRequest instantiation.
*/

if (typeof XMLHttpRequest == 'undefined') {
XMLHttpRequest = function () {
var msxmls = ['MSXML3', 'MSXML2', 'Microsoft']
for (var i=0; i < msxmls.length; i++) {
try {
return new ActiveXObject(msxmls[i]+'.XMLHTTP')
} catch (e) { }
}
throw new Error("No XML component installed!")
}
}
function createXMLHttpRequest() {
try {
// Attempt to create it "the Mozilla way" 
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
// Guess not - now the IE way
if (window.ActiveXObject) {
return new ActiveXObject(getXMLPrefix() + ".XmlHttp");
}
}
catch (ex) {}
return false;
};

XMLHttpRequest 对象方法 方法 描述 
abort() 停止当前请求 
getAllResponseHeaders() 作为字符串返问完整的headers 
getResponseHeader("headerLabel") 作为字符串返问单个的header标签 
open("method","URL"[,asyncFlag[,"userName"[, "password"]]]) 设置未决的请求的目标 URL, 方法, 和其他参数 
send(content) 发送请求 
setRequestHeader("label", "value") 设置header并和请求一起发送 

XMLHttpRequest 对象属性 属性 描述 
onreadystatechange 状态改变的事件触发器 
readyState 对象状态(integer):
0 = 未初始化
1 = 读取中
2 = 已读取
3 = 交互中
4 = 完成 
responseText 服务器进程返回数据的文本版本 
responseXML 服务器进程返回数据的兼容DOM的XML文档对象 
status 服务器返回的状态码, 如:404 = "文件末找到" 、200 ="成功" 
statusText 服务器返回的状态文本信息 


XMLHttpRequest 使用经验

*
*author Jouy.lu
*/
var xmlHttp; //首先定义一个全局域变量来保存对象的引用;
function createXMLHttpRequest(){ //该方法用来创建XMLHttpRequest对象的实例.
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();

}

考虑到兼容浏览器的问题:建议的写法如下:

var xmlhttp;
function createXmlhttp(){
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType("text/xml");
}

}
else if(window.ActiveXObject){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if(!xmlhttp){
window.alert("Your broswer not support XMLHttpRequest!");
}
return xmlhttp;
}
/************************************XMLHttpRequest的标准操作*********************
abort():终止当前请求;
getAllResponseHeaders():把HTTP所以响应首部作为键/值对返回;
getResponseHeader("header");返回指定首部的串值;
open("POST/GET/PUT","url");建立对服务器的调用,url参数可以是相对URL或绝对URL,该方法还包含了另三个可选参数;
send(content);向服务器发送请求;
setRequestHeader("header","value");把指定首部设置为所提供的值。在设置任何首部之前必须先调用open()。
注:
void open(string method, string url, boolean asynch, string username, string password):这个方法会建立对服务器的调用。
要提供调用的特定方法(GET、POST或PUT),还要提供所调用资源的URL。另外还可以传递一个Boolean值,指示这个调用是异步还是同步的,
默认值为true,这表示请求本质上是异步的。如果这个参数为false,处理就会等待,直到从服务器返回响应为止。由于异步调用是使用Ajax
的主要优点之一,所以倘若将这个参数设置为false,从某种程度上讲与使用XMLHttpRequest对象的初衷不太相符。在某些情况下这,个参数
设置为false也是有用的,比如在持久存储页面之前你可能想先验证用户的输入。最后两个参数不说自明,允许你指定一个特定的用户名和口令。
void send(content):这个方法具体向服务器发出请求。如果请求声明为异步的,这个方法就会立即返回,否则它会等待,直到接收到响应
为止。参数是可选的,可以是一个DOM对象的实例、一个输入流,或者是一个串。传入这个对象的内容会作为请求体的一部分发送。
void setRequestHeader(string header, string value):这个方法为HTTP请求中一个给定的首部设置值。它有两个参数,第一个串表
示要设置的首部,第二个串表示要在首部中放置的值。需要说明,这个方法必须在open()之后才能调用。在所有这些方法中,最有可能用到
的就是open()和send()。XMLHttpRequest对象还有许多属性,在设计Ajax交互时这些属性非常有用。
void abort(): 顾名思义,这个方法就是要停止请求。
string getAllResponseHeaders(): 这个方法的核心功能对Web应用开发人员应该很熟悉了,它会返回一个串,其中包含HTTP请求的所有响
应首部。首部包括Content-Length、Date和URI。
string getResponseHeader(string header):这个方法与getAllResponseHeaders()是对应的,不过它有一个参数来表示你希望得到哪一个
首部值,并且会把这个值作为一个串返回。


******************************/
/*******************************标准XMLHttpRequest属性**********************
onreadystatechange:每个状态改变时都会触发这个事件处理器,通常会调用一个JavaScript函数。
readyState:请求的状态。有5个可取值:0 = 未初始化,1 = 正在加载, 2 = 已加载, 3 = 交互中, 4 = 完成。
responseText:服务器的响应,表示为一个串。
responseXML:服务器的响应,表示为XML。这个对象可以解析为一个DOM对象。
status:服务器的HTTP状态码(200对应OK,404对应Not Found(未找到),等等).
statusText:HTTP状态码的相应文本(OK或Not Found(未找到)等等)。
***************************************************************************
*/

/*********************来看看到底要怎么才能发送请求*******
使用XMLHttpRequest对象发送请求的基本步骤如下:
1.得到XMLHttpRequest对象实例的一个引用,为此,可以创建一个新的实例,也可以访问包含有
XMLHttpRequest实例的一个变量。
2.告诉XMLHttpRequest对象,哪个函数会处理XMLHttpRequest对象状态的改变。为此要把对象的
onreadystatechange属性设置为指向一个JavaScript函数的指针。
3. 指定请求的属性。XMLHttpRequest对象的open()方法会指定将发出的请求。open()方法取3个
参数:一个是指示所用方法(通常是GET或POST)的串,另一个是表示目标资源URL的串,还有一
个Boolean值,指示请求是否是异步的。
4. 将请求发送给服务器。XMLHttpRequest对象的send()方法会把请求传送到指定的目标资源。
send()方法接受一个参数,这通常是一个串或一个DOM对象。这个参数会作为请求体的一部分传送到
目标URL.向send()方法提供参数时,要确保open()中指定的方法是POST。如果没有数据要作为请求体
的一部分发送,则使用null。

异步方式给用户带来的体验:(我想程序员看到这段解释,心里真的很爽!)
对服务器的请求是异步发送的,因此浏览器可以继续响应用户输入,并在后台等待服务器的响应。
如果选择同步操作,而且倘若服务器的响应要花好几秒才能到达,浏览器就会表现得很迟钝,在
等待期间不能响应用户的输入。这样一来,浏览器好像被冻住一样,无法响应用户输入,而异步
做法可以避免这种情况,从而让最终用户有更好的体验,尽管这种改善很细微,但确实很有意义。
这样用户就能继续工作,而且服务器会在后台处理先前的请求。能与服务器通信而不打断用户的
工作流,这样就可以采用很多技术来改善用户体验。例如,假设有一个验证用户输入的应用。用
户在输入表单上填写各个域时,浏览器可以定期地向服务器发送表单值来进行验证,此时并不打
断用户,他还可以继续填写余下的表单域。如果某个验证规则失败,用户会立即得到通知,而不
必等表单真正发送到服务器进行处理时才知道有错误,这就能大大节省用户的时间,也能减轻服
务器上的负载压力,因为不必在表单提交不成功时完全重建表单的内容。

下面是说明安全问题的:
XMLHttpRequest对象要受制于浏览器的安全“沙箱”。XMLHttpRequest对象请求的所有资源
都必须与调用脚本在同一个域(domain)内。这个安全限制使得XMLHttpRequest对象不能请
求脚本所在域之外的资源。这个安全限制的强度如何因浏览器而异(见图2-5)。Internet Explorer
会显示一个警告,指出可能存在一个安全风险,但是用户可以选择是否继续发出请求。Firefox则
会断然停止请求,并在JavaScript控制台显示一个错误消息。Firefox确实提供了一些JavaScript技巧,
使得XMLHttpRequest也可以请求外部URL的资源。不过,由于这些技术针对特定的浏览器,最好不要用,
而且要避免使用XMLHttpRequest访问外部URL。
posted @ 2011-06-30 09:39 blair0807 阅读(87) 评论(0) 编辑
  2011年6月28日
使用XMLHttpRequest对象分为4部完成:

1.创建XMLHttpRequest组建

2.设置回调函数

3.初始化XMLHttpRequest组建

4.发送请求

实例代码:

var userName;  
    
var passWord;  
    
var xmlHttpRequest;  
      
      
    
//XmlHttpRequest对象  
    function createXmlHttpRequest(){  
        
if(window.ActiveXObject){ //如果是IE浏览器  
            return new ActiveXObject("Microsoft.XMLHTTP");  
        }
else if(window.XMLHttpRequest){ //非IE浏览器  
            return new XMLHttpRequest();  
        }  
    }  
      
    
function onLogin(){  
        userName 
= document.f1.username.value;  
        passWord 
= document.f1.password.value;    
          
        
var url = "LoginServlet?username="+userName+"&password="+passWord+"";     
              
        
//1.创建XMLHttpRequest组建  
        xmlHttpRequest = createXmlHttpRequest();  
          
        
//2.设置回调函数  
        xmlHttpRequest.onreadystatechange = zswFun;  
          
        
//3.初始化XMLHttpRequest组建  
        xmlHttpRequest.open("POST",url,true);  
          
        
//4.发送请求  
        xmlHttpRequest.send(null);    
    }     
      
      
    
//回调函数  
    function zswFun(){  
        
if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){  
            
var b = xmlHttpRequest.responseText;  
            
if(b == "true"){  
                alert(
"登录成功!");  
            }
else{  
                alert(
"登录失败!");  
            }         
        }  
    }  

11

var xmlhttp;
function verify1() {
    
var username = document.getElementById("username").value;
    
//确定浏览器
    if(window.XMLHttpRequest) {
        
//针对FireFox、Mozillar、Opera、Safari、IE7、IE8
        //创建XMLHttpRequest对象
        xmlhttp = new XMLHttpRequest();
        
//修正某些浏览器的BUG
        if(xmlhttp.overrideMimeType) {
            xmlhttp.overrideMimeType(
"text/html");
        }
    }
else if(window.ActiveXObject){
        
//针对IE5、IE5.5、IE6
        //这两个为插件名称作为参数传递,为了创建ActiveXObject
        var activeName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
        
for(var i=0;i>activeName.length();i++) {
              
try{
                  
//非别取出,如果创建成功则终止循环,如果失败则会抛出异常继续循环
                  xmlhttp = new ActiveXObject(activeName[i]);
                  
break;
              }
catch(e){
              }
        }
    }
    
//确定XMLHttpRequest是否创建成功
    /*if(!xmlhttp) {
        alert("XMLHttpRequest创建失败!");
        return;
    }else {
        alert("XMLHttpRequest创建成功!"+xmlhttp);
    }
*/
    
//注册回调函数
    xmlhttp.onreadystatechange=callback;
    url 
= "classisservlet?name="+username;
    
//设置连接信息
    //1.是http请求的方式
    //2.是服务器的地址
    //3.是采用同步还是异步,true为异步
    //xmlhttp.open("GET",url,true);
    //post请求与get请求的区别
    //第一个参数设置成post第二个只写url地址,第三个不变
    xmlhttp.open("POST","classisservlet",true);
    
//post请求要自己设置请求头
   xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    
//发送数据,开始与服务器进行交互
    //post发送请求
    xmlhttp.send("name="+username);
}
function callback() {
    
//接收响应数据
    //判断对象状态是否交互完成,如果为4则交互完成
    if(xmlhttp.readyState == 4) {
         
//判断对象状态是否交互成功,如果成功则为200
        if(xmlhttp.status == 200) {
            
//接收数据,得到服务器输出的纯文本数据
            var response = xmlhttp.responseText;
            
//得到div的节点将数据显示在div上
            var divresult = document.getElementById("result");
            divresult.innerHTML 
= response;
        }
    }


 

 

posted @ 2011-06-28 14:10 blair0807 阅读(503) 评论(0) 编辑

方法主要有三种

转换函数、强制类型转换、利用js变量弱类型转换。

1. 转换函数:

js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。

一些示例如下:

parseInt("1234blue"); //returns 1234
parseInt("0xA"); //returns 10
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN

parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,示例如下:

parseInt("AF", 16); //returns 175
parseInt("10", 2); //returns 2
parseInt("10", 8); //returns 8
parseInt("10", 10); //returns 10
如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
parseInt("010"); //returns 8
parseInt("010", 8); //returns 8
parseInt("010", 10); //returns 10

parseFloat()方法与parseInt()方法的处理方式相似。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,parseFloat()没有基模式。

下面是使用parseFloat()方法的示例:
parseFloat("1234blue"); //returns 1234.0
parseFloat("0xA"); //returns NaN
parseFloat("22.5"); //returns 22.5
parseFloat("22.34.5"); //returns 22.34
parseFloat("0908"); //returns 908
parseFloat("blue"); //returns NaN

2. 强制类型转换

还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。

可以用下面的代码段测试Boolean型的强制类型转换。

Boolean(""); //false – empty string
Boolean("hi"); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(null); //false null
Boolean(0); //false zero
Boolean(new Object()); //true – object

Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。示例如下:

用  法 结  果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number( "5.5 ") 5.5
Number( "56 ") 56
Number( "5.6.7 ") NaN
Number(new Object()) NaN
Number(100) 100

最后一种强制类型转换方法String()是最简单的,示例如下:

var s1 String(null); //"null"
var oNull null;
var s2 oNull.toString(); //won’t work, causes an error

3. 利用js变量弱类型转换

举个小例子,一看,就会明白了。
<script>
var str= '012.345 ';
var str-0;
x*1;
</script>

上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换,不过这个方法还是不推荐的

posted @ 2011-06-28 10:53 blair0807 阅读(2243) 评论(0) 编辑
/*
 * 格式化数字显示方式  
 * 用法 
 * formatNumber(12345.999,'#,##0.00'); 
 * formatNumber(12345.999,'#,##0.##'); 
 * formatNumber(123,'000000'); 
 * @param num 
 * @param pattern 
 
*/  
function formatNumber(num,pattern){  
  
var strarr = num?num.toString().split('.'):['0'];  
  
var fmtarr = pattern?pattern.split('.'):[''];  
  
var retstr='';  
  
  
// 整数部分  
  var str = strarr[0];  
  
var fmt = fmtarr[0];  
  
var i = str.length-1;    
  
var comma = false;  
  
for(var f=fmt.length-1;f>=0;f--){  
    
switch(fmt.substr(f,1)){  
      
case '#':  
        
if(i>=0 ) retstr = str.substr(i--,1+ retstr;  
        
break;  
      
case '0':  
        
if(i>=0) retstr = str.substr(i--,1+ retstr;  
        
else retstr = '0' + retstr;  
        
break;  
      
case ',':  
        comma 
= true;  
        retstr
=','+retstr;  
        
break;  
    }  
  }  
  
if(i>=0){  
    
if(comma){  
      
var l = str.length;  
      
for(;i>=0;i--){  
        retstr 
= str.substr(i,1+ retstr;  
        
if(i>0 && ((l-i)%3)==0) retstr = ',' + retstr;   
      }  
    }  
    
else retstr = str.substr(0,i+1+ retstr;  
  }  
  
  retstr 
= retstr+'.';  
  
// 处理小数部分  
  str=strarr.length>1?strarr[1]:'';  
  fmt
=fmtarr.length>1?fmtarr[1]:'';  
  i
=0;  
  
for(var f=0;f<fmt.length;f++){  
    
switch(fmt.substr(f,1)){  
      
case '#':  
        
if(i<str.length) retstr+=str.substr(i++,1);  
        
break;  
      
case '0':  
        
if(i<str.length) retstr+= str.substr(i++,1);  
        
else retstr+='0';  
        
break;  
    }  
  }  
  
return retstr.replace(/^,+/,'').replace(/\.$/,'');  
}  
posted @ 2011-06-28 10:52 blair0807 阅读(146) 评论(0) 编辑
  2011年4月1日

最近做网站需要往mysql里面插入数据,但vs2008自带的linq也不支持mysql.

在网上找了些资料,终于找到了个支持mysql的linq工具,就是DBLinq.把方法帖上来以便以后使用.

一、工具:
Dblinq ;
MySQL 5.0以上,编程主机需要安装;
VS2008

二、生成DataContext cs文件
DbMetal.exe -provider=MySql -database:MyDatebase -server:you host computer -user:mysql user -password:you pwd -namespace:mysqllinq -code:mysqllinq.cs -sprocs
//注,名称空间是mysqllinq,-sprocs一定要

三、将文件DataContext cs放到项目文件中
注意:cs文件放在项目的首层,比如App_Code中,或者内库中

using DbLinq.Linq;
using DbLinq.Linq.Mapping;
(如果不是放在App_Code中,在此添加引用)


四、在VS 2008中新建类项目DALMySQL,并添加引用


DbLinq.dll;
DbLinq.MySql.dll;
MySql.Data.dll;
//上面三个在DbLinq-0.18"build中可以找到。
System.Data.Linq.dll;
//在C:"Program Files"Reference Assemblies"Microsoft"Framework"v3.5"System.Data.Linq.dll
//这是一要引用!!!
五、添加Web_App项目,添加对项目DALMySQL的引用

六、在aspx.cs页面中添加引用:


using MySql.Data;
using MySql.Data.MySqlClient;
using mysqllinq;//DataContext cs文件的名字空间

//省略
string connStr = @"server=localhost;database=test;user=root;pwd=ikmb;port=3306";

            MySqlConnection conn = new MySqlConnection(connStr);
Test t = new Test(conn);
var data = from f in t.Users select f;
GridView1.DataSource = data;
GridView1.DataBind();

最后给个DbLinq下载

========================注意点的分割线==========================

*以上文章提供下载的是DbLinq-0.18, 我个人用的是DbLinq-0.20.1  ,Download DbLinq. (注:如果是DbLinq-0.20.1,要在解压后将MySql.Data.dll 拷贝至文件夹内,再运行生成命令)

 

 

posted @ 2011-04-01 10:32 blair0807 阅读(457) 评论(0) 编辑
  2011年2月28日
#nav {
  list
-style-type: none; 
  font
-size:14px;
}

#nav a {
 display: block; 

 text
-align:center;
}

#nav a:link  {
 
 text-decoration:none;
}
#nav a:visited  {
 
text-decoration:none;
}
#nav a:hover  {

 text
-decoration:none;
}

#nav li {
 
float: left; 
}
#nav li a:hover{

}
#nav li ul 
{
    top:149px;

    list
-style-type:none;text-align:left;    
    left: 
-999em; width: 180px; position: absolute; 
}
#nav li ul li{
    
float: left; 
    width: 180px;
    background: #5AA428; 
}


#nav li ul a{
    display: block;
    width: 150px;
    text
-align:left;
    padding
-left:10px;
}

#nav li ul a:link  {
    text
-decoration:none;
}
#nav li ul a:visited  {
    text
-decoration:none;
}
#nav li ul a:hover  {
    text
-decoration:none;font-weight:normal;
    background:#F6F6F6;
}

#nav li:hover ul {
    left: auto;
}
#nav li.sfhover ul {
    left: auto;
}
#content {
    clear: left; 
}

</style>
    <script type="text/javascript"><!--        //--><![CDATA[//><!--
        function menuFix() {
            
var sfEls = document.getElementById("nav").getElementsByTagName("li");
            
for (var i = 0; i < sfEls.length; i++) {
                sfEls[i].onmouseover 
= function () {
                    
this.className += (this.className.length > 0 ? " " : ""+ "sfhover";
                }
                sfEls[i].onMouseDown 
= function () {
                    
this.className += (this.className.length > 0 ? " " : ""+ "sfhover";
                }
                sfEls[i].onMouseUp 
= function () {
                    
this.className += (this.className.length > 0 ? " " : ""+ "sfhover";
                }
                sfEls[i].onmouseout 
= function () {
                    
this.className = this.className.replace(new RegExp("( ?|^)sfhover\\b"),

"");
                }
            }
        }
        window.onload 
= menuFix;

        
//--><!]]></script>

 

静态menu 前台code:

<ul id="nav">
 
<li ><a  href="/Default.aspx"><span>Home</span></a></li>
  
<li ><a  href="/Account/Default.aspx"><span>My Account</span></a>
    
<ul>
    
<li><href="/Account/Default.aspx">Default</a></li>
    
<li><href="/Account/ChangePassword.aspx">ChangePassword</a></li>
   
</ul></li>
    
<li><href="/PMail/Default.aspx">Private Mail</a>
        
<ul>
            
<li><href="/PMail/SendMail.aspx">Send Mail</a></li>
            
<li><href="/PMail/Inbox.aspx">InBox</a></li>
            
<li><href="/PMail/SendBox.aspx">Sendbox</a></li>
        
</ul>
    
</li>

</ul>  

动态menu 前台code

<asp:Repeater ID="rptTopMenu" runat="server" 
    onitemdatabound
="rptTopMenu_ItemDataBound">
    
<HeaderTemplate>
        
<ul id="nav">
    
</HeaderTemplate>
    
<ItemTemplate>
        
<li ><a  href="<%# Eval("MenuUrl") %>"><span><%Eval("MenuTitle"%></span></a>
            
<asp:Repeater ID="rptSubMenu" runat="server">
                
<HeaderTemplate>
                    
<ul>
                
</HeaderTemplate>
                
<ItemTemplate>
                    
<li><href="<%# Eval("MenuUrl") %>"><%Eval("MenuTitle"%></a></li>
                
</ItemTemplate>
                
<FooterTemplate>
                    
</ul>
                
</FooterTemplate>
            
</asp:Repeater>
        
</li>
    
</ItemTemplate>
    
<FooterTemplate>
        
</ul>
    
</FooterTemplate> 

</ asp:Repeater>


 动态menu 后台code

/// <summary>
        
/// Load Top Menu.
        
/// </summary>
        private void LoadTopMenu()
        {
            _MemberRoles 
= Roles.GetRolesForUser(UserName);

            MemberService memberService 
= new MemberService();
            ReadOnlyCollection
<GoldnexMenu> goldnexMenu = memberService.LoadTopMenuList(_MemberRoles);

            List
<GoldnexMenu> list = new List<GoldnexMenu>();

            
for (int i = 0; i < goldnexMenu.Count; i++)
            {
                
string[] allowUsers = goldnexMenu[i].AllowUsers.Split(',');

                
if (allowUsers.Contains("*"))
                {
                    list.Add(goldnexMenu[i]);
                }
                
else
                {
                    
for (int j = 0; j < _MemberRoles.Length; j++)
                    {
                        
if (allowUsers.Contains(_MemberRoles[j]))
                        {
                            list.Add(goldnexMenu[i]);
                            
break;
                        }
                    }
                }
                                
            }
            rptTopMenu.DataSource 
= list;
            rptTopMenu.DataBind();
        }

        
/// <summary>
        
/// Current UserName
        
/// </summary>
        public string UserName
        {
            
get 
            {
                
return _UserName;
            }
            
set
            {
                _UserName 
= value;
            }
        }

        
/// <summary>
        
/// bind sub menu
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        protected void rptTopMenu_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater rptSubMenu 
= (Repeater)e.Item.FindControl("rptSubMenu");
                GoldnexMenu goldnexMenu 
= (GoldnexMenu)e.Item.DataItem;

                
int topID = goldnexMenu.MenuID;

                MemberService memberService 
= new MemberService();
                ReadOnlyCollection
<GoldnexMenu> subMenuList = memberService.LoadSubMenuList(_MemberRoles,topID);
                rptSubMenu.DataSource 
= subMenuList;
                rptSubMenu.DataBind();
            }

         }  

       

posted @ 2011-02-28 14:19 blair0807 阅读(189) 评论(0) 编辑
  2011年2月21日

    前两天,有网友在Blog上评论要求将子报表的配置贴出来,由于这两天有些别的事情,所以耽搁了;另外,自己也比较懒,有些东西明明应该早就写出来的。呵呵,说声“对不起”,然后还有“谢谢你”!

    OK,这篇随笔就讲一下RDLC报表中子报表SubReport的实现步骤。

    首先来看一下,本文的示例的运行结果。


图1 主子报表示例运行结果

    主子报表的数据源显然也应该是两个具有主子关系的数据表,本文示例依然使用Northwind数据库的订单和订单明细表作为数据源。

    1、在Visual Studio 2005中创建一个Windows应用程序RDLCSR。

    2、在项目中添加数据源,数据源并不一定用来为报表提供数据(当然Visual Studio 2005提供的操作非常方便),主要是在报表设计时可以方便向报表中进行字段拖曳。添加数据源意味着在项目中添加了一个数据集Orders.xsd文件,当报表的数据不是来源于关系型数据库(如Flat Files或Web Services等)时,我们可以自己定义一个xsd文件作为报表设计时的数据源,而在程序中重新为报表载入数据。

    3、在项目中添加报表rptOrder.rdlc和rptOrderDetail.rdlc分别作为示例的主报表和子报表。

    4、为子报表rptOrderDetail.rdlc添加参数pOrderId,指定其数据类型为Integer,然后如图2进行子报表的布局设计。


图2 子报表rptOrderDetail.rdlc布局设计

    5、为主报表rptOrder.rdlc进行如图3所示的布局设计。


图3 主报表rptOrder.rdlc布局设计

    6、在主报表rptOrder.rdlc的子报表控件上单击右键,使用“属性”菜单调出“子报表属性”对话框。在“常规”选项卡中的子报表下拉列表中选择rptOrderDetail;切换到“参数”选项卡,在“参数名称”列中,系统会自动检测到步骤4中定义的子报表的参数pOrderId,并在“参数值”列中指定参数值为=Fields!订单ID.Value。

    7、在子报表rptOrderDetail.rdlc中选择表格控件,使用右键菜单“属性”调出“表属性”对话框,在“筛选器”选项卡中进行入图4的设置。这主要是为了在订单明细中筛选当前订单的明细数据,当然这一步骤可以在程序中用代码指定。


图4 在子报表rptOrderDetail.rdlc中指定筛选器

    好了,至此报表布局的设置已经完成了,下面需要在应用程序中显示报表并给主子报表分别提供数据。

    8、在窗体frmMain中添加ReportViewer控件rptMain,并在rptMain的“ReportViewer任务”中选择报表rptOrder.rdlc。

    9、在窗体frmMain中添加图5所示的代码:


图5 窗体frmMain的代码

    可见,必须对ReportViewer控件的LocalReport对象添加SubReportProcessing事件,而该事件主要也就是为了子报表提供数据。

    现在就可以运行应用程序查看结果了,如图6所示。


图6 示例运行结果(未给列表指定分组)

    在图6中,我们看到出现两个订单显示在同一页面,而在实际应用中,我们可能希望,每个页面

上只显示一条订单。此时,可以进行以下的设置:

    10、在主报表rptOrder.rdlc中,选择列表控件,右键“属性”弹出“列表属性”对话框,在“常规”选项卡中,单击按钮“编辑详细信息组”弹出“分组和排序属性对话框”并进行如图7所示的设置。


图7 为列表指定分组并设置分页显示选项

    事实上,主子报表和钻取报表有着相似的地方,所以如果看了这篇随笔有什么不明白的地方,可以参看一下我的另一篇随笔RDLC Report Step by Step 1: DrillThrough Report

    Demo下载

    

posted @ 2011-02-21 10:29 blair0807 阅读(130) 评论(0) 编辑
  2011年2月14日
摘要: 在按钮单击事件中加入如下代码,可以实现直接导出特定格式的报表文件的功能代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> stringorderIDCollection= "1,2,3";//newaReportViewercontrolReportViewerrview=newMicrosoft.Reporting.WebForms.ReportViewer();rview.ProcessingMode=Process阅读全文
posted @ 2011-02-14 11:28 blair0807 阅读(78) 评论(0) 编辑
  2011年2月12日
摘要: 1.Reporting Services自带的导出功能可以将查询结果导出到多种文件格式,但缺点是无法控制导出权限。 在某些应用中,有的报表需要控制导出功能,这就需要屏蔽Reporting Servies的自带导出功能,以手工的方式导出。例如将导出功能绑定到Button事件当中,这样控制导出权限就非常的方便了。2.屏蔽Reporting Servies的导出功能。屏蔽导出功能非常简单,只要修改Reporting Services的CSS样式表即可实现。在SQL SERVER的安装目录下搜索HtmlViewer.css,将ToolbarExport节display: inline;改为displa阅读全文
posted @ 2011-02-12 12:47 blair0807 阅读(241) 评论(0) 编辑
  2011年2月10日
摘要: 如果要打A4大小的,则报表主体宽度必须小于20cm报表属性:InteractiveSize: 29.7cm,21cmMargins: 1.5cm,1.5cm,1.5cm,1.5cmPageSize: 29.7cm,21cm主体属性Size.Width: 26.6cm(InteractiveSize.Width-Margins.Left-Margins.Right-0.1)阅读全文
posted @ 2011-02-10 16:36 blair0807 阅读(98) 评论(0) 编辑
仅列出标题  下一页