| Yang's profile冶心小筑の静心居PhotosBlogLists | Help |
|
3/5/2006 Microsoft's Ideas在过去的一年,Google可谓是大出风头,随着Gmail的横空出世,搜索龙头的创意一个接着一个,如雨后春笋般。乘着这股势头,Google公司和它的两位老板的身价也是水涨船高,两位天才转眼间成了世界第二富有的人,Google也直接向Microsoft叫板,大有初生牛犊不怕虎的味道。事实上Google也的确取得了很好的成绩。2005Microsoft几乎没有任何方面可以盖过Google的。
不过,所谓风水轮流转,踏入2006后,Google的创意似乎用完了,而Microsoft却睡醒了,Visual Studio 2005, Sql Server 2005, .Net Framework 2.0三者配合,形成旗舰级产品重拳出击,使Microsoft又一次成了世界目光的焦点。网络方面,Windows Live计划全面启动,Windows Live Mail, Windows Live Message,还有那个虽然华而不实,但的确美丽无双且在不断完善的Blog终结者——Wallop,让整个Internet世界变得更加丰富多彩。还有那即将面世的"下一代"操作系统Vista……微软再次成功的翻身。
另外,这几天又了解到几条"不确切"消息,其一是微软神秘的Origami项目,据说是种"笔记本"似的平板电脑,注意,这里的"笔记本"并非通常意义上的笔记本电脑,而是指的这中平板电脑的大小形状,人们可以像拿书一样拿在手里,彻底享受Wireless anywhere的乐趣……其二是微软已经开发出了比Google更好的搜索引擎,并且将把该引擎嵌入下一代操作系统也就是Vista。如果是真的,那Google可能就真的要头痛了,Netscape的阴霾至今仍未散去的啊……
再另外,就是今晚的收获了,原来微软也有对付Google的Google Earth的东东,叫作Virtual Earth,目前也是beta阶段,这是截图,图中的小车可以用方向键控制,路景会真实变换,实在太酷了!
各位可以自己去玩玩,网址是http://preview.local.live.com/,enjoy urself
静能生慧 勤可补拙 言笑用计 行略代谋 Weekend Nightmare黑暗吞噬四周,孤寂填满心底,想找首歌来听,却随机放出了"longly"……
昨天还感谢宫唐来着,却忘记了周末是有两天的……
今天白天倒是阳光明媚,春意昂然的,但是今天似乎并非是个好日子。朋友遇到了大麻烦,要我陪他聊天解愁,倒无意中便宜了我,呵呵。虽然现在已经3:00,但总好过我一个人躺在床上被黑暗淹没来的好。要谢谢他啊~~
ps:才发现"lonely"这歌好长,真的好长……
静能生慧 勤可补拙 言笑用计 行略代谋 3/4/2006 感谢可爱的宫唐自从潘大锤子和戴小哈包继发哥之后就住校外,寝室就只剩下我,阿三和宫唐三人了。到了星期五,阿三例行回家,宫唐也被call了出去,结果就剩我孤家寡人一个,好不凄惨,对孤独的体会那叫一个深刻……不过好在可爱的宫唐,居然连续两周放弃梦幻的假期,留宿寝室,实在令我感激涕零。就冲他这行为,那怕他说的是“因为外面都住满了”,我也要把最美好的祝福送给他哈
静能生慧 勤可补拙 言笑用计 行略代谋 3/3/2006 How Much Is My Blog Worth? 今天逛博客堂的时候,在上面发现一个很有意思的网站,这个网站可以评估你的blog的价值。我当然就去试了一下啦,至于结果嘛...嘿嘿,自己看啦~~
网站的网址是http://www.business-opportunities.biz/projects/how-much-is-your-blog-worth/,大家可以去看看How Much Is Your Blog Worth 静能生慧 勤可补拙 言笑用计 行略代谋 3/2/2006 梦想 今天在朋友blog上看到一篇《最初的梦想》,忽然发现自己也到了回想“最初的梦想”的年龄,于是一阵唏嘘感叹,跟着一阵捶胸顿足,后悔自己不该好耍懒惰,耽误了大好年华,然后开始daydreaming,幻想自己如果不怎么怎么样,就会怎么怎么样……
好不容易把思绪拉了回来,却发现自己似乎没有所谓的“最初的梦想”,又似乎自己有太多的“最初的梦想”。说没有,是因为自己真的没有好好想过以后具体要做个什么样的人,只有很宏观或者说宏大的描画,比如要做一番事业,挣多少多少钱等等;说太多,是因为自己曾胡乱的下过很多决心,许过很多愿望,但大多都是那样的不切实际,所以我爸常笑讽我“高人立志长,小人常立志”。到如今,虚度人生二十又一,仍是一事无成,一个梦想都没有变为现实,何其哀哉! 不过还好,犯的错多了,受的教训也就多了,于是现在开始醒悟,开始明白,人不能永远活在自己的梦里,该为自己找条路了。所以拿起了厚重的《红宝书》,开始一个一个的啃单词,虽然很苦,但是至少人很清醒,不在像以前那样浑浑噩噩的过日子,这样很好,真的很好。 ps:本人决定重新启动MSN,q-zone,并保持与自己服务器上的blog同步更新。因为准备英语考试的缘故,以后很少上网,上网只查资料和更新blog而已。 又ps:ICP终于睡醒了,终于把证书发给我了,hooray! 静能生慧 勤可补拙 言笑用计 行略代谋
11/17/2005 DataGrid的分页问题 DataGrid本身带的排序功能实用而且方便,相信很多想我这样的“懒”程序员(严格的说,我还不算个程序员^^)还是非常喜欢使用的。但是这个分页机制不能不说是有点问题,不知道是MS不小心犯的错误,还是故意把这个问题留给程序员自己解决,反正在删除一页的最后一条记录的时候会出错,提示"CurrentPageIndex必须大于等于0而小于PageCount"。
注意:产生这个错误的前提是,你是产生一个PostBack实现删除数据库里某条记录,在服务器反应处理后回送的页面并没有重新生成这个DataGrid,而仅仅重新填充了这个DataGrid的数据源。 由于在DataGrid.DataBind()中,会重新计算PageCount,但是不会重新设置CurrentPageIndex,所以重新计算后的PageCount为原PageCount-1,而CurrentPageIndex没变,从而导致CurrentPageIndex==PageCount而出错。为了避免这个错误,我写了如下代码: private void grdMyGrid_DeleteCommand(object source, DataGridCommandEventArgs e)
{
////////////
//the code for deleting
////////////
//refill the ds
sqlDa.Fill(dsSource);
//check the pageindex to avoid the mistake
if (e.Item.ItemIndex % grdMyGrid.PageSize == 0)
{
if (grdMyGrid.CurrentPageIndex > 0) //avoid the pageindex being 0
grdMyGrid.CurrentPageIndex = grdMyGrid.CurrentPageIndex - 1;
}
//rebind the grd
grdMyGrid.DataBind();
}
代码解释:红色部分是关键,我在调试的时候发现DataGrid里的每一行(即一个DataGridItem)有一个属性ItemIndex,如果你的PageSize是3(即一页有3行),则这三行的索引是0,1,2,下一页三行的索引还是0,1,2,下一页亦然,要避免这个错误,其实只需要判断当前删除的行是不是当前页的最后一行,如果是,则把CurrentPageIndex减1就可以了。有了ItemIndex属性,这个判断就很容易了,如红色代码部分第一行所示,一个取余操作就可以了^^另外,还有一个DataSetIndex属性,记录的是当前行在dataset(即数据源)里的索引,它是按0,1,2……递增的,和ItemIndex是等价的,不过我觉得用ItemIndex还是直观点^^
静能生慧 勤可补拙 言笑用计 行略代谋 11/14/2005 ASP.NET之DataGrid控件的一些使用心得 ASP.NET中的DataGrid控件是一个功能极其强大的控件,它能把数据源的数据以电子表格的形式直观的展现给用户。这个数据源可以是你能想到的一切能作为数据源的数据结构,比如数据库里的表,数据集DataSet,表DataTable抑或是DataView乃至数组。DataGrid能显示页眉,脚注,实现分页,自动创建页导航条,这一切都只需要设置几个属性而已。它还可以让用户直接在其上对数据进行编辑更新和删除。当然你可以不屑的说“其分页效率不高甚至太低”——实际上它的效率的确不高,但能满足大部分应用——那么你完全可以在其上实现自定义的分页算法,只需要把DataGrid的AllowPaging属性设为‘false’,AllowCustomPaging设为‘true’,然后你就可以想怎么分页就怎么分页,当然前提是你写得出比微软更好的代码^^。实际上,如果你更仔细的研究一下DataGrid,你会惊喜的发现,它的所有“部件”几乎都能自定义!下面是我的一点应用心得。
DataGrid有一个非常有用的事件叫ItemCreated,它在DataGrid中创建行的时候被触发,在其中我们可以实现几个很有意义的功能,比如给‘删除’按钮加“保险”(即‘确认’对话框),给页导航条添加功能等等,下面是实现的代码:
private void grdMyGrid_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{ //给删除按钮加个js确认对话框,MS的官方做法
if ((e.Item.ItemType != ListItemType.Header) && (e.Item.ItemType != ListItemType.Footer) && (e.Item.ItemType != ListItemType.Pager)) { Button deleteBtn = (Button)e.Item.Cells[0].Controls[0]; long index = long.Parse(e.Item.ItemIndex.ToString()) + 1; string msg = "确定要删除第"+index.ToString() +"条记录吗?"; deleteBtn.Attributes.Add("onclick","return confirm('"+msg+"');"); } //这一段设置编辑模式下各列文本框的长度,让表不至太变形
if (e.Item.ItemType == ListItemType.EditItem) { TextBox tb = (TextBox)e.Item.Cells[2].Controls[0]; tb.Width = Unit.Pixel(66); tb = (TextBox)e.Item.Cells[3].Controls[0]; tb.Width = Unit.Pixel(86); tb = (TextBox)e.Item.Cells[4].Controls[0]; tb.Width = Unit.Pixel(396); tb = (TextBox)e.Item.Cells[5].Controls[0]; tb.Width = Unit.Pixel(66); } //这一段给页导航条添加'首页','末页','页码'功能
if (e.Item.ItemType == ListItemType.Pager) { //get the handle of the pagerbar TableRow pagerBar = e.Item as TableRow; //add the linkbutton for going to firstpage LinkButton firstPage = new LinkButton(); firstPage.Text = "<<首页 "; firstPage.ToolTip = "到第一页"; firstPage.ForeColor = Color.FromArgb(173, 173, 173); //add the click event firstPage.Click += new EventHandler(firstPage_Click); pagerBar.Cells[0].Controls.AddAt(0, firstPage); pagerBar.Cells[0].Controls.AddAt(1, new LiteralControl(" ")); //add the linkbutton for going to endpage
LinkButton endPage = new LinkButton(); endPage.Text = " 末页>>"; endPage.ToolTip = "到最后一页"; endPage.ForeColor = Color.FromArgb(173, 173, 173); //add the click event endPage.Click += new EventHandler(endPage_Click); pagerBar.Cells[0].Controls.Add(new LiteralControl(" ")); pagerBar.Cells[0].Controls.Add(endPage); //add a label to show the total of pages and the current page index
Label pageSign = new Label(); pageSign.ForeColor = Color.FromArgb(173, 173, 173); pageSign.CssClass = "PageSign"; Session["PageSign"] = pageSign; pagerBar.Cells[0].Controls.Add(new LiteralControl(" ")); pagerBar.Cells[0].Controls.Add(pageSign); } } 给'删除'按钮添加属性的代码同样可以放到ItemDataBound事件里处理,不过我觉得,还是在Created的时候处理意思更直观一点^^
另外,想说说DataGrid里数据排序的实现。MSDN里有实现的源码,基本代码如下:
DataView dv = ds.Table[0].DefaultView; //ds是作为数据源的数据集
dv.Sort = "[columnname] ASC|DESC"; //利用DataView的Sort属性排序,MSDN里有说明
grdMyGrid.DataSource = dv; //把DataGrid的数据源改为dv
grdMyGrid.DataBind(); //重新绑定DataGrid
但经过我的实践,发现该方法只能在DataGrid的DataSource属性没有静态设置的时候有效,也就是说只有在DataGrid是以编程的方式实现绑定而非在窗体设计器里指定属性实现绑定的时候有效。如果你在设计的时候就绑定了DataGrid的数据源,那么你只能在需要排序的时候改变你的SQL语句来重新生成数据源然后重新调用DataGrid的DataBind()方法,DataView在此时是无效的。
静能生慧 勤可补拙 言笑用计 行略代谋 |
|||
|
|