chao 的个人资料清凉水都照片日志列表更多 工具 帮助
9月17日

.Net(C#)结合IntelliSense写文档注释

del.icio.us标签: , ,

作者:e-bread   

在使用VisualStudio的时候,大家可能对内置的IntelliSense功能赞叹不已。高高兴兴的自己写个类,发现这个所谓的IntelliSense并不买账,怎样才能实现.Net系统库那样的IntelliSense功能呢?其实.Net内置了一个XML文档注释功能,VisualStudio可以根据生成的XML文档注释内容,通过反射机制,从而实现IntelliSense功能。当然如果你对反射足够了解,也可以自己分析生成的XML文档,不过这部分不是我们这次关注的问题。

打开MSDN,搜索XML文档注释,你会发现.Net提供了大量的文档注释标记,实际上多数标签对于VisualStudio的IntelliSense来说是没有用的,能用上的也就那么几个,其余的是做其它用处的,例如类型检测等,由于是初步,也就不多说了。啰嗦了半天,下面进入正题,能被IntelliSense识别的标签是:<summary>,<param>,<exception>,换句话说只有这三个标签的内容会显示在快捷信息中。下面我们看一个例子。

       /// <summary>
      /// 这是摘要信息
      /// </summary>
      /// <param name="i">参数1信息</param>
      /// <param name="fl">参数2信息</param>
      /// <exception cref="System.Exception">异常信息,在Cref中制定错误类型</exception>【!注意这里是一行,由于页面宽度换行了。】
       public string SampleMethod(int i, bool fl)
       {   return " " ;}

细心的人应当发现了,这里注释行前用了三个"/"而不是常用的两个"/",这是XML文档注释的特征,说明这些注释是要编译的,否则不编译。当然类似块注释,XML注释也可以用"/**  */"进行块注释。不过和一般的块注释不同,XML 的注释块中间的每行前都要加一个"*",看起来是这个样子:

    /**
     * <summary>摘要信息</summary>
     */

个人感觉还不如单行方便,而且VisualStudio在块的情况下的IntelliSense支持不好,不会自动添加结束标签,个人不建议使用这种注释方式。

由于是XML文档注释,因此除了前面的“///”外,格式是符合XML规范的,<summary>标签显示对应的摘要信息,<exception>则根据"cref"引用的类型显示异常信息,这两个标签会在IntelliSense成员列表的快速信息中显示,以上面的例子显示如下:

string SampleMethod(int i, bool fl)
       这是摘要信息
Exceptions:
      System.Exception

对于<param>标签,则根据"cref"引用的参数名,根据你在键入的对应函数显示对应的提示信息,例如你在上例中输入参数fl,则快捷信息显示为:

string SampleMethod(int i, bool fl)
 fl:参数2注释

我们可以发现异常信息并没有显示出来,并不是VisualStudio没有识别,只不过没有放在快捷信息中,打开对象浏览器(object  browser)这些信息就出来了,其实想<remark>,<returns>也会显示在对象浏览器中,不会显示在快捷信息中。因此我们可以将备注信息和返回值的详细信息写在这两个标签中,当需要查看是可以到对象浏览器中仔细查看。

只要遵守XML注释规范,那么你的代码也可以智能感知,花一点时间写这些注释,会大大提高后面的工作效率,多人合作更是如此,还不赶快去试试!

WPF中Page的历史恢复机制

del.icio.us标签: , ,

WPF中的Page调用States类中的Replay方法恢复Page(换句话说原Page的恢复信息保存在State中),
根据这个特点,我们可以继承CustomContentState,将Replay的实现改为调用外部委托实现个性化历史记录,委托的传入参数最好是继承的自定义State本身,例如自定义State名为CustomState,则委托声明为 public delegate void ReplayCustomState(CustomState state),Replay函数里只写ReplayCustomState(this),最后在CustomState构造的时候赋值给ReplayCustomState就可以了。


此外Replay方法中的具体恢复过程是针对具体要恢复的Page页的。
例如Page中有个Label名为lblName。对应数据State中存储的数据为string Name。
Replay(CustomContentState state)中则写 lblName.Text = state.Name;

虽然自定义了State,不过WPF可不认这一套,最后还要我们将自定State手动记录下来,通过NavigationService的AddBackEntry(CustomContentState)来存储State就可以了,在想存储的地方调用这个方法就可以实现自定义历史记录了,如果根据用户的特定操作记录的话,还可以实现历史回顾特性的撤销功能,和PS很像(不过这个实在历史记录按钮里)

由于自定了State,WPF原有的历史功能就不好用了,因为它在历史功能中存储的还是系统默认的State,这可不是我们想要的结果。于是要自己写个历史程序,还好只要Page继承IProvideCustomContentState接口就可以了。

IProvideCustomContentState提供一个抽象函数 public CustomContenState GetContentState(),GetContentState()在Page触发历史变更按钮的时候触发,返回CustomContentState,所以我们可以返回自己的State,从而存储自定义State,实现历史功能。在返回自定义State前要给JournalName赋值,用于标识不同的State。
虽然在反编译时,会看到当JournalName为空时,WPF自动给它赋值了,不过没有这个在实例CustomState是无法编译的,还是老老实实写上。
多说一句,实际中State存储的JournalName是你输入的JournalName+#+容器名,从而区分不同容器相同JournalName的情况(因为容器名肯定不同)。

此外,WPF对历史页面调用GetContentState()存储State进行了位置检测,换句话说,如果你在历史界面继续跳转,那么除了传入的State会变外(看你怎么生成传入的State了),State在历史记录中的位置是不会变的,

举个例子,例如你跳转到第二步的Page,名称为Step2,在历史展开列表中从下向上数在第二位置,对页面数据无改动后继续跳转,GetContentState()触发,将传回的Sate中的JournalName改为Step5,那么历史列表中从下向上数第2项更名为Step5 而不是列表的第5项。当然如果你对页面数据进行了修改,那么这个就是倒数第二个
选项了(第一个为当前页),原先Step2后的历史记录清除了。

总结一下,自定义历史记录的实现过程,首先通过继承抽象类CustomContenState,实现Replay(NavigationService navigationService, NavigationMode mode)方法,再在Page页中利用NavigationService的AddBackEntry(CustomContentState)存储历史信息。最后通过将Page页继承IProvideCustomContentState接口,实现GetContentState()方法,实现历史按钮的功能,至此WPF中Page自定义历史恢复完全实现。

椋鸟:草原灭蝗的“生物武器”[组图]_中国网

 

椋鸟:草原灭蝗的“生物武器”[组图]

中国网 china.com.cn  时间: 2008-07-15  发表评论>>

7月9日,椋鸟口衔蝗虫在当地牧民为它们搭建的石堆巢上,准备喂食幼椋。新华社记者 沈桥 摄

7月9日,椋鸟口衔蝗虫在当地牧民为它们搭建的石堆巢上,准备喂食幼椋。新华社记者 沈桥 摄

7月9日,椋鸟在当地牧民为它们搭建的石堆巢上,喂食幼椋蝗虫。新华社记者 沈桥 摄

7月9日,椋鸟在当地牧民为它们搭建的石堆巢上,喂食幼椋蝗虫。新华社记者 沈桥 摄

椋鸟:草原灭蝗的“生物武器”[组图]_中国网

椋鸟:草原灭蝗的“生物武器”[组图]_中国网

 

椋鸟:草原灭蝗的“生物武器”[组图]

中国网 china.com.cn  时间: 2008-07-15  发表评论>>

成群的椋鸟在新疆巴里坤草原上捕食蝗虫(6月12日摄)。

成群的椋鸟在新疆巴里坤草原上捕食蝗虫(6月12日摄)。

椋鸟是国家二级保护鸟类,以蝗虫为食,每天捕食蝗虫在120至180只左右,每只椋鸟可保护2亩草场避免蝗虫危害。每年6月初,幼椋陆续破壳之时,椋鸟采食量会大大增加,而此时往往正是蝗虫肆虐之时。 为了给椋鸟提供一个安静舒适的“家”,招引椋鸟防治草原蝗灾,近年来,新疆在天山草原上实施人工筑巢招引椋鸟治蝗工程,据不完全统计,目前,新疆伊犁、阿勒泰、博尔塔拉等地共筑巢招引椋鸟300万只以上,控制蝗虫灾害面积600多万亩。 新华社记者 沈桥 摄

7月9日,椋鸟口衔蝗虫在当地牧民为它们搭建的石堆巢上,准备喂食幼椋。新华社记者 沈桥 摄

7月9日,椋鸟口衔蝗虫在当地牧民为它们搭建的石堆巢上,准备喂食幼椋。新华社记者 沈桥 摄

椋鸟:草原灭蝗的“生物武器”[组图]_中国网

南极气温上升导致小企鹅大量冻死_中国网

 

南极气温上升导致小企鹅大量冻死

中国网 china.com.cn  时间: 2008-07-14  发表评论>>

核心提示:在过去50年里,南极大陆的平均温度上升了3摄氏度。这导致南极冬季频发暴风雨,比暴风雪更冰冷刺骨的冻雨导致大量新生小企鹅死亡。其中受灾最严重的阿德利企鹅面临灭绝危险。

脚下就是幼禽的尸骸,企鹅父母悲鸣。

科学家担忧,不出10年,企鹅或因气候变化而灭绝。

羊城晚报7月14日报道 南极地区连续爆发反常暴风雨,导致成千上万只新生小企鹅活活冻死。据估计,经此一难,南极企鹅数目将锐减两成。南极专家认为,这是气候变化给南极地区带来的又一灾难性影响。

南极下雨多过下雪

科学家相信,受灾最严重的阿德利企鹅数目将下降至80%,如果天气短期内不能转好,情况可能更严重,不到10年,这一物种或将从地球上消失。

在过去50年里,南极大陆的平均温度上升了3摄氏度,达到-14.7摄氏度,冬季频发的暴风雪渐渐被更加冰冷刺骨的暴风雨所代替。

阿德利企鹅刚出生时仅有薄薄一层保暖皮毛,小企鹅需要40天的时间才能长出防水的羽毛,然而连日暴雨将整个巢穴都浸湿了,企鹅父母在时还能为子女遮风挡雨,一旦离巢觅食,小企鹅往往会因为体温过低而死。

“长期以来人们注意到了冰架在溶解,但南极冷雨却是前所未有的新现象,企鹅正面临寒冷致死的威胁。”刚刚从南极归来的纽约探险家强·鲍尔马斯特说,“它们的皮毛可以在大雪中保护自己,却不能应付暴雨,这就好像一个穿着厚夹克却被雨淋湿的人一样。”

帝企鹅乐园遭摧毁

奥斯卡获奖纪录片《帝企鹅日记》描绘了憨态可掬的帝企鹅生存及繁衍的场景,令人印象深刻,然而西雅图华盛顿大学生物学教授笛伊·波尔斯曼痛心指出,2006年12月,也就是这部电影拍摄不到两年后,她再抵达当年的拍摄地南极南部,“已经完全认不出这就是纪录片里的企鹅乐园。”笛伊说,她完全没看到帝企鹅幼仔,也看不到浮冰,冰山数目大大减少。据悉,去年9月份,也就是帝企鹅育儿期间,当地曾被一场大型暴风雨所袭击,“极少企鹅幼仔能够幸存。”

“看见企鹅们脚下都是下一代的残骸,这才是我所见过气候变化最令人震撼以及最直接的证据。”鲍尔马斯特说。 (本文来源:金羊网-羊城晚报 作者:方海)

南极气温上升导致小企鹅大量冻死_中国网

.NET获取IP等信息 - jenner-lin - 博客园

 

.NET获取IP等信息

.NET获取IP等信息

1. 在ASP.NET中专用属性:
获取服务器电脑名:Page.Server.ManchineName
获取用户信息:Page.User
获取客户端电脑名:Page.Request.UserHostName
获取客户端电脑IP:Page.Request.UserHostAddress
2. 在网络编程中的通用方法:
获取当前电脑名:static System.Net.Dns.GetHostName()
根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名).AddressList
也可根据IP地址取出电脑名:static System.Net.Dns.Resolve(IP地址).HostName

3. 系统环境类的通用属性:
当前电脑名:static System.Environment.MachineName
当前电脑所属网域:static System.Environment.UserDomainName
当前电脑用户:static System.Environment.UserName

.NET获取IP等信息 - jenner-lin - 博客园

得GridView的EmptyDataTemplate中的控件 - kingwkb的专栏 - CSDNBlog

 

转载 得GridView的EmptyDataTemplate中的控件收藏

新一篇: Visual studio 2005中Source View中不能切换到Design View的解决方法 | 旧一篇: 关于进行Asp.net窗体验证的过程说明
这个问题的提出,是我想在Gridview中整理添加记录的功能。
如果有数据的时候,我们可以把空的newTextBox放在FooterTemplate中,在程序里可以用
Gridview1.FooterRow.FindControl("newTextBox")来取得这个控件,完成添加记录的功能。
但如果数据表中没有记录,header和footer都不会显示出来。 这时,只会显示EmptyDataTemplate里的内容。
奇怪的是EmptyDataRow并不是Gridview的成员,于是上面的方法不行了。
找了很久,找到这样一个变通的办法来获得EmptyDataTemplate里的控件:

Dim txbNew As TextBox = GridView1.Controls(0).Controls(0).FindControl("newTextBox")

很变态,但确实可行。

1 Protected Sub btnAddNew_Click()Sub btnAddNew_Click(ByVal sender As Object, ByVal e As System.EventArgs)
2        Label1.Text = TypeName(GridView1.Controls(0)).ToString + " "
3 Dim EmptyChildTable As Table = GridView1.Controls(0)
4 Dim EmptyGridView As GridViewRow = EmptyChildTable.Rows(0)
5        Label1.Text = Label1.Text + EmptyGridView.RowType.ToString + " "
6 Dim txbNewCltName As TextBox = EmptyGridView.FindControl("txbNewCltName")
7        Label1.Text = Label1.Text + txbNewCltName.Text
8 End Sub

其中的txbNewCltName和btnAddNew都是放在EmptyTemplate里的控件。
显示的结果是:
ChildTable EmptyDataRow 新添加的内容

可以知道,第一层Control是Table,第二层Control是Row.

得GridView的EmptyDataTemplate中的控件 - kingwkb的专栏 - CSDNBlog

Windows任务管理器菜单栏消失解决办法

del.icio.us标签: ,

最近没事乱点,不小心把任务管理器的菜单栏搞没了,没法切换任务管理器中的各个子项,最麻烦的是由于没有了窗体的边框,关闭按钮不见了,每次只能中止taskmgr.exe这个进程来关闭任务管理器。记得以前帮别人解决过这个问题,不过时间太久远了,记不清了,试了几种方法都不行后,