Saturday, March 17, 2012

Keep client's password security

Normally application client will keep users' password on the machine in a encryption way. If hackers are really try to decrypt it,  it will not last longer. So there is a solution to solve this kind of issues.

First of all, user's password should never keep on the local machine. Then how to let the application client remember user's password in order to communicate with server side? Different computer has different unique ID such like CPU ID, Hard driver  and network. We collect those unique ID and combine them together to get a very unique string, then we send those IDs and string to server to let server remember this client by the unique IDs and string. The string will be very different in different computers.

Then users choose let client to remember their password, we just let the application client send its' info to server and server remember them. Then next time when the client send the same info, server will assume it is the client login without password. Of course, the process of info collection should be made hard to be decrypted.  Or it would be easy for hackers simulate those IDs and string to pretend a legal client.

Since password will no longer be recorded on local machine, there is no need to worry about the security of it.

Tuesday, May 08, 2007

100部名著 每部名著浓缩一句



1.神要是公然去跟人作对,那是任何人都难以对付的。 (《荷马史诗》)
2.生存还是毁灭,这是一个值得思考的问题。 (《哈姆霄特》)
3.善良人在追求中纵然迷惘,却终将意识到有一条正途。(《浮士德》)
4.认识自己的无知是认识世界的最可靠的方法。 (《随笔集》)
5.你以为我贫穷、相貌平平就没有感情吗?我向你发誓,如果上帝赋予我财富和美貌,我会让你无法离开我,就像我现在无法离开你一样。虽然上帝没有这么做,可我们在精神上依然是平等的。(《简·爱》)
6.大人都学坏了,上帝正考验他们呢,你还没有受考验,你应当照着孩子的想法生活。 (《童年》)
7,你越没有心肝,就越高升得快,你毫不留情地打击人家,人家就怕你。只能把男男女女当作驿马,把它们骑得筋疲力尽,到了站上丢下来,这样你就能达到欲望的最高峰。 (《高老头》)
8.我只想证明一件事,就是,那时魔鬼引诱我,后来又告诉我,说我没有权利走那条路,因为我不过是个虱子,和所有其余的人一样。 (《罪与罚》)
9.你瞧,桑丘&S226;潘沙朋友,那边出现了三十多个大得出奇的巨人。 (《堂&S226;吉诃德》)
10.我并不愿意你受的苦比我受的还大,希斯克利夫。我只愿我们永远不分离:如果我有一句话使你今后难过,想想我在地下也感到一样的难过,看在我自己的份上,饶恕我吧! (《呼啸山庄》)
11.幸福的家庭是相同的,不幸的家庭各有各的不同。 (《安娜&S226;卡列尼娜》)
12.唉,奴隶般的意大利,你哀痛之逆旅,你这暴风雨中没有舵手的孤舟,你不再是各省的主妇,而是*院! (《神曲》)
13.将感情埋藏得太深有时是件坏事。如果一个女人掩饰了对自己所爱的男子的感情,她也许就失去了得到他的机会。 (《傲慢与偏见》)
14.钟声又鸣响了……一声又一声,静谧而安详,即使在女人做新娘的那个好月份里,钟声里也总带有秋天的味道。 (《喧嚣与骚动》)
15.一个人并不是生来要被打败的,你尽可以把他消灭掉,可就是打不败他。 (《老人与海》)
16.当然,行是行的,这固然很好,可是千万别闹出什么乱子来啊。 (《套中人》)
17.面包!面包!我们要面包! (《萌芽》)
18.我从没有爱过这世界,它对我也一样。 (《拜伦诗选》)
19.爱情应该给人一种自由感,而不是囚禁感。 (《儿子与情人》)
20.暴风雨将要在那一天,甚至把一些槲树吹倒,一些教堂的高塔要倒塌,一些宫殿也将要动摇! (《海涅诗选》)
21.自己的行为最惹人耻笑的人,却永远是最先去说别人坏话的人。 (《伪君子》)
22.这时一种精神上的感慨油然而生,认为人生是由啜泣、抽噎和微笑组成的,而抽噎占了其中绝大部分。(《欧&S226;亨利短篇小说选》)
23.历史喜爱英勇豪迈的事迹,同时也谴责这种事迹所造成的后果。 (《神秘岛》)
24. 整个下半天,人都听凭羊脂球去思索。不过本来一直称呼她作“夫人”,现在却简单地称呼她作“小姐”了,谁也不很知道这是为着什么,仿佛她从前在评价当中爬 到了某种地位,现在呢,人都想把她从那种地位拉下一级似的,使她明白自己的地位是尚叩摹?(《莫泊桑短篇小说选》)

25.如果冬天来了,春天还会远吗? (《雪莱诗选》)
26.我明白了,我已经找到了存在的答案,我恶心的答案,我整个生命的答案。其实,我所理解的一切事物都可以归结为荒诞这个根本的东西。(《恶心》)
27.世界上有这样一些幸福的人,他们把自己的痛苦化作他人的幸福,他们挥泪埋葬了自己在尘世间的希望,它却变成了种子,长出鲜花和香膏,为孤苦伶仃的苦命人医治创伤。(《汤姆叔叔的小屋》)
28.当格里高&S226;萨姆莎从烦躁不安的梦中醒来时,发现他在床上变成了一个巨大的跳蚤。(《变形记》)
29.当现实折过来严丝合缝地贴在我们长期的梦想上时,它盖住了梦想,与它混为一体,如同两个同样的图形重叠起来合而为一一样。(《追忆似水年华》)
30.人与人之间,最可痛心的事莫过于在你认为理应获得善意和友谊的地方,却遭受了烦扰和损害。(《巨人传》)
31.现在我说的您要特别注意听:在别人心中存在的人,就是这个人的灵魂。这才是您本身,才是您的意识在一生当中赖以呼吸、营养以至陶醉的东西,这也就是您的灵魂、您的不朽和存在于别人身上的您的生命。(《日瓦戈医生》)
32.美德犹如名香,经燃烧或压榨而其香愈烈,盖幸运最能显露恶德而厄运最能显露美德。(《培根论说文集》)
33.亲爱的艾妮斯,我出国,为了爱你,我留在国外,为了爱你,我回国,也是为了爱你!(《大卫&S226;科波菲尔》)
34.强迫经常使热恋的人更加铁心,而从来不能叫他们回心转意。(《阴谋与爱情》)
35.在各种事物的常理中,爱情是无法改变和阻挡的,因为就本性而言,爱只会自行消亡,任何计谋都难以使它逆转。(《十日谈》)
36.只要你是天鹅蛋,就是生在养鸡场里也没有什么关系。(《安徒生童话》)
37.就投机钻营来说,世故的价值永远是无可比拟的。(《死魂灵》)
38. 谁都可能出个错儿,你在一件事情上越琢磨得多就越容易出错。(《好兵帅克历险记》)
39.我们经历着生活中突然降临的一切,毫无防备,就像演员进入初排。如果生活中的第一次彩排便是生活本身,那生活有什么价值呢?(《生命中不能承受之轻》)
40.他发现了人类行为的一大法则,自己还不知道——那就是,为了要使一个大人或小孩极想干某样事情,只需要设法把那件事情弄得不易到手就行了。(《汤姆&S226;索亚历险记》)
41.对有信仰的人,死是永生之门。(《失乐园》)
42.有一个传说,说的是有那么一只鸟儿,它一生只唱一次,那歌声比世上所有一切生灵的歌声都更加优美动听。(《荆棘鸟》)
43.离开一辈子后,他又回到了自己出生的那片土地上。从小到大,他一直是那个地方的目击者。(《尤利西斯》)
44.同上帝保持联系是一码事,他们都赞同这一点,但让上帝一天二十四小时都待在身边就是另一码事了。(《第二十二条军规》)
45.在甜蜜的梦乡里,人人都是平等的,但是当太阳升起,生存的斗争重新开始时,人与人之间又是多么的不平等。(《总统先生》)
46.开发人类智力的矿藏是少不了要由患难来促成的。(《基度山伯爵》)
47.离你越近的地方,路途越远;最简单的音调,需要最艰苦的练习。(《泰戈尔诗选》)
48.悲伤使人格外敏锐。(《约翰&S226;克里斯朵夫》
49.我在女人跟前经常失败,就是由于我太爱她们了。(《忏悔录》)
50.她睁大一双绝望的眼睛,观看她生活的寂寞。她像沉了船的水手一样,在雾蒙蒙的天边,遥遥寻找白帆的踪影。(《包法利夫人》)

51.我听见美洲在歌唱,我听见各种不同的颂歌。(《草叶集》)
52.倘若你能使你的心时常赞叹日常生活的神妙,你的苦痛的神妙必不减少于你的欢乐,你要承受你心天的季候,如同你常常承受从田野上度过的四时。(《先知》)
53.现在我住在波勒兹别墅,这里找不到一点儿灰尘,也没有一件东西摆得不是地方,除了我们,这里再没有别人,我们死了。(《北回归线》)
54.艳阳高升,原野上的朝露很快便了无痕迹。源氏痛感人生如梦,像朝露一般,愈加万念俱灰。(《源氏物语》)
55.那些普普通通而毫无特色的罪行才真正令人迷惑,就像—个相貌平凡的人最难以让人辨认—样。(《福尔摩斯探案集》)
56.你有一处建在房子里面的小池塘吗?在那个小池塘里,你可以随时观察水中生物生活的每一个片断。(《昆虫记》)
57.不要向井里吐痰,也许你还会来喝井里的水。(《静静的顿河》)
58.我看到了各个民族彼此敌视,而且默默地,无知地、愚蠢地、甘心地、无辜地在互相残杀。我看到了世界上最聪明的头脑还在发明武器和撰写文章,使这种种敌视和残杀更为巧妙,更为经久。(《西线无战事》)
59.这张脸同早晨雪天映在镜子中的那张脸一样,红扑扑的。在岛村看来,这又是介于梦幻同现实之间的另一种颜色。(《雪国》)
60.一个人只要有意志力,就能超越他的环境。(《马丁&S226;伊登》)
61.站在痛苦之外规劝受苦的人,是件很容易的事。(《被缚的普罗米修斯》)
62.感情有理智根本无法理解的理由。(《月亮和六便士》)
63.世界上一切好东西对于我们,除了加以使用外,实在没有别的好处。 (《鲁滨逊漂流记》)
64.每当太阳西沉,我坐在河边破旧的码头上,遥望新泽西上方辽阔的天空,我感到似乎有未经开垦的土地,所有的道路,所有的人都在不可思议地走向西部海岸。直到现在我才知道,在衣阿华,小伙子们总是不停地骚动喧闹,因为是那片土地使他们如此无法平静。(《在路上》)
65.在与法律之前,合乎“自然的”只有狮子的力量,或者动物饥寒时的需要,更简单地用一个字表示,便是“欲”。(《红与黑》)
66.上天让我们习惯各种事物,就是用它来代替幸福。(《叶甫盖尼&S226;奥涅金》)
67.一个人哪怕只生活过一天,也可以毫无困难地在监狱里过上一百年。(《局外人》)
68.往上爬吧,多捞钱吧,进入上层社会,那里准备好了一切。(《美国的悲剧》)
69.念书不能增添智慧。(《痛症楼》)
70.不管我活着,还是我死去,我都是一只牛虻,快乐地飞来飞去。 (《牛虻》)
71.一个人把他整个的一生都押在“女人的爱”那一张牌上头赌博,那张牌输了,他就那样地灰心丧气,弄得自己什么事都不能做,这种人不算一个男人,不过是一个雄性生物。(《父与于》)
72.这个家庭的历史是一架周而复始无法停息的机器,是一个转动着的*子,这只齿*,要不是轴会逐渐不可避免地磨损的话,会永远旋转下去。(《百年孤独》)
73.现在我只信,首先我是一个人,跟你一样的一个——至少我要学做一个人。(《玩偶之家》)
74.天才和我们相距仅仅一步。同时代者往往不理解这一步就是千里,后代又盲目相信这千里就是一步。同时代为此而杀了天才,后代又为此而在天才面前焚香。(《侏儒的话》)
75.遭受苦难的人在承受痛楚时并不能觉察到其剧烈的程度,反倒是过后延绵的折磨最能使其撕心裂肺。 (《红字》)
76. 人最宝贵的是生命,生命属于人只有一次。人的一生应当这样度过:当他回首往事时,不会因虚度年华而悔恨,也不会因碌碌无为而羞耻。这样,临终前他就可以自 豪地说:“我已经把自己整个生命和全部精力都献给了世界上最壮丽的事业——为人类的解放而奋斗。”(《钢铁是怎样炼成的》)
77.凡是有甜美的鸟歌唱的地方,也都有毒蛇嘶嘶地叫。(《德伯家的苔丝》)
78.凡是想依正路达到这深密境界的人应从幼年起,就倾心向往美的形体。(《文艺对话录》)
79.友谊就是一切。友谊比才能更重要,比政府更重要,它和家庭几乎是可划等号的。千万别忘记这一点。({教父》)
80.已经活了七十二岁,依然像是昨天的事:居民点的林阴小路,在歇晌的时间,白人居住区,道旁开满金风花的大街,阗无行人。(《物质生活》)
81.我明天回塔拉再去想吧。巳那时我就经受得住一切了。明天,我会想出一个办法把他弄回来。毕竟,明天又是另外的一天呢。(《飘》)
82.盲目可以增加你的勇气,因为你无法看到危险.(《格列佛游记》)
83.本人系疗养与护理院的居住者。我的护理员在观察我,他几乎每时每刻都监视着我:因为门上有个窥视孔,我的护理员的眼睛是那种棕色的,它不可能看透蓝眼睛的我。(《铁皮鼓》)
84.每当我追溯自己的青春年华时,那些日子就像是暴风雪之晨的白色雪花一样,被疾风吹得离我而去。(《洛莉塔》)
85.宽宏大量,是惟一能够照亮伟大灵魂的光芒。(《巴黎圣母院》)
86.很多年以前,那时我的钱包瘪瘪的,陆地上看来没什么好混的了,干脆下海吧,去在我们这个世界上占绝对面积的大海里逛逛吧! (《白鲸》)
87.我一贯追求的是:在人的肉体与幻想允许的范围内,获得最大限度的真诚和信任,以及对所有的一切尽可能长久的保证。(《镜中微瑕》)
88.这里有一种无处投诉的罪行。这里有一种眼泪不足以象征的悲哀。这里有一种绝大的失败,足以使我们的一切成功都垮台。(《愤怒的葡萄》)
89.起来,饥寒交迫的奴隶!起来,全世界受苦的人! (《国际歌》)
90.我是说孩子们都在狂奔,也不知道自己是在往哪儿跑,我得从什么地方出来,把他们捉住。我整天就干这样的事。我只想当个麦田的守望者。我知道这有点异想天开,可我真正喜欢干的就是这个。(《麦田的守望者》)
91.获取一颗没有被人进攻的经验的心,也就像夺取一座没有守卫的城池一样。(《茶花女》)
92.他不知道那个梦已经丢在他背后了,丢在这个城市那边那一片无垠的混沌之中不知什么地方了,那里合众国的黑黝黝的田野在夜色中向前伸展。(《了不起的盖茨比》)
93.四月最残忍,从死了的土地滋生丁香,混杂着回忆和欲望,让春雨挑动着呆钝的根。(《荒原》)
94.世间的一切虚伪,正像过眼云烟,只有真理才是处世接物的根据。虚伪的黑暗,必为真理的光辉所消灭。(《一千零一夜》)
95.下面玩什么花样呢?(《发条橙》)
96.昨晚,我梦见自己又回到了曼陀丽庄园。(《蝴蝶梦》)
97. 我不能想像这样一个人,他认为开棋的时候先走马而不是先走卒对他来说是英勇的壮举,而在象棋指南的某个犄角里占上一席可怜的位置就意味着声名不朽,我不能 想像,一个聪明人竟然能够在10年、20年、30年、40年之中一而再、再而三地把他全部的思维能力都献给一种荒诞的事情——想尽一切办法把木头棋子王赶 到木板棋盘的角落里,而自己却没有发狂成为疯子。(《象棋的故事》)
98.咱家是猫。名字嘛……还没有。(《我是猫》)
99.起英勇的胸脯前进!
看,无数的旗帜满天飞舞I
谁在那里向右转?
向左!
向左!
向左! (《马雅可夫斯基诗选》)
100.水里照出的是自己的脸,内心反映的是自己的为人。(《圣经·旧约》)

Tuesday, January 09, 2007

译序:此文章是今天在http://www.asp.net首页发现的,详细内容地址是http://www.dotnetbips.com/articles/displayarticle.aspx?id=511,作者Bipin Joshi。题目为Working with GridView without using Data Source Controls

本文是根据原文的意思加自己的理解来翻译的,这段时间自己翻译过几篇其它的文章,发现对于有些地方的翻译真的就不能按照英文的愿意来,这也可能是文化差异的不同,所以我每篇翻译都强调是“按照自己的理解”来翻译,而且,是在保留作者原文的意思的基础之上。

介绍:

大多数的文章和演练都是介绍如何用DataSource控件来配合GridView来工作的。当一个GridView被指定到一个DataSource控件的时,系统就会自动完成其分页和排序的功能,而我们基本上是不用写一行代码的。然而,我们也会碰到直接把DataViewDataTable作为GridView绑定的对象的时候。幸运的是,GridView是可以用DataSource控件以外的方法来绑定数据的。但是需要开发人员敲额外的一些代码,而你对ASP.NET1.XDataGrid很熟悉的话,就会发现其过程是很象的。本文我们将来完成直接用DataView(或者DataTable)绑定到GridView如何操作的,并且在此基础上实现分页和编辑等功能。

示例:雇员列表

我们用Northwind数据库的Employees表来做这个示例。在VS2005里新建一个站点,然后创建一个webform,拖拽一个GridView控件到此页面上。用下图的方法为GridView填加三个BoundFields和一个CommandField

按照如下的表来设置各BoundField的属性

BoundField

HeaderText

DataField

ReadOnly

Employee ID

Employee ID

EmployeeID

true

First Name

First Name

FirstName

false

Last Name

Last Name

LastName

false

进入到codebehind页(也可能是code file),填加如下的代码到Page_Load事件:

protected void Page_Load(object sender, EventArgs e)

{

if(!IsPostBack)

{

BindGrid();

}


}

然后,我们让页面在第一次显示的时候调用BindGrid()方法。这个方法是我们自定义的方法,后面我们将介绍它的具体实现。这个方法实际上是让一个DataView绑定到一个GridView上。而这个DataView里面是Employees表里的所有记录。

实现分页:

首先需要把GridViewAllowPaging属性设置为True,这样我们才可以实现分页的功能。然后我们把PageSize属性设置成3。这里有两个和分页有关的方法,它们分贝是:

·PageIndexChanging

·PageIndexChanged

第一个方法是在当前页的这个属性改变的时候被触发的,第二个方法是这个属性已经被更改以后触发的。而前一个方法你是可以在分页的时候终止这个(分页)操作的。

GridViewPageIndexChanging事件里我们写如下的代码:

protected void GridView1_PageIndexChanging

(
object sender, GridViewPageEventArgs e)

{

GridView1.PageIndex
= e.NewPageIndex;

BindGrid();

}

PageIndexChanging事件句柄里接收一个GridViewPageEventArgs类型的参数。这个参数通过一个叫做NewPageIndex的属性来获得用户选择的新页的页码。我们再次调用BindGrid()方法把GridViewPageIndex的属性设置成新页码。GridView就会把相应的内容显示出来。下面的截图是GridView实现分页以后的效果

实现排序:

实现排序的方法相对来说就要多做一些工作。首先,需要把GridViewAllowSorting属性设置成True,然后,我们要给需要进行排列的BoundField列上设置SortExpression属性.当你给相应的列设置好这个属性以后你就会发现这个列的头边成了一个可点击的Link button.单击它会触发如下的两个事件:

·Sorting

·Sorted

和分页方法一样这两个方法是有前后区别的。而Sorting事件也同样允许你取消这个(排序)动作。

排序事件的句柄接收一个GridViewSortEventArgs类型的参数。GridViewSortEventArgs类有三个重要的属性。SortExpression属性提供先前你指定的排序表达式。SortDirection属性描述是采用升序排序还是降序排序。着儿歌属性在你用自己创建的列表里排序是没什么用的,但是,当你用DataSource控件来为GridView做数据源的话它会为你自动指定排序的方法并且你可以通过通过这个属性利用getset的方法指定排序的方向。

既然我们不是用DataSource控件来作为数据源那么我们需要自己来写排序的事件。我们用如下的方法来存储一个ViewState变量,填加如下代码到Sorting事件中。

protected void GridView1_Sorting(object sender,

GridViewSortEventArgs e)

{

ViewState[
"sortexpression"] = e.SortExpression;



if (ViewState["sortdirection"] == null)

{

ViewState[
"sortdirection"] = "asc";

}


else

{

if (ViewState["sortdirection"].ToString() == "asc")

{

ViewState[
"sortdirection"] = "desc";

}


else

{

ViewState[
"sortdirection"] = "asc";

}


}


BindGrid();

}


这里我们用一个sortexpressionViewState变量来存储SortExpression属性。我们需要在BindGrid()方法里使用这个变量来让排序在所有情况下都能正确进行。同样我们也用一个叫做sortdirectionViewState变量来存储当前的排序方式。最后,我们调用DataBind()方法来把DataView里排序后的数据绑定给此数据网格。

下图是实现排序以后的效果

实现编辑功能:

为了能在GridView里编辑记录我们加入了一个CommandFieldsGridView里,默认情况下你会看到它是一个title属性为editlink button.当我们单击它以后触发RowEditing事件并且编辑按钮变成了“更新”和“取消”按钮。单击“更新”按钮会出发RowUpdating事件,单击“取消”按钮会触发RowCancelingEdit事件。我们需要写入自己在RowUpdating事件里写自己的更新代码。

填加如下的代码到RowEditing事件当中:

protected void GridView1_RowEditing

(
object sender, GridViewEditEventArgs e)

{

GridView1.EditIndex
= e.NewEditIndex;

BindGrid();

}

RowEditing事件接收一个GridViewEditEventArgs类型的变量。类GridViewEditEventArgs有一个属性叫做NewEditIndex来告诉我们用户单击的那一行的行号。然后根据这个值我们设置到GridViewEditIndex的值。这会使GridView进入到编辑模式,如下图:

注意EmployeeID这一列是不能被编辑的因为这个列已经被标志成ReadOnly.

然后我们填加如下代码到RowCancelingEdit事件当中。

protected void GridView1_RowCancelingEdit

(
object sender, GridViewCancelEditEventArgs e)

{

GridView1.EditIndex
= -1;

BindGrid();

}

这里我们把EditIndex的值设置成-1告诉系统我们现在要取消编辑操作。

最后,我们来看看RowUpdating事件的代码:

protected void GridView1_RowUpdating

(
object sender, GridViewUpdateEventArgs e)

{

int empid;

string fname, lname;

empid
= int.Parse(GridView1.Rows[e.RowIndex].

Cells[
0].Text);

fname
= ((TextBox)GridView1.Rows[e.RowIndex].

Cells[
1].Controls[0]).Text;

lname
= ((TextBox)GridView1.Rows[e.RowIndex].

Cells[
2].Controls[0]).Text;



SqlConnection cnn
= new SqlConnection(@"data source=

.\sqlexpress;initial catalog=northwind;integrated

security=true
");

cnn.Open();

SqlCommand cmd
= new SqlCommand("update employees set

firstname
=@fname,lastname=@lname where employeeid=@empid",

cnn);

cmd.Parameters.Add(
new SqlParameter("@fname",fname));

cmd.Parameters.Add(
new SqlParameter("@lname", lname));

cmd.Parameters.Add(
new SqlParameter("@empid", empid));

cmd.ExecuteNonQuery();

cnn.Close();



GridView1.EditIndex
= -1;

BindGrid();

}


这里我们先得到在TextBox里我们输入的值。RowUpdating方法接收一个GridViewUpdateEventArgs类型的变量,GridViewUpdateEventArgs类有一个叫做RowIndex的属性告诉系统哪一行正在被更新。系统用GridViewRows集合来获得新输入的值。注意系统是怎么利用CellsControls集合的。Cells集合包含了所有正在被编辑的这些列的对象。Controls集合存储所把所有的空间都存储成Control类型。因此系统需要把这些控件变成TextBox类型的对象。然后我们再用connection,command等数据库对象执行一个UPDATE操作。当更新操作完成后,系统会把GridViewEditIndex属性设置成-1来完成更新操作。

BindGrid()方法:

前面我们提到过的这个方法,其代码如下:

private void BindGrid()

{

DataSet ds
= new DataSet();

SqlDataAdapter da
= new SqlDataAdapter

(
"select * from employees", @"data source=

.\sqlexpress;initial catalog=northwind;

integrated security=true
");

da.Fill(ds,
"employees");

DataView dv
= ds.Tables[0].DefaultView;



if (ViewState["sortexpression"] != null)

{

dv.Sort
= ViewState["sortexpression"].ToString()

+ " " + ViewState["sortdirection"].ToString();

}




GridView1.DataSource
=dv;

GridView1.DataBind();

}


通过这个方法,我们把Employees表里的数据填充到一个DataSet里。然后基于employees表创建一个DataView,再根据Sort属性来对其排序。每一列需要排序的属性都从ViewState变量里获得sortexpression属性。而当排序正在进行的时候也同样是用到了这个变量,还记得我们在Sorting事件里设置的那两个属性吗?就是它们。最后,我们把GridViewDataSource属性在DataBind()方法里设置成这个DataView

总结

GridView是可以不用DataSource控件直接绑定到DataViewDataTable上的。我们同样可以实现分页,排序和编辑的功能。只不过,我们需要自己写相应的代码而已。