- 相關(guān)推薦
ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的方法有哪三種
當在一個(gè)ASP.NET
Web頁(yè)面中進(jìn)行操作時(shí),在默認情況下向當前頁(yè)進(jìn)行提交。這種行為在A(yíng)SP.NET出現之前并沒(méi)有什么關(guān)系,但在A(yíng)SP.NET中當我們想向另外一個(gè)Web頁(yè)提交一個(gè)Web
Form時(shí)該如何做呢?在A(yíng)SP.NET1.0中這個(gè)問(wèn)題變得很難解決,但在A(yíng)SP.NET2.0中為開(kāi)發(fā)人員提供了更容易的解決的技術(shù):跨網(wǎng)頁(yè)提交。這種技術(shù)允許一個(gè)網(wǎng)頁(yè)在提交數據時(shí)提交給另外的一個(gè)頁(yè)面。在跨網(wǎng)頁(yè)提交中,用于初始化提交代碼的頁(yè)面叫源頁(yè)面,而客戶(hù)提交的頁(yè)面叫目標頁(yè)面。
為了方便起見(jiàn),目標頁(yè)面仍然獲得原頁(yè)面提交的所有數據。換名話(huà)說(shuō),從技術(shù)觀(guān)點(diǎn)出發(fā),我們可以用同樣的方式處理其他ASP.NET頁(yè)面提交的數據。
這個(gè)新特性意味著(zhù)ASP.NET2.0開(kāi)發(fā)人員目前有三種可供選擇的技術(shù)來(lái)將數據從一個(gè)web頁(yè)面傳送到另外一個(gè)頁(yè)面。這三種方法是:響應重定向,服務(wù)端傳輸和新的跨網(wǎng)頁(yè)提交特性。我們可以已經(jīng)熟悉前兩種技術(shù)了,因此,我們只是簡(jiǎn)要地復習一下它們,然后我們會(huì )將主要精力放到學(xué)習如何使用跨網(wǎng)頁(yè)提交特性,以及闡述一下這種方法和響應重定向以及服務(wù)傳輸方式有什么不同。
一、響應重定向方法
響應重定向方法是目前為止將一個(gè)網(wǎng)頁(yè)重定向到另一個(gè)網(wǎng)頁(yè)的最簡(jiǎn)單的方法的最簡(jiǎn)單的方法。當Web服務(wù)器接到一個(gè)重定向請求后,它會(huì )將一個(gè)響應頭送給客戶(hù)端,這將導致客戶(hù)端發(fā)送一個(gè)新的請求到服務(wù)器。按句話(huà)說(shuō),一個(gè)重定向請求實(shí)際上是兩個(gè)請求響應:一個(gè)是最初的請求響應,另一個(gè)是新的重定向請求響應。
在A(yíng)SP.NET中實(shí)現重定向很容易。下面的代碼演示了如何使用Response.Redirect方法實(shí)現網(wǎng)頁(yè)重定向:
protected
void
Redirect_Click(object
sender,
EventArgs
e)
{
Response.Redirect("menu.aspx");
}
要注意的是重定向請求只是一個(gè)GET請求,這就意味著(zhù)我們不能從源頁(yè)中通過(guò)重定向命令提交數據。但是我們可以在重定向中使用查詢(xún)字符串來(lái)傳遞數據。如下面代碼所示:
protected
void
Redirect_Click(object
sender,
EventArgs
e)
{
Response.Redirect("menu.aspx?userName="
UserName.Text));
}
上面的例子將一個(gè)查詢(xún)字符串作為參數傳遞給了Response.Redirect方法的目標URL。我們可以通過(guò)如下的代碼獲得源數據。
protected
void
Page_Load(object
sender,
EventArgs
e)
{
string
userName
Request["userName"];
}
二、服務(wù)器傳輸方法
和依賴(lài)于客戶(hù)端向另一個(gè)新頁(yè)發(fā)請求不同,服務(wù)器傳輸是一種服務(wù)器重定向技術(shù),這種技術(shù)通過(guò)簡(jiǎn)單的改變Web服務(wù)器所處理的代碼來(lái)達到請求一個(gè)新頁(yè)的目的。當被請求頁(yè)和源頁(yè)面在同一個(gè)服務(wù)器時(shí),服務(wù)器傳輸要比Response.Redirect方法更有效,這是由于這種技術(shù)可以避免額外的開(kāi)銷(xiāo),僅僅使用服務(wù)器的資源就可以進(jìn)行重定向。要注意的這種技術(shù)有一個(gè)副作用,在頁(yè)面進(jìn)行重定向時(shí),客戶(hù)端的URL仍然會(huì )保持源頁(yè)面的URL,這可能會(huì )使客戶(hù)認為他們所獲得的數據是源頁(yè)面產(chǎn)生的。當然,在大多數情況下,這不是問(wèn)題,但是這將使調試變得更困難。
Server.Transfer方法還可以保存初始頁(yè)的HttpContext。因此,目標頁(yè)可以訪(fǎng)問(wèn)源頁(yè)面的值。我們可以使用FormsCollection屬性來(lái)從目標頁(yè)面中獲得源頁(yè)面的值。首先,要確定我們使用了被重載的方法,這個(gè)方法有兩個(gè)參數:目標URL和一個(gè)Boolean類(lèi)型的值,告訴服務(wù)器是否保存用于描述源頁(yè)面值的Form。如下面的代碼所示:
[NextPage]
Server.Transfer("Menu.aspx",true);
然后,我們在目標頁(yè)面中獲得一個(gè)叫txtUserName的Textbox控件的值的代碼如下:
object
obj
Request.Form["txtUserName"];
三、Response.Redirect和Server.Transfer的比較
由于Response.Redirect方法要進(jìn)行兩次請求響應操作,因此,我們應該在對性能要求高的網(wǎng)站盡量避免使用這種方法。然而,只從技術(shù)上說(shuō),使用redirect方式確實(shí)可以從一個(gè)網(wǎng)頁(yè)跳到另一個(gè)網(wǎng)頁(yè)。相比之下,Server.Transfer會(huì )更有效率,但是跳轉的范圍僅限于同一個(gè)Web服務(wù)器的不同網(wǎng)頁(yè)。從本質(zhì)上說(shuō),我們可以使用Server.Transfer來(lái)消除不必要的請求響應操作。如果我們需要重定位到不同服務(wù)器的網(wǎng)頁(yè),就需要使用Response.Redirect方法。
四、跨頁(yè)提交概述
在A(yíng)SP.NET
2.0中,我們可以通過(guò)實(shí)現IbuttonControl接口提交給不同的WebForm,來(lái)實(shí)現跨網(wǎng)頁(yè)的提交。和Response.Redirect類(lèi)似,跨網(wǎng)頁(yè)提交是一個(gè)基于客戶(hù)端的傳輸機制,但也有點(diǎn)象Server.Transfer,目標網(wǎng)頁(yè)也可以訪(fǎng)問(wèn)源網(wǎng)頁(yè)的數據。為了使用跨網(wǎng)頁(yè)提交,我們需要在源網(wǎng)頁(yè)中的PostBackUrl屬性中指定目標URL。
五、實(shí)現跨網(wǎng)頁(yè)提交
這部分將討論一下如何在A(yíng)SP.NET2.0中實(shí)現跨網(wǎng)頁(yè)提交。為了開(kāi)始我們的學(xué)習,假設有兩個(gè)Web頁(yè),一個(gè)是源Web頁(yè),另一個(gè)是目標Web頁(yè)。在源網(wǎng)頁(yè)中初始化了使用按鈕進(jìn)行的跨網(wǎng)頁(yè)提交操作。我們首先必須設置目標網(wǎng)頁(yè)按鈕的PostBackUrl屬性,順便說(shuō)一句,所有實(shí)現了System.Web.UI.WebControls.IbuttonControl接口的Web控件都有跨網(wǎng)頁(yè)提交的特性。下面的代碼將演示這一過(guò)程。
PostBackUrl="~/target.aspx"
text
"Post
to
a
target
page"/>
當我們設置PostBackUrl屬性時(shí),ASP.NET框架將相應的控件綁定到一個(gè)新的叫WebForm_DoPostBackWithOptions的JavaScript函數,產(chǎn)生的Html代碼如下:
onclick="javascript:WebForm_DoPostBackWithOptions(
new
WebForm_PostBackOptions("btnSubmit",
false,
"Target.aspx",
false,
false))"
id="btnSubmit"
/>
對于上面的html代碼來(lái)說(shuō),當用戶(hù)單擊按鈕時(shí),瀏覽器將提交目標URL(Target.aspx),而不是源URL。
六、從目標頁(yè)面中獲得源頁(yè)面控件的值
ASP.NET2.0提供了一個(gè)叫PreviousPage的新的屬性,這個(gè)屬性無(wú)論在何時(shí)當前頁(yè)面進(jìn)行跨網(wǎng)頁(yè)提交操作時(shí)都會(huì )指向源頁(yè)面。要注意的是,當源頁(yè)面和目標頁(yè)面在不同的應用程序中時(shí),這個(gè)屬性包含null(這個(gè)null并不是未初始化的意思)。還有要注意的是當目標網(wǎng)頁(yè)訪(fǎng)問(wèn)PreviousPage屬性時(shí)可以獲得源頁(yè)面的數據,ASP.NET運行時(shí)裝載并執行了源頁(yè)面。這將引發(fā)ProcessChildRequest事件的發(fā)生。而且,它還會(huì )引發(fā)Page_Init事件、Page_Load和任何其他的源頁(yè)面按鈕單擊事件。
因此,我們要避免由于不小心進(jìn)行誤操作,所以最好通過(guò)IsCrossPostBack屬性來(lái)確認是否為一個(gè)跨網(wǎng)頁(yè)提交發(fā)生,如果這個(gè)屬性值為true,那么目標網(wǎng)頁(yè)就是通過(guò)一個(gè)跨網(wǎng)頁(yè)提交動(dòng)作而調用的。如果是通過(guò)另外一種方式調用的(如一般的請求、Response.Redirect或是一個(gè)Server.Transfer),這個(gè)屬性的值為false。下面的例子演示了如何使用這個(gè)屬性。
if
PreviousPage.IsCrossPagePostBack)
{
//執行代碼
}[NextPage]
這個(gè)PreviousPage屬性在Server.Transfer和跨網(wǎng)頁(yè)提交中都可以使用。在A(yíng)SP.NET2.0中,我們可以在調用Server.Transfer操作后使用PreviousPage屬性在目標頁(yè)面中來(lái)獲得源頁(yè)面的數據,代碼如下:
{
Server.Transfer("menu.aspx");
}
protected
void
Redirect_Click(object
sender,
EventArgs
e)
在這個(gè)接收面中我們現在可以獲得Web頁(yè)面的數據,代碼如下:
protected
void
Page_Load(object
sender,
EventArgs
e)
{
if
(PreviousPage
null)
{
TextBox
txtBox
(TextBox)
PreviousPage.FindControl("txtUserName");
if
(textBox
null)
string
userName
textBox.Text;
//其他可執行的代碼
}
}
要注意的是上面的代碼必須將txtUserName控件轉換為T(mén)extBox類(lèi)型,以便可以訪(fǎng)問(wèn)其中的值。
七、使用PreviousPageType
PreviousPageType屬性提供了在跨網(wǎng)頁(yè)操作中訪(fǎng)問(wèn)源頁(yè)面的強類(lèi)型能力,下面讓我們演示一下如何不通過(guò)任何類(lèi)型轉換來(lái)從源頁(yè)面中獲得控件值。代碼如下:
<
asp:Textbox
ID="txtUserName"
Runat="server"
/>
<
asp:Textbox
ID="txtPassword"
Runat="server"
/>
<
asp:Button
ID="Submit"
Runat="server"
Text="Login"
PostBackUrl="Menu.aspx"
/>
要注意的是單擊按鈕可以重定向到一個(gè)叫“Menu.asp”的目標頁(yè)。這個(gè)目標頁(yè)可以使用如下的代碼獲得用戶(hù)名和密碼:
八、保存視圖狀態(tài)
對于跨網(wǎng)頁(yè)提交來(lái)說(shuō),ASP.NET2.0
內嵌了一個(gè)叫__POSTBACK的隱藏字段,這個(gè)字段包含了關(guān)于源頁(yè)面的視圖信息
也就是由源頁(yè)面提供了,包含了一個(gè)帶有一個(gè)非空PostBackUrl屬性值的服務(wù)端控件。目標頁(yè)可以使用__POSTBACK中的信息來(lái)獲得源頁(yè)面的視圖狀態(tài)信息。代碼如下:
if(PreviousPage!=null
&&
PreviousPage.IsCrossPagePostBack
&&
PreviousPage.IsValid)
{
TextBox
txtBox
PreviousPage.FindControl("txtUserName");
Response.Write(txtBox.Text);
}
在上面的代碼中核對了用于確保PreviousPage屬性不為null的檢查代碼。順便提一下,如果目標頁(yè)和源頁(yè)面不在同一個(gè)應用程序中,這個(gè)PreviousPage屬性的值為null。只有在進(jìn)行跨網(wǎng)頁(yè)提交操作時(shí),IsCrossPagePostBack屬性才為true。
這個(gè)跨網(wǎng)頁(yè)提交的特性,是ASP.NET2.0中最強有力的特性之一,這種技術(shù)將允許在一個(gè)頁(yè)面中提交到另外一個(gè)頁(yè)面,并且可以在目標頁(yè)面地無(wú)縫地操作源頁(yè)面中的數據。
asp.net 2.0 權限樹(shù)的控制
做權限的時(shí)候,主要實(shí)現如下功能
1、該節點(diǎn)可以訪(fǎng)問(wèn),則他的父節點(diǎn)也必能訪(fǎng)問(wèn);
2、該節點(diǎn)可以訪(fǎng)問(wèn),則他的子節點(diǎn)也都能訪(fǎng)問(wèn);
3、該節點(diǎn)不可訪(fǎng)問(wèn),則他的子節點(diǎn)也不能訪(fǎng)問(wèn)。
使用帶CheckBox的數型結構能得到很好的用戶(hù)體驗,可是編程的難度也是有點(diǎn)增加,如果全部有服務(wù)端來(lái)完成,那點(diǎn)下刷下,肯定不行,只能使用javascript,javascript調試的時(shí)候郁悶的很,一個(gè)字類(lèi),還有郁悶的遞歸,麻煩
我以前是使用以下該方法
<script
language="javascript">
//oncheck事件
function
tree_oncheck(tree)
{
var
i;
var
node=tree.getTreeNode(tree.clickedNodeIndex);
var
Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(node,Pchecked);
setParent(node,Pchecked);
//window.alert(Pchecked);
document.all.checked.value
if
(tree.getChildren().length
>
0)
{
for
(i=0;i<=tree.getChildren().length-1;i++)
{
if
(tree.getChildren()[i].getAttribute("Checked"))
{
AddChecked(tree.getChildren()[i]);
}
FindCheckedFromNode(tree.getChildren()[i]);
}
}
}
//設置子節點(diǎn)選中
function
setcheck(node,Pchecked)
{
var
i;
var
ChildNode=new
Array();
ChildNode=node.getChildren();
if(parseInt(ChildNode.length)==0)
{
return;
}
else
{
for(i=0;i<ChildNode.length;i++)
{
var
cNode;
cNode=ChildNode[i];
cNode.setAttribute("Checked",Pchecked);
//cNode.Checked
Pchecked;
if(parseInt(cNode.getChildren().length)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
//設置子節點(diǎn)選中/取消;
//同時(shí)需要設置父節點(diǎn)的狀態(tài)(如果是取消選中的話(huà),僅僅設置本節點(diǎn)及其所有字接點(diǎn),不涉及父接點(diǎn))
function
setParent(node,Pc)
{
var
parentNode
node.getParent();
if(parentNode)
{
var
parentNodeFather
parentNode.getParent();
if(parentNodeFather)
{
setParent(parentNode,Pc);
}
if(Pc)
{parentNode.setAttribute("checked",Pc);}
else
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//檢查子接點(diǎn)是否有選擇的,如果有一個(gè)選擇了,那返回true
//只查第一級節點(diǎn).
function
checkBrother(parentNode,Pc,NodeData)
{
var
childNodes
new
Array();
childNodes
parentNode.getChildren();
if(childNodes.length
>0)
{
var
bChecked
true;
for(var
i=0;i<childNodes.length;i++)
{
if(childNodes[i].getAttribute("checked")
true
&&
childNodes[i].getAttribute("NodeData")
NodeData)
{
//alert(i+childNodes[i].getAttribute("Text"));
bChecked
false;
break;
}
}
if(bChecked)
{
parentNode.setAttribute("checked",Pc);
}
else
{
//所有父結點(diǎn)選擇
setParent(parentNode,!Pc)
}
}
else
{
parentNode.setAttribute("checked",Pc);
}
}
//獲取所有節點(diǎn)狀態(tài)
function
FindCheckedFromNode(node)
{
var
i
0;
var
nodes
new
Array();
nodes
node.getChildren();
for
(i
0;
i
<=
nodes.length
1;
i++)
{
if
(nodes[i].getAttribute("Checked"))
{
AddChecked(nodes[i]);
}
if
(parseInt(nodes[i].getChildren().length)
{
FindCheckedFromNode(nodes[i]);
}
}
}
//添加選中節點(diǎn)
function
AddChecked(node)
{
document.all.checked.value
node.getAttribute("NodeData")
}
//-->
這種方法有個(gè)很大的問(wèn)題,就是他客戶(hù)端設置的CheckBox在服務(wù)器端是不能獲取的,現在只能在Check的時(shí)候遍歷樹(shù),并把Checked的值放在一個(gè)文本里,然后提交到服務(wù)器,然后服務(wù)器來(lái)解析1@2@這種字符
現在我使用的是asp.net2.0,使用的是以下的方法
function
public_GetParentByTagName(element,
tagName)
{
var
parent
element.parentNode;
var
upperTagName
tagName.toUpperCase();
//如果這個(gè)元素還不是想要的tag就繼續上溯
while
(parent
&&
(parent.tagName.toUpperCase()
upperTagName))
{
parent
parent.parentNode
parent.parentNode
parent.parentElement;
}
return
parent;
}
//設置節點(diǎn)的父節點(diǎn)Cheched——該節點(diǎn)可訪(fǎng)問(wèn),則他的父節點(diǎn)也必能訪(fǎng)問(wèn)
function
setParentChecked(objNode)
{
var
objParentDiv
public_GetParentByTagName(objNode,"div");
if(objParentDiv==null
objParentDiv
"undefined")
{
return;
}
var
objID
objParentDiv.getAttribute("ID");
objID
objID.substring(0,objID.indexOf("Nodes"));
objID
objID+"CheckBox";
var
objParentCheckBox
document.getElementById(objID);
if(objParentCheckBox==null
objParentCheckBox
"undefined")
{
return;
}
if(objParentCheckBox.tagName!="INPUT"
&&
objParentCheckBox.type
"checkbox")
return;
objParentCheckBox.checked
true;
setParentChecked(objParentCheckBox);
}
//設置節點(diǎn)的子節點(diǎn)uncheched——該節點(diǎn)不可訪(fǎng)問(wèn),則他的子節點(diǎn)也不能訪(fǎng)問(wèn)
function
setChildUnChecked(divID)
{
var
objchild
divID.children;
var
count
objchild.length;
for(var
i=0;i<objchild.length;i++)
{
var
tempObj
objchild[i];
if(tempObj.tagName=="INPUT"
&&
tempObj.type
"checkbox")
{
tempObj.checked
false;
}
setChildUnChecked(tempObj);
}
}
//設置節點(diǎn)的子節點(diǎn)cheched——該節點(diǎn)可以訪(fǎng)問(wèn),則他的子節點(diǎn)也都能訪(fǎng)問(wèn)
function
setChildChecked(divID)
{
var
objchild
divID.children;
var
count
objchild.length;
for(var
i=0;i<objchild.length;i++)
{
var
tempObj
objchild[i];
if(tempObj.tagName=="INPUT"
&&
tempObj.type
"checkbox")
{
tempObj.checked
true;
}
setChildChecked(tempObj);
}
}
//觸發(fā)事件
function
CheckEvent()
{
var
objNode
event.srcElement;
if(objNode.tagName!="INPUT"
objNode.type!="checkbox")
return;
if(objNode.checked==true)
{
setParentChecked(objNode);
var
objID
objNode.getAttribute("ID");
var
objID
objID.substring(0,objID.indexOf("CheckBox"));
var
objParentDiv
document.getElementById(objID+"Nodes");
if(objParentDiv==null
objParentDiv
"undefined")
{
return;
}
setChildChecked(objParentDiv);
}
else
{
var
objID
objNode.getAttribute("ID");
var
objID
objID.substring(0,objID.indexOf("CheckBox"));
var
objParentDiv
document.getElementById(objID+"Nodes");
if(objParentDiv==null
objParentDiv
"undefined")
{
return;
}
setChildUnChecked(objParentDiv);
}
}這種方法最大的好處就是服務(wù)端能得javascript設置的Checked的值,不用沒(méi)點(diǎn)下就全部把樹(shù)遍利下,直接在服務(wù)端遍利一次就行了
//遍歷子節點(diǎn)
public
void
GetChildNode(TreeNode
Node)
{
foreach
(TreeNode
node
in
Node.ChildNodes)
{
if
(node.Checked)
{
StrChecked
node.Value+"@";
}
GetChildNode(node);
}
}
我照樣能得到它的Check的值
ASP.NET 2.0中XML數據的處理
SqlDataSource和ObjectDataSource控件都是平面表格式的數據源控件,操作也相對簡(jiǎn)單,在這里我就不細說(shuō)了.
在這里我主要談下用于連接X(jué)ML文件的XmlDataSource和用于連接站點(diǎn)導航數據的SiteMapDataSource這兩個(gè)層次數據源控件中XmlDataSource數據綁定到平面表格控件的一起東東.
XmlDataSource控件允許其它控件綁定到XML數據。XmlDataSource支持DataFile屬性,它被用于指定作為輸入(input)的XML數據文件的路徑。你還可以指定TranformFile屬性,給數據應用XSLT轉換;設置XPath屬性來(lái)指定需要暴露的數據源節點(diǎn)的子集。
<asp:XmlDataSource
ID="myXmlDataSource"
runat="server"
DataFile="~/temp.xml"
TransformFile="~transXml"
XPath="//User">
表格式數據綁定控件綁定到分層數據源也是可行的,但是它只能顯示第一層數據。在下面的demo中,Repeater控件綁定到
temp.xml文件。由于數據源暴露的頂層節點(diǎn)是<User/>節點(diǎn),Repeater可以在自己的ItemTemplate模板中使用Eval數據綁定語(yǔ)法綁定到這些節點(diǎn)的屬性。
<asp:Repeater
runat="server"
ID="myReater2"
DataSourceID="myXmlDataSource">
標題
姓名:<%#
Eval("Name")
%>
Email:<%#
Eval("Email")
%>
除了Eval數據綁定語(yǔ)法之外,ASP.NET
2.0還提供了基于XPath的數據綁定語(yǔ)法,在實(shí)現了IXPathNavigable接口的任何數據項上都可以使用它。這里介紹兩種常用的表達式類(lèi)型:
XPath(expression,
[formatString])
根據數據項計算Xpath表達式的值,返回單個(gè)值。
XPathSelect(expression,
[formatString])
根據數據項計算Xpath表達式的值,返回節點(diǎn)列表。
下面我們來(lái)看看使用Xpath數據綁定方法的優(yōu)勢,通過(guò)一個(gè)demo來(lái)說(shuō)明.
Repeater的ItemTemplate模板另外增加了一個(gè)Repeater,并把這個(gè)內部Repeater的屬性綁定到一個(gè)描述當前User節點(diǎn)的Reply子節點(diǎn)的XPathSelect表達式。在內部Repeater的ItemTemplate模板中,Xpath數據綁定表達式根據這些"Reply"內容節點(diǎn)來(lái)計算值。ASP.NET
2.0利用這種技術(shù),使你能夠通過(guò)組合表格式數據綁定控件簡(jiǎn)便地構造出豐富的、分層的數據顯示方式。
<asp:Repeater
runat="server"
ID="myRpeater"
DataSourceID="myXmlDataSource">
標題
ID:<%#
XPath("@ID")
%>
姓名:
Email:
Content:
<asp:Repeater
runat="server"
ID="childRepeater"
DataSource='<%#
XPathSelect("Reply")
%>'>
留言
ReplyID:<%#XPath("ID")
%>
Time:<%#
XPath("Time")
%>
Content:<%#
XPath("Content")
%>
使用ASP.NET 2.0中的ReportViewer控件
介紹
任何數據驅動(dòng)型的應用程序都有一個(gè)普遍的需求,那就是報表。
但是,在A(yíng)SP.NET
1.x中并沒(méi)有給我們提供這個(gè)非常重要的特性。
然而很幸運的是,伴隨著(zhù)。NET
2.0而來(lái)的ReportViewer控件可以滿(mǎn)足你對報表的一些基本需求。
我將會(huì )在本文中向你演示如何使用這個(gè)控件。
ReportViewer控件既可以在web程序中使用,也可以在windows程序中使用。
在這里,我將只介紹如何在web程序中使用它。
報表示例
我們假設要生成一個(gè)如下所示的顧客信息列表:
上面的報表是一個(gè)非常簡(jiǎn)單的以國家分組的顧客信息列表。
報表的數據是從Northwind數據庫的Customers表里獲取的。
默認情況下,它會(huì )顯示所有的顧客信息。
但是,你也可以讓它顯示屬于你指定的某個(gè)國家的顧客信息。
該報表是使用ReportViewer控件設計的,它可以從強類(lèi)型的DataSet中或者自定義的對象集合中獲取數據。
在實(shí)際的程序開(kāi)發(fā)中,我們往往會(huì )使用3層架構,數據的獲取經(jīng)常會(huì )是從業(yè)務(wù)層取得的DataSet或一個(gè)泛型集合。
在這里,我打算使用一個(gè)泛型集合作為數據源,而不是強類(lèi)型的DataSet.
創(chuàng )建類(lèi)庫
首先,打開(kāi)Visual
Studio,然后創(chuàng )建一個(gè)名為ReportViewerLib的類(lèi)庫項目。
添加一個(gè)如下所示的名為Customer的類(lèi):
using
System;using
System.Data;using
System.Configuration;using
System.Data.SqlClient;using
System.Collections.Generic;namespace
ReportViewerLib{
public
class
Customer
{
public
string
strCustomerID;
public
string
strCompanyName;
public
string
strContactName;
public
string
strCountry;
public
string
CustomerID
{
get
{
return
strCustomerID;
}
set
{
strCustomerID
value;
}
}
public
string
CompanyName
{
get
{
return
strCompanyName;
}
set
{
strCompanyName=
value;
}
}
public
string
ContactName
{
get
{
return
strContactName;
}
set
{
strContactName=
value;
}
}
public
string
Country
{
get
{
return
strCountry;
}
set
{
strCountry=
value;
}
}
public
static
List
GetCustomersForCountry(string
country)
{
SqlConnection
cnn=new
SqlConnection(
ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);
SqlCommand
cmd=new
SqlCommand();
cmd.Connection=cnn;
cmd.CommandText="select
CustomerID,CompanyName,ContactName,Countryfrom
customers
where
country=@country";
SqlParameter
p=new
SqlParameter("@country",country);
cmd.Parameters.Add(p);
cnn.Open();
SqlDataReader
reader
cmd.ExecuteReader();
List
list
new
List();
while
(reader.Read())
{
Customer
c
new
Customer();
c.CustomerID
reader.GetString(0);
c.CompanyName
reader.GetString(1);
c.ContactName
reader.GetString(2);
c.Country
reader.GetString(3);
list.Add(c);
}
cnn.Close();
return
list;
}
public
static
List
GetAllCustomers()
{
SqlConnection
cnn
new
SqlConnection(
ConfigurationManager.ConnectionStrings
["NorthwindConnectionString"].ConnectionString);
SqlCommand
cmd
new
SqlCommand();
cmd.Connection
cnn;
cmd.CommandText
"select
CustomerID,CompanyName,ContactName,Country
from
customers";
cnn.Open();
SqlDataReader
reader
cmd.ExecuteReader();
List
list
new
List();
while
(reader.Read())
{
Customer
c
new
Customer();
c.CustomerID
reader.GetString(0);
c.CompanyName
reader.GetString(1);
c.ContactName
reader.GetString(2);
c.Country
reader.GetString(3);
list.Add(c);
}
cnn.Close();
return
list;
}
}}
123456下一頁(yè)
GOvar
pager=new
iwmsPager(1,6,true);
[新品]指紋私密 CECT超薄手寫(xiě)S10低價(jià)到貨! 01-08 -
指紋手機,這一新興的手機功能在CECT
T100的強勢上市后被廣大機友所熟知并喜愛(ài)起來(lái),而借著(zhù)這順風(fēng)順水的人氣,CECT又推出了一款指紋安全手機S10,它可以輕松實(shí)現六大指紋安全功能:指紋加密、指紋隱形、指紋防盜、指紋鼠標、指紋撥號和指紋動(dòng)作。而CECT
S10的整體表現會(huì )不會(huì )如T100一樣帶給我們無(wú)限驚喜呢?請機友們跟隨汀汀的文字一起去解一下吧,說(shuō)不定你會(huì )在瞬間選中它!
作為熱賣(mài)機型CECT
T100的升級版本,CECT
S10在外形上略作修改,但更顯精練輕巧,商務(wù)氣息依然濃郁。而直板PDA手機風(fēng)格造型的S10三圍尺寸為113×54×11mm,做工精良,超薄的機身秀氣中不乏端莊。屏幕方面,CECT
S10擁有一塊26萬(wàn)色的TFT屏幕,分辨率為目前主流的320*240像素QVGA分辨率,采用觸摸式設計,支持手寫(xiě)、鍵盤(pán)雙輸入方式,并支持大字體撥號。
娛樂(lè )方面,CECT
S10具有實(shí)時(shí)流媒體播放,MP3和MP4播放器,錄音機、卡拉OK等功能,而內置的任天堂游戲模擬器,附送游戲高達2000個(gè)。在攝像頭方面,S10內置130萬(wàn)像素CMOS攝像頭,最大支持640*460分辨率的照片拍攝,支持數碼變焦、三種照片質(zhì)量等拍攝模式,并支持有聲視頻拍攝!此外,CECT
S10還能方便上網(wǎng)和收發(fā)電子郵件,內置資訊時(shí)空包括SMS、MMS、IVR、WAP四大類(lèi)約160個(gè)應用。同時(shí),S10還支持大容量T-FLASH擴展存儲卡,并可做U盤(pán)使用。
強大的指紋識別和保密功能是CECT
S10的突出特色,它通過(guò)指紋加密、指紋隱形、指紋防盜、指紋鼠標、指紋撥號和指紋動(dòng)作這些功能巧妙地把私密信息保護、通信信息隱藏、通信人身份隱藏與快捷操作方式相結合,使用起來(lái)不僅令人放心而且舒心,不會(huì )擔心因不慎導致的個(gè)人信息泄露。另外,S10的電話(huà)簿容量為1000個(gè),可以多種方式進(jìn)行索引,支持群組功能,短信息容量高達400條,足以保留足夠多的個(gè)人短息和商務(wù)短信。
縱觀(guān)CECT
S10的整體表現,它的主要賣(mài)點(diǎn)是集中在QVGA分辨率的26萬(wàn)色TFT屏幕、支持手寫(xiě)鍵盤(pán)雙輸入、娛樂(lè )游戲擴展功能以及最為可圈可點(diǎn)的指紋識別和保密功能。而以上的這些賣(mài)點(diǎn)再配以目前北斗手機網(wǎng)699元的售價(jià)就更是劃算至極了,喜歡的機友沒(méi)有理由不選它哦!
[新品]拍照新旗艦 500W索愛(ài)K858c盛情上市! 01-08 -
拍照手機的迅猛發(fā)展是時(shí)代大環(huán)境所需,同時(shí)也出乎了很多人的意料!如今200萬(wàn)像素已經(jīng)成為了新機上市的家常便飯,320萬(wàn)像素可以和主流手機貼貼邊,500萬(wàn)像素才是真正的大勢所趨!在看過(guò)了其它廠(chǎng)家的500W像素新機上市后,索尼愛(ài)立信Cyber-shot品牌下的拍照悍將K858c也終于閃亮登場(chǎng)了,歡迎已經(jīng)迫不急待想熟知它一切功能的機友和汀汀一起對K858c來(lái)個(gè)從頭至尾的了解,它的強大功能定會(huì )令你不由自主的傾心于它!
索愛(ài)K858c采用索愛(ài)最拿手的直板式造型設計,機身線(xiàn)條筆直硬朗,酷勁十足,尤其是采用黑色為主色調更增強了它的視覺(jué)沖擊力。在色彩搭配選擇上,除了經(jīng)典的黑色外,K858c的功能鍵、鏡頭部分和LOGO標簽都是采用銀色點(diǎn)綴,再配上眩目的綠色方向導航鍵和機身周邊裝飾條,非常惹眼。屏幕方面,K858c采用了一塊2.2英寸的26萬(wàn)色TFT顯示屏幕,分辨率達到了QVGA級別(240×320像素)。依照索尼愛(ài)立信公司的一貫作風(fēng),K858c的屏幕顯示非常優(yōu)秀,畫(huà)面細膩度和文字銳度表現得近乎完美。
索愛(ài)K858c的背面設計融入了相機血統,采用雙面卡片DC設計原則,所配備的500萬(wàn)像素鏡頭支持自動(dòng)對焦、氙氣閃光燈、16倍數碼變焦等豐富影像功能,完全采用Cyber-shot數碼相機的操作界面,影像菜單比以往更加直觀(guān),DC感更加強烈。另外,Best
Pic、Photo
fix等優(yōu)化軟件的運用也令照片趨于完美。
索愛(ài)K858c內置MP3播放器具備WALKMAN獨有的Mega
Bass音效,支持藍牙2.0,A2DP標準,配合高質(zhì)量藍牙立體聲耳機,效果震憾。此外,K858c除了擁有40MB機身內存外,還創(chuàng )造了一個(gè)行業(yè)第一,它不僅支持M2卡,同時(shí)還支持Micro
SD卡的擴展,而且兩個(gè)存儲卡的擴展都使用一個(gè)插槽,不同的只是插卡的方向。
這一場(chǎng)由索愛(ài)K858c所引爆的拍照風(fēng)潮正向我們襲來(lái),它的整體表現足以成為拍照手機領(lǐng)域里的新旗艦,并有能力與其它各大品牌的500萬(wàn)像素手機相抗衡!北斗手機網(wǎng)4280元的上市售價(jià)也算厚道,歡迎有實(shí)力嘗鮮的機友們先用為快,來(lái)體驗一下K858c所釋放出來(lái)無(wú)窮魅力!
【ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的方法有哪三種】相關(guān)文章:
javascript跨域訪(fǎng)問(wèn)的方法07-09
拉丁舞高低跨部有哪些訓練方法?06-03
納稅籌劃應具備哪三種意識08-03
鋼琴的三種彈奏方法06-17
JavaScript中的三種對象10-24
網(wǎng)球的三種握拍方法12-14
聲樂(lè )藝術(shù)中的三種唱法06-29
三種思科認證學(xué)習方法07-17
家庭常用三種保存茶葉的方法09-25