DEITY 的个人资料ScorDeity@雾霭无痕.天蝎恶魔照片日志列表 工具 帮助

日志


12月25日

CommunityServer 2.x

CommunityServer 2.x
 是开放源码,其实 CommunityServer 的前身是 ASP.NET Forums,2.3 这个版本是国内人汉化,并做了一些改进。真正官方已经转到 CommunityServer 上面了,CS 2.x  包含了博客、相册、新闻、文件共享、RSS等新功能,功能不少,看看代码,更是多,汉化起来倒不麻烦,改一下 XML 文件就行了,公司产品的社区准备采用 在 CommunityServer 2.x 的基础上来改造。
 这个程序是开源的,由很多人做出来的,很规范,可以从这些代码中,学习到很多好的开发思想。这个程序为了使用皮肤,用框架来构建出来了整个应用,确实灵活了很多。另外程序大量使用了控件,包括自定义服务器控件和网页控件,代码都是直接写在 ASPX 文件中,没有使用  CodeBehind 技术,因为网页上面几乎不用写什么代码了,都在自定义服务器控件中了。

接口的终结解释

http://club.sooyie.com/blogs/wuzi/archive/2006/10/09/_A563E3538476C87ED37EE389CA91_-.aspx
  简单的说接口就是一个契约或者规范。比如遥控器,国家出台了一个国家遥控器规范,明文要求所有的遥控器厂家都要遵循这个规范,如果不遵循规范就不给3C认证标志,就不允许上市出卖。为什么要这个规范呢?大家在时间生活中会经常碰到,甲厂的遥控器不能遥控乙厂的电视,电视遥控器不能遥控其它电器如空调,冰箱!原因是什么呢?是各个遥控器都没有遵循一个规范,电波有长有短,电压有高有低,导致各自为政,四分五裂。
  可以想像出国家遥控器标准只是是规定遥控器的一些重要技术指标,比如要发射波应该多长,电压应该多高……但它绝对不会规范出遥控器的材质、形状、重量和颜色,也就是说规范把所有同遥控无关的东西都抛弃了!每个遥控器厂家只要遵循了规范,那么对遥控器可以有任意的诠释。比如A厂可以用铁做,牢固无比,B厂可以用纸,可以任意折叠,anyway,不管用什么做,做出什么样子,只要遵循规范的遥控器就可以遥控所有的电器(当然电器厂家也要遵循一定的规范),甚至可以遥控导弹发射!利害吧,这就是接口的威力!
再详细点,接口就是一个规范,他和具体的实现无关!接口是规范(虚的),他只是一张纸,也是说在实际的使用中接口只有依托一个实现了它的类的实例,才会有意义,如上面的各个厂家做的遥控器产品。每个实现接口的类(厂家)必需实现接口中所有的功能。一旦一个类实现了一个接口,就可说一个类和接口捆绑了(这个很重要,做题目的时候会用到)

  来个例子
    interface 遥控器规范    //国家定义的遥控器规范,每个遥控器厂家必需实现(诠释)它
    {
          int 波长();
          int 电压();
    }
    class 甲厂铁遥控器 : 遥控器规范    //甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了
    {
          public int 波长();                        //规范上定义的指标
          public int 电压();                        //规范上定义的指标
          public int 形状() { 正方形 };              //甲厂自己对该产品的诠释
          public int 材质() { 铁 };                  //甲厂自己对该产品的诠释
    }
    class 乙厂纸遥控器 : 遥控器规范    //甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了
    {
          public  int  波长();                      //规范上定义的指标 
          public  int  电压();                      //规范上定义的指标       
          public  int  形状() { 圆形 };             //甲厂自己对该产品的诠释,是圆形
          public  int  材质() { 纸 };              //甲厂自己对该产品的诠释,用纸做,好酷!     
    }
    class 电器
    { procedure 接收遥控(遥控器规范)    //电器上,接收遥控指令
        {.....
              接收(遥控器规范.波长)  ;             
              接收(遥控器规范.电压);
              .....}      }   
    static  main()
    {
        甲厂铁遥控器    ControlA    ;    //申明控制器对象
        乙厂纸遥控器    ControlB    ;
        ControlA    =  new  甲厂铁遥控器();  //实例化控制器对象,这个时候系统在托管堆中为该对象分配了空间
        ControlB    =  new  乙厂纸遥控器()  ;
        遥控器规范    ControlInterfaceA  =  (遥控器规范)遥控器1  ;    //把对象实例转换成一个规范,为什么呢?因为"我家的电器".只能识别遥控器规范,它识别不到具体的遥控器
        遥控器规范    ControlInterfaceB  =  (遥控器规范)遥控器2;    //同上
        电器    我家的电器  =  new  电器();
        我家的电器.接收遥控(ControlInterfaceA)    //我用甲厂遥控器遥控我家的电器.  注意:  这里的ControlInterfaceA是不能单独存在的,它必要依赖实现了"遥控器规范"的类的实例"ControlA".道理很简单,接口是一个指针,不会被分配空间,你就无法使用,只有和一个具体类的实例联系了,才有了可以活跃空间.
        我家的电器.接收遥控(ControlInterfaceB)    //我用乙厂遥控器遥控我家的电器
       
        ...
        //下面是我的的想像,我可以用遥控器来控制导弹发射!
        我的导弹.接收遥控(ControlInterfaceA);
        我的导弹.接收遥控(ControlInterfaceB);       
        ...
    }
--------------------------------------------------------------------
接口的执行
  好了,有了接口的概念,再来谈 C# 程序在运行中是如何使用接口的,如何访问接口函数。具体流程如下
  A、当调用一个接口的函数时,系统会去检查这个接口对应实例是什么。
  B、找到这个实例后,再去找这个实例对应的实例类是什么。
  C、根据这个实例类去检查该实例类是否和接口发生了捆绑(看是否实现了该接口,冒号后面就是)
  D、好!如果实例类实现了该接口(发生了捆绑),它就在这个实例类中找函数的定义。然后执行该函数。执行结束。
  E、如果没找到,他就继续往父类找,直到找到第一个和接口捆绑的父类为止。
  F、找到后,它再检查该函数是否是虚拟函数。
  G、如果不是,他马上就执行它。
H、如果是,麻烦了,系统又要从头来过,去检查该实例类的函数是否重载了该函数。

例子:

using System;

namespace ConsoleApplication1
{
 /**//// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 public interface  I
 {
  void  Func();
 }
        
 class  A :I 
 {
  public  virtual  void  Func() 
  { 
   Console.WriteLine("FuncA");
  }
 }
       
 class  B  :  A  ,  I    //注意这里的意思?
 {
  public  void  Func()  {  Console.WriteLine("FuncB");}
 }       
       
 class  C  :    A 
 {
  public  override  void  Func()  {  Console.WriteLine("FuncC");}
 }   

 class Class1
 {
  /**//// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   I  a  =  new  A()  ;    //申明了接口a,并马上和一个类的实例发生关系了
   I  b  =  new  B()  ;    //申明了接口b,并马上和一个类的实例发生关系了
   I  c  =  new  C()  ;    //申明了接口c,并马上和一个类的实例发生关系了
   a.Func()  ;              //检查a的实例A,  发现A和接口I捆绑了,所以执行A的函数Func  ,结果:  FuncA
   b.Func()  ;              //检查b的实例B,  发现B和接口I捆绑了,所以执行B的函数Func  ,结果:  FuncB
   c.Func()  ;              //家常c的实例C,发现其没有和接口I捆绑,系统继续找它的父类.  发现A和I捆绑了,他就去找函数A,发现A是虚拟函数,系统又从头来找类的实例C,发现C重载(override)了Func,好了,马上执行该函数.  结果是FuncC;
   Console.ReadLine();
  } 
 }
}

10月29日

我为什么要来北京

   我为什么要来北京?
    这个问题很难回答,但是还是要说的:
     1.北京的发展比长沙好:
          无论从什么方面说,北京的各类方面要比长沙的要好.虽然长沙也在高速发展中.我不在广西,既然要出来闯,那我到北京自然要比在长沙好
     2.未玩待续

好久没写MSN了

 
      好久没写了,一方面是客观原因自己没有时间,一方面是自己也不想写,不知道自己要写什么,
  虽然很多想法,但是都很不成熟,也没有想写的欲望了
      但是我还是想感谢我的女朋友了.如果不是她的支持,我都不知道自己怎么走下去了...............
   

吴敏来北京了

   
    我的好朋友吴敏来北京了.  我今天看到他的时候,我吓了跳,虽然我知道他比较累,但是看到他那样瘦,我还是不能相信我的眼睛.
 我们分开快两个月了,虽然都没有什么联系,但是我相信他的能力,相信他的运气,但是还是没有想到他会那样的累.心里很不是滋味.
     高高的颧骨顶他的脸蛋,整个脸都是皮.我想这些都是他通宵所导致的,加上营养不够好,哎,这些都让他累的.有时候我也想.如果是我自己能不能努力到他那样地步恩?
     我估计是不行的.我虽然不怕苦,但是这样高强度的和高压力下的通宵.我会受不了的,佩服他了.
     
    
1月12日

rosemarry 的鼓励

 rosemarry也许是我自己太看不起自己了吧!或许是自己太不愿意让自己从小做起了.或许没有或许..我只是很不甘心为什么我自己不能够做到应该做的时期呢,为什么我的付出没有得到相应的回报呢?很多晚上我都对着月亮一遍一遍的问自己,我没有足够的努力我没有足够的去做么?为什么我不能和其他人一样,只经过一点努力就能达到目标,我相信这个世界上一定会有这样一种方法:任何事情都由他的捷径!我就是不明白为什么我都没有找到呢!!!!!!!!!!!!!!!!!!!! 我对着苍天问:为什么我没有找到!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! baidu一下吧

夜也深了。。

   夜也深了。刚刚和老四qq完有点累了.
大学四年就要过去了.怎么也不明白四年自己变了怎样多,回头看看自己的脚步,发现很多做过事情,都是自己曾经深恶痛绝的,或许这个就是人们常常说的人在江湖身不由己,啊! 又给自己找借口了,埃.突然觉得这个世界好像就是这样变化的,
      人都可以变的吧,自我安慰一下,堕落的时间越来越多了,这样是不行的
1月6日

计数器

1. 在已经登录的状态,点击[编辑您的共享空间] 进入后台。

2. 在当时浏览器地址栏现有的地址后面添上“  &powertoy=sandbox ”然后按回车。进入新的页面(页面看起来没有变化)。

3. 点[自定义]菜单,得到到一个横条式的目录。 再点[模块],得到下拉菜单, 在下拉菜单里选择添加模块 PowerToy: Custom HTML,此时在所编辑页面内会出现一个新的模块。标题名称为 Custom HTML。 拖动这个模块至你想要置放的位置。(通常是页面的最上方)  置放完毕,按上方[保存]按钮,你会发现 “ Custom HTML ”模块已经出现在那里,这时可以在该模块内输入任何 HTML 的脚本代码

4.把您在计数器网站里申请的代码直接输入进去就可以了!

 

  1. 进入 MSN Spaces 的编辑页面。
  2. 在编辑页面的地址(这时在地址栏中显示的地址)后面附加上“ &powertoy=musicvideo ”后回车。(就是你的MSN空间的地址后面加上“ &powertoy=musicvideo "
    举例:比如我的在空间点了编辑以后页面的地址为“http://spaces.msn.com/members/loucson/PersonalSpace.aspx?_c02_owner=1&_c=”加上“ &powertoy=musicvideo ”就等于“http://spaces.msn.com/members/loucson/PersonalSpace.aspx?_c02_owner=1&_c=&powertoy=musicvideo ”然后按回车。
  3. 新的页面载入后,点击“自定义”,在模块的下拉菜单中就有一个新的“PowerToy:Windows Media Player”(原来是没有的项目),点击一下增加,然后保存。
  4. 这样就会有一个新的模块 Window Media Player,目前该模块只有英文界面。
  5. 注意媒体文件的地址 URL,只支持 WMA, WMV, WAV, AVI, MPG, MPEG, MP3 格式(也不支持播放列表),除外的格式将无法正常保存,导致预览时播放器的按钮为灰白
  6. 如果想页面载入时自动播放的话,只需勾上 Auto Start。其他参数如播放次数和播放器的外观等默认无妨。
  7. 这样,你的 MSN Spaces 就有了在线播放器的功能了。
1月2日

为人处世28条必看 为人处世28条必看

1.长相不令人讨厌,如果长得不好,就让自己有才气;如果才气也没有,那就总是微笑。 2.气质是关键。如果时尚学不好,宁愿纯朴。 3.与人握手时,可多握一会儿。真诚是宝。 4.不必什么都用“我”做主语。 5.不要向朋友借钱。 6.不要“逼”客人看你的家庭相册。 7.与人打“的”时,请抢先坐在司机旁。 8.坚持在背后说别人好话,别担心这好话传不到当事人耳朵里。 9.有人在你面前说某人坏话时,你只微笑。 10.自己开小车,不要特地停下来和一个骑自行车的同事打招呼。人家会以为你在炫耀。 11.同事生病时,去探望他。很自然地坐在他病床上,回家再认真洗手。 12.不要把过去的事全让人知道。 13.尊敬不喜欢你的人。 14.对事不对人;或对事无情,对人要有情;或做人第一,做事其次。 15.自我批评总能让人相信,自我表扬则不然。 16.没有什么东西比围观者们更能提高你的保龄球的成绩了。所以,平常不要吝惜你的喝彩声。 17.不要把别人的好,视为理所当然。要知道感恩。 18.榕树上的“八哥”在讲,只讲不听,结果乱成一团。学会聆听。 19.尊重传达室里的师傅及搞卫生的阿姨。 20.说话的时候记得常用“我们”开头。 21.为每一位上台唱歌的人鼓掌。 22.有时要明知故问:你的钻戒很贵吧!有时,即使想问也不能问,比如:你多大了? 23.话多必失,人多的场合少说话。 24.把未出口的“不”改成:“这需要时间”、“我尽力”、“我不确定”、“当我决定后,会给你打电话”…… 25.不要期望所有人都喜欢你,那是不可能的,让大多数人喜欢就是成功的表现。 26.当然,自己要喜欢自己。 27.如果你在表演或者是讲演的时候,如果只要有一个人在听也要用心的继续下去,即使没有人喝采也要演,因为这是你成功的道路,是你成功的摇篮,你不要看的人成功,而是要你成功。 28.如果你看到一个贴子还值得一看的话,那么你一定要回复,因为你的回复会给人继续前进的勇气,会给人很大的激励。同时也会让人感激你。
12月18日

在comboBox中添加下拉列表

本来以为comboBox的Items可以随便的加上去,随便移除的.今天刚刚做的东西好像有问题:
 我想在按下回车键的时候,判断comboBox的items里面有没有selectItem的内容,一般来说就想到:
foreach(Object ob in comboBox_Input.Items)
      { 
       if(ob.ToString().Trim() !=comboBox_Input.SelectedValue.ToString().Trim())
       {
            comboBox_Input.Items.Add(this.comboBox_Input.Text.Trim());
        }
       }
可是碰到错误! 集合已经更改不可以修改了.啊.........奇怪啊..想一下也是.程序碰到一个判断说如果items中没有现在输入的内容.."好我加一个内容进去".....但是程序不干了:"不是把..我..我还没有检测完啊....",晕....好吧只好作一个标志位了....
 bool intsert = false 
当循环完的时候就看看有没有可以加的,应为一次输入我只加一个object ,如果想个的话..再加一个for吧
 
完整程序如下:
private void comboBox_Input_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
  {
   if(e.KeyCode.ToString() == Keys.Enter.ToString())
   {
    if(this.comboBox_Input.Text.Trim() !="")
    {
     bool intsert = false ;
     if(comboBox_Input.Items.Count == 0)
     {
      comboBox_Input.Items.Add(this.comboBox_Input.Text.Trim());
     }
     else
     {
      foreach(Object ob in comboBox_Input.Items)
      { 
       if(ob.ToString().Trim() !=comboBox_Input.Text.ToString().Trim())
       {
        intsert = true ;
       }
      }
      if(intsert)
      {
       comboBox_Input.Items.Add(this.comboBox_Input.Text.Trim());
      }
     }
    }
   }
  }

区位码(C#)小程序

 写了一个区位码(C#)的小程序 主要思想是取得ASCII .
西文使用的编码通常是ASCII码,一个汉字有ASCⅡ码、区位码等与之对应。ASCⅡ码中对应于码值161到254 的字符用于表示汉字,每个汉字用两个ASCⅡ码值对应的字符表示。GB2312-80就是中文的标准编码,即国标码。
 
区位码是与汉字一一对应的编码,用四位数字表示, 前两位从01 到94称区码,后两位从01到94称位码。 一个汉字的前一半是 ASCⅡ码为“160+区码”的字符,后一半是ASCⅡ码为“160+ 位码”的字符。即是把组成汉字的两个ASCII码各减去160,所得结果组合起来就是区位码。如“国”字,ASCII码减去160后,两部分分别为:25、90,则“国”字的区位码为2590。
 
因为GB2312最多能表示6763个汉字,所以少用的字是不能找出区位码的.还好国家有一个叫做GBK的东西[通常说的大字符集].不过编码不是10进制的.就有一些不好办了.我也没有时间具体看看怎么回事.有机会谁告诉我一下也行
以下是具体代码
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Text;
namespace Character1._1
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Character : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Label label1;
  private System.Windows.Forms.Label label2;
  private System.Windows.Forms.Label label3;
  private System.Windows.Forms.RichTextBox richTextBox_Character;
  private System.Windows.Forms.TextBox textBox_signe;
  private System.Windows.Forms.Button button_Transforme_2;
  private System.Windows.Forms.Button button_Transforme;
  private System.Windows.Forms.ComboBox comboBox_Input;
  private System.Windows.Forms.Button button_Character;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;
  public Character()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();
   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }
  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }
  #region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   this.button_Transforme = new System.Windows.Forms.Button();
   this.button_Transforme_2 = new System.Windows.Forms.Button();
   this.label1 = new System.Windows.Forms.Label();
   this.richTextBox_Character = new System.Windows.Forms.RichTextBox();
   this.textBox_signe = new System.Windows.Forms.TextBox();
   this.label2 = new System.Windows.Forms.Label();
   this.label3 = new System.Windows.Forms.Label();
   this.comboBox_Input = new System.Windows.Forms.ComboBox();
   this.button_Character = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // button_Transforme
   //
   this.button_Transforme.Location = new System.Drawing.Point(288, 96);
   this.button_Transforme.Name = "button_Transforme";
   this.button_Transforme.TabIndex = 0;
   this.button_Transforme.Text = "GB2312转换";
   this.button_Transforme.Click += new System.EventHandler(this.button_Transforme_Click);
   //
   // button_Transforme_2
   //
   this.button_Transforme_2.Location = new System.Drawing.Point(208, 96);
   this.button_Transforme_2.Name = "button_Transforme_2";
   this.button_Transforme_2.TabIndex = 1;
   this.button_Transforme_2.Text = "GBK转换";
   this.button_Transforme_2.Click += new System.EventHandler(this.button_Transforme_2_Click);
   //
   // label1
   //
   this.label1.Location = new System.Drawing.Point(16, 56);
   this.label1.Name = "label1";
   this.label1.Size = new System.Drawing.Size(72, 23);
   this.label1.TabIndex = 3;
   this.label1.Text = "请输入字符";
   this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
   //
   // richTextBox_Character
   //
   this.richTextBox_Character.Location = new System.Drawing.Point(88, 160);
   this.richTextBox_Character.Name = "richTextBox_Character";
   this.richTextBox_Character.ReadOnly = true;
   this.richTextBox_Character.Size = new System.Drawing.Size(296, 136);
   this.richTextBox_Character.TabIndex = 4;
   this.richTextBox_Character.Text = "";
   //
   // textBox_signe
   //
   this.textBox_signe.Location = new System.Drawing.Point(88, 128);
   this.textBox_signe.Name = "textBox_signe";
   this.textBox_signe.ReadOnly = true;
   this.textBox_signe.Size = new System.Drawing.Size(288, 21);
   this.textBox_signe.TabIndex = 5;
   this.textBox_signe.Text = "因为GB2312最多能表示6763个汉字![现在不能使用...请升级]";
   //
   // label2
   //
   this.label2.Location = new System.Drawing.Point(8, 160);
   this.label2.Name = "label2";
   this.label2.Size = new System.Drawing.Size(72, 23);
   this.label2.TabIndex = 3;
   this.label2.Text = "区位码:";
   this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
   //
   // label3
   //
   this.label3.Location = new System.Drawing.Point(8, 128);
   this.label3.Name = "label3";
   this.label3.Size = new System.Drawing.Size(72, 23);
   this.label3.TabIndex = 3;
   this.label3.Text = "信息提示:";
   this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
   //
   // comboBox_Input
   //
   this.comboBox_Input.Location = new System.Drawing.Point(96, 56);
   this.comboBox_Input.Name = "comboBox_Input";
   this.comboBox_Input.Size = new System.Drawing.Size(288, 20);
   this.comboBox_Input.TabIndex = 6;
   this.comboBox_Input.Text = "梁春华";
   this.comboBox_Input.KeyUp += new System.Windows.Forms.KeyEventHandler(this.comboBox_Input_KeyUp);
   this.comboBox_Input.TextChanged += new System.EventHandler(this.comboBox_Input_TextChanged);
   this.comboBox_Input.SelectedIndexChanged += new System.EventHandler(this.comboBox_Input_SelectedIndexChanged);
   //
   // button_Character
   //
   this.button_Character.Location = new System.Drawing.Point(128, 96);
   this.button_Character.Name = "button_Character";
   this.button_Character.TabIndex = 1;
   this.button_Character.Text = "查看汉字";
   this.button_Character.Click += new System.EventHandler(this.button_Character_Click);
   //
   // Character
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(416, 305);
   this.Controls.Add(this.comboBox_Input);
   this.Controls.Add(this.textBox_signe);
   this.Controls.Add(this.richTextBox_Character);
   this.Controls.Add(this.label1);
   this.Controls.Add(this.button_Transforme_2);
   this.Controls.Add(this.button_Transforme);
   this.Controls.Add(this.label2);
   this.Controls.Add(this.label3);
   this.Controls.Add(this.button_Character);
   this.Name = "Character";
   this.Text = "区位码查看--ScorDeity雾霭无痕";
   this.ResumeLayout(false);
  }
  #endregion
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Character());
  }
 

  ///国标码是一个四位十六进制数,
  ///区位码是一个四位的十进制数,每个国标码或区位码都对应着一个唯一的汉字或符号,
  ///但因为十六进制数我们很少用到,所以大家常用的是区位码,它的前两位叫做区码,后两位叫做位码。

  /// <summary>
  ///
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void button_Transforme_Click(object sender, EventArgs e)
  {
   this.richTextBox_Character.Text = this.CharacterToSmallCharacterNum(this.comboBox_Input.Text.Trim().ToLower());
  }
  private void button_Transforme_2_Click(object sender, EventArgs e)
  {
   this.richTextBox_Character.Text = this.CharacterToCharacterNumTow(this.comboBox_Input.Text.Trim().ToLower());
  }
  /// <summary>
  /// GB2312 转成数值
  /// </summary>
  /// <param name="characters"></param>
  /// <returns></returns>
  private string CharacterToSmallCharacterNum(string characters)
  {
   string Num = string.Empty;
   string charactercode = characters.Trim().Replace(" ","");
   if (charactercode != "" || charactercode.Length > 0)
   {
    for (int i = 0; i < charactercode.Length; i++)
    {
     try
     {
      //toolStripProgressBar1.Value = i * 10;
      string str = charactercode.Substring(i, 1);
      ///取出二进制编码
      ///System.Text.Encoding.GetEncoding("GB2312").
      ///GB2312最多能表示6763个汉字
      Encoding gb = System.Text.Encoding.GetEncoding("GB2312");
      byte[] characterByte = gb.GetBytes(str.Trim());
      //if (characterByte.Length < 2) return "好像你输入错误了吧!";
      ///分别取出低位和高十六位 转换成为可用的区位码
      int lowintcode = characterByte[0];
      int hightintcode = -1;
      if (characterByte.Length >= 2)
      {
       lowintcode   = characterByte[0] - 160 ;
       hightintcode = characterByte[1] - 160;
      }
      ///1区 键盘上没有的各种符号
      ///2区 各种序号 3区 键盘上的各种符号(按中文方式给出)
      ///4 -5区 日文字母 6区 希腊字母
      ///7区 俄文字母 8区 标识拼音声调的母音及拼音字母名称
      ///9区 制表符号 10- 15区 未用
      ///16-55区 一级汉字(按拼音字母顺序排列)
      ///56- 87区 二级汉字(按部首笔划顺序排列)
      ///88- 94区 自定义汉字
      if ( (lowintcode > 10 && lowintcode< 15))
      {
       MessageBox.Show("使用GBK查找!有可能你输入的是繁体字!","警告!");
       this.textBox_signe.Text = "使用GBK查找!因为GB2312最多能表示6763个汉字!";
       textBox_signe.ForeColor =System.Drawing.Color.Red;
       Num += "GBK查找为:\n" + CharacterToCharacterNumTow(characters) + "GB2312 查找为:" + "\n";
      }
      if (lowintcode < 0 || hightintcode < -1)
      {
       //MessageBox.Show("使用GBK查找!有可能你输入的是繁体字!","警告!");
       this.textBox_signe.Text = "使用GBK查找!有可能你输入的是繁体字!--";
       Num += "GBK查找为:\n" + CharacterToCharacterNumTow(characters) + "\nGB2312 查找为:" + "\n";
      }
      string lowcode = System.Convert.ToString(lowintcode);
      string hightcode = System.Convert.ToString(hightintcode)=="-1"?"":System.Convert.ToString(hightintcode);
      if (lowcode.Length == 1)
      {
       lowcode = "0" + lowcode;
      }
      /// 如果高位没有足够长度的话,加零
      if (hightcode.Length == 1)
      {
       hightcode = "0" + hightcode;
      }
      ///在表示一个汉字的2个字节中,高字节对应编码表中的行号,称为位码;低字节对应编码表中的列号,称为区码
      ///区位码: 低位+高位 它的前两位叫做区码,后两位叫做位码
      this.textBox_signe.Text ="GB2312 查找为:" + "\n" ;
      Num += str + ":" + lowcode.ToUpper() + hightcode.ToUpper();
      Num += "\n";
     }
     catch (System.Exception e)
     {
      MessageBox.Show(e.Message, "警告!!");
     }
    }
   }
   else
   {
    this.richTextBox_Character.Text = "";
    MessageBox.Show("请输入字符!", "警告!");
   }
   return Num;
  }
  /// <summary>
  /// 系统转 但是是区位码
  /// </summary>
  /// <param name="characters"></param>
  /// <returns></returns>
  private string CharacterToCharacterNumTow(string characters)
  {
   string Num = string.Empty;
   string charactercode = characters.Trim();
   //characters = System.Convert.
   if (charactercode != "" || charactercode.Length > 0)
   {
    for (int i = 0; i < charactercode.Length; i++)
    {
     try
     {
      //toolStripProgressBar1.Value = i*10;
      string str = charactercode.Substring(i, 1);
      ///取出二进制编码
      byte[] characterByte = System.Text.Encoding.Unicode.GetBytes(str.Trim());
      ///分别取出低16位和高十六位
      string lowcode = System.Convert.ToString(characterByte[0], 16);
      string hightcode = System.Convert.ToString(characterByte[1], 16);
      if (lowcode.Length == 1)
      {
       lowcode = "0" + lowcode;
      }
      /// 如果高位没有足够长度的话,加零
      if (hightcode.Length == 1)
      {
       hightcode = "0" + hightcode;
      }
      ///区位码: 低位+高位
      this.textBox_signe.Text = "GBK查找为:";
      Num +=  str + ":" + lowcode.ToUpper() + hightcode.ToUpper();
      Num += "\n";
     }
     catch (System.Exception e)
     {
      MessageBox.Show(e.Message, "警告!!!!");
     }
    }
   }
   else
   {
    MessageBox.Show("请输入字符!", "警告!");
   }
   return Num;
  }
  private string NumTOCharacter(string num)
  {
   int codenum = 0 ;
   string character = "";
   string[] numarry = num.Trim().Replace(",",".").Split(new char[] { '.'});
   for (int i = 0; i < numarry.Length; i++)
   {
    if (numarry[i].Length % 4 != 0)
    {
     MessageBox.Show("输入的数值不对,必须是四个一组!", "警告!");
    }
    try
    {
     codenum= System.Convert.ToInt32(numarry[i].ToString());
    }
    catch (System.Exception e)
    {
     MessageBox.Show("请输入数字:"+e.Message, "警告!");
    }
   }
   try
   {   
    for (int i = 0; i < numarry.Length; i++)
    {
     
     byte[] characterbyte = new byte[2];
     
     int lowcode = System.Convert.ToInt32(numarry[i].Substring(0, 2))+160;
     int hightcode = System.Convert.ToInt32(numarry[i].Substring(2, 2))+160;
     
     characterbyte[0] = System.Convert.ToByte(lowcode.ToString(),10);
     characterbyte[1] = System.Convert.ToByte(hightcode.ToString(),10);
     //characterbyte[0] = System.Convert.ToByte(lowcode, 16);
     //characterbyte[1] = System.Convert.ToByte(hightcode, 16);
     Encoding gb =System.Text.Encoding.GetEncoding("GB2312");
     
     character += gb.GetString(characterbyte);
     //character = System.Text.Encoding.ASCII.GetString(characterbyte);
     //character += character;
    }
           
   }
   catch (System.Exception e)
   {
    MessageBox.Show("错误!"+e.Message, "警告!!!!");
   }
   return character;
  }
  private void textBox_InputCharacter_TextChanged(object sender, System.EventArgs e)
  {
   this.richTextBox_Character.Text = this.CharacterToSmallCharacterNum(this.comboBox_Input.Text.Trim().ToLower());
  }
  private void comboBox_Input_TextChanged(object sender, System.EventArgs e)
  {
   this.richTextBox_Character.Text = this.CharacterToSmallCharacterNum(this.comboBox_Input.Text.Trim().TrimEnd().ToLower());
  }
  private void comboBox_Input_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
  {
   if(e.KeyCode.ToString() == Keys.Enter.ToString())
   {
    if(this.comboBox_Input.Text.Trim() !="")
    {
     bool intsert = false ;
     if(comboBox_Input.Items.Count == 0)
     {
      comboBox_Input.Items.Add(this.comboBox_Input.Text.Trim());
     }
     else
     {
      foreach(Object ob in comboBox_Input.Items)
      { 
       if(ob.ToString().Trim() !=comboBox_Input.Text.ToString().Trim())
       {
        intsert = true ;
       }
      }
      if(intsert)
      {
       comboBox_Input.Items.Add(this.comboBox_Input.Text.Trim());
      }
     }
    }
   }
  }
  private void comboBox_Input_SelectedIndexChanged(object sender, System.EventArgs e)
  {
   this.richTextBox_Character.Text = this.CharacterToSmallCharacterNum(this.comboBox_Input.Text.Trim().ToLower());
  }
  private void button_Character_Click(object sender, System.EventArgs e)
  {
   this.textBox_signe.Text = "你要查找的汉字是 :";
   this.richTextBox_Character.Text = NumTOCharacter(this.comboBox_Input.Text.Trim());
  }
  
 }
}

11月30日

最近做了自己的一个总结,志在激励自己要好好加油!

巧巧给我的总结:
1. 对某事一感兴趣就停不下手,你事情不做完会通宵把它做掉[优点]做事情没有时间观念[缺点];
2. 要学着白天专心点【缺点】
3. 当然是对我好拉 ;
4. 不吃零食,勤俭节约,不会乱花钱
5. 孝敬父母,理解家庭困难,心疼父母操劳
6. 敢于承认自己的能力,
7. 要相信自己能行的哦 【没有信心】
8. 做事情没有层次。没有条理,不分主次;
9. 可以和同事和睦相处 ;
10.一起做事不怕吃亏,对那些不好做事的可以忍在心理,宽努他的愚蠢烂托行为,为大局着想
11.合作时尽自己的力去做,没有偷懒行为,别人有问题时热心帮忙。
12. 不会高傲自大,瞧不起他人
13.太色了。
14.还是的太色了,对女孩子什麽事都好奇.
15.要注意公共场合哦。
16.学会对我发脾气了;
17。理想远大,但太大拉,要切合实际 [呵呵,那个男人没有远大的理想。。。这个。。一半对一半吧]
18。不到最后时刻永不放弃,百折不挠;
19. 有责任感,但不要把所有事都扛到自己头上,还有我呢[这个小鬼。。]
20. 重视家庭
宛刚给我的总结:
1.毅力
2.重构的勇气(敢于打破);
3.学习意识很强,危机意识强;
4.团队合作意识强(很快适应别人的代码,并快速实现调用);
5.不会眼高手底(比如说网站的硬件维护,给机子装系统等,这些我都没去搞) ;

这个是测试记忆力的结论:
  你的记性不好也不坏,真是“一目十行,过目即忘”!但是偏偏出丑的事儿你忘不了,真难为
情哦!另,你的记忆力有一项特别敏感之处,就是对人的相貌记得特别清楚。
          我的想法: 还好。基本上正确吧 。但是好像对人的相貌记忆好像不是特别清楚吧。。。我
很多时候就不太记得人家长的什么样子。
这个是对于和人的亲密关系的测试结果:
 任何人也读过寓言故事,大盗总爱将宝藏藏于大树下,而你这样做就等于打算把宝藏分给别人
似的。 对于伴侣来说,你的举动非常容易掌握;什么爱吃巨无霸配芥茉酱,爱叫椰香珍珠奶茶加胚芽,
你早已对他(她)说过。在他(她)面前,你已没有半点私隐。 除了生活小节,你亦喜欢不知不觉地向他(
她)炫耀自己的优点,都会成为你跟伴侣的话题。
        我的想法:看来的确是这样。虽然和天蝎座的分析不对头。但是总的来说是这样的。
人际交往能力的测试结果:
     也许是由于羞怯或少言寡语的性格,你没有表现出足够的自信。当你应该以轻松热情的面貌出现时
,你却常常显得过于局促不安。
我现在最担心的事情测试结果:
 电话的铃声,正代表你的事业。迫在眉睫的要事正待你去解决,才会让你听到铃声,你此刻不
是正为着那些燃眉之急的计划草案尚无法提出而困扰着吗?换句话说,你最想忘掉的,便是手上的工作
了。
  我的想法:呵呵 我现在的事业正在面对最夸张的挑战,四级没有过。。毕业有问题哦。。。
但是我现在想写程序。。马上提升自己。。。。。因为宛刚已经这样做了。。。
 消费心理的测试结果:
    你认为赚钱的目的就是消费,所以只要渴望拥有的东西均不会计金额的高低将它买下,实在蛮浪费
的,这或许也是你的虚荣心作崇吧!如果不节制一点,等到支出大于收入时,想要收敛就很难了。
  内心性格测试结果[1]:
   你对自己很有爱心,当现实的力量大过内心的标准时,你通常很快地屈服,避免自己内外受煎熬,这
种人做事的确是圆滑了些,会在这个现实的社会里,得到一片生存的天地。
 我的想法:虽然我不认为自己对自己有爱心。。因为我经常虐待自己[通宵。。不做身体锻炼,
不能准时喝茶。。。家规来着的]
 企图心测试结果:
   这类人竞争性不强,但并不是没有企图心,很少欣羡别人的成就,也不追逐别人眼中所谓的成就。所
以不管别人要的是什么,在人生的跑道上,他一直知道自己要的到底是什么,一步步向著自我追求的目
标前进.
       我的想法: 这个是娃娃测试的结果。。我没有娃娃。。。这个大概不准吧。不过我现在自己都
不太明白自己要什么。。。不过好想自己成为英雄一级的人物。。

  我的职业取向结果和分析:
 你的艺术取向得分为18分;研究取向得分为26分
 艺术取向:6-12分为较低,13-24分为中等,25-30分为较高;
 研究取向:6-12分为较低,13-22分为中等,23-30分为较高;
   艺术取向的个体喜欢艺术性工作,如音乐、舞蹈、歌唱等。这种取向类型的人往往具有某些艺术技能
,喜欢创造性的工作,富于想象力。这类人通常喜欢同观念而不是事务打交道。他们较开放、好想象、
独立、有创造性。如果他们没有成为艺术家,仍然能够选择那些能发挥其特长的工作。
   研究取向的个体喜欢各种研究性工作,如实验室研究人员、医师、产品检查员等。这类人通常具有较
高的数学和科学研究能力,喜欢独立工作,喜欢解决问题,喜欢通观念而不是同仁或事务打交道。他们
逻辑性强、好奇、聪明、仔细、独立、安详、俭朴。
       我的想法:还好我是研究型号的人。。。不过可能从小就受到音乐的熏陶就使自己的艺术趋向不
低吧。
 
 我的潜意识中自己最缺乏的是:经济能力
  我的想法:呵呵。。这个。。。的确。。我妈妈一问起我有没有钱的时候,我最恼火了。看来就是这
 
 
11月11日

选择什么样的DOCTYPE

前言

大家好!这个系列文章是按阿捷自己制作这个站点的过程编写的。之前阿捷也一直没有制作过一个真正符合web标准的网站。现在边参考国外资料边制作,同时把过程中的心得和经验记录下来,希望对大家有点帮助。好了,让我们开始吧

第一天

开始制作符合标准的站点,第一件事情就是声明符合自己需要的DOCTYPE。

查看本站首页原代码,可以看到第一行就是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

打开一些符合标准的站点,例如著名web设计软件开发商Macromedia,设计大师Zeldman的个人网站,会发现同样的代码。而另一些符合标准的站点(例如k10k.net)的代码则如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

那么这些代码有什么含义?一定要放置吗?

什么是DOCTYPE

上面这些代码我们称做DOCTYPE声明。DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本。

其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。

要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

XHTML 1.0 提供了三种DTD声明可供选择:

  • 过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  • 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如<br>。完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

  • 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD。完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

我们选择什么样的DOCTYPE

理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择(包括本站,使用的也是过渡型DTD)。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。

注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。

打个比方:人体模特换衣服。模特就好比数据,衣服则是表现形式,模特和衣服是分离的,这样你就可以随意换衣服。而原来HTML4中,数据和表现是混杂在一起的,要一次性换个表现形式非常困难。呵呵,有点抽象了,这个概念需要我们在应用过程中逐步领会。

补充

DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。

 

 

这个不是我写的

什么是名字空间

DOCTYPE声明好以后,接下来的代码是:

<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">

通常我们HTML4.0的代码只是<html>,这里的"xmlns"是什么呢?

这个"xmlns"是XHTML namespace的缩写,叫做"名字空间"声明。名字空间是什么作用呢?阿捷自己的理解是:

由于xml允许你自己定义自己的标识,你定义的标识和其他人定义的标识有可能相同,但表示不同的意义。当文件交换或者共享的时候就容易产生错误。为了避免这种错误发生,XML采用名字空间声明,允许你通过一个网址指向来识别你的标识。例如:

小王和小李都定义了一个<book>标识,如果小王的名字空间是"http://www.xiaowang.com",小李的名字空间是"http://www.xiaoli.com",那么当两个文档交换数据时,也不会混淆<book>标识,因为它属于不同的名字空间。

更通俗的解释是:名字空间就是给文档做一个标记,告诉别人,这个文档是属于谁的。只不过这个"谁"用了一个网址来代替。

XHTML是HTML向XML过渡的标识语言,它需要符合XML文档规则,因此也需要定义名字空间。又因为XHTML1.0不能自定义标识,所以它的名字空间都相同,就是"http://www.w3.org/1999/xhtml"。如果你还不太理解也不要紧,目前阶段我们只要照抄代码就可以了。

后面的lang="gb2312",指定你的文档用简体中文。

定义语言编码

定义你的语言编码,类似这样:<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

为了被浏览器正确解释和通过W3C代码校验,所有的XHTML文档都必须声明它们所使用的编码语言,我们一般使用gb2312(简体中文),制作多国语言页面也有可能用Unicode、ISO-8859-1等,根据你的需要定义。

通常这样定义就可以了。但是要补充说明的是,XML文档并不是这样定义语言编码的,XML的定义方式如下:

<?xml version="1.0" encoding="gb2312"?>

你在Macromedia.com的首页代码第一行就可以看见类似的语句,这也是W3C推荐使用的定义方法。那为什么我们不直接采用这种方法呢?原因是一些浏览器对标准的支持不完善,不能正确理解这样的定义方法,比如IE6/windows。所以在目前过渡方案下,我们依然推荐使用meta方式。当然,你可以两种方法都写。

看本站源代码,你会发现语言编码定义的地方还多一句:

<meta http-equiv="Content-Language" content="gb2312" />

这是针对老版本浏览器写的,以保证各种浏览器都能正确解释页面。

注意:在上面声明语句的最后,你看到有一个斜杠"/",这和我们以前的HTML4.0的代码写法不同。原因是XHTML语法规则要求所有的标识都必须有开始和结束。例如<body>和</body>、<p>和</p>等,对于不成对的标识,要求在标识最后加一个空格,然后跟一个"/"。例如<br>写成<br />、<img>写成<img />,加空格的原因是避免代码连在一起浏览器不识别。

调用样式表

用web标准设计网站,过渡的方法主要是采用XHTML+CSS,css样式表是必不可少的。这就要求所有网页设计师必须熟练掌握CSS,如果你以前不常用,那么现在就开始学习吧。要制作符合web标准的网站,不懂CSS是设计不出漂亮的页面的。

事实上,所有表现的地方都需要用CSS来实现。我们以前都习惯用table来定位和布局,现在要改用DIV来定位和布局。这是思维方式的变化,一开始有些不习惯。呵呵,任何变革都会有阻力的,为了享受标准带来的"益处",放弃一些老的传统做法是值得的。

外部调用样式表

在以前,我们通常采用2种方法使用样式表:
  • 页面内嵌法:就是将样式表直接写在页面代码的head区。类似这样:
<style type="text/css"> <!-- body { background : white ; color : black ; } --> </style>
  • 外部调用法:将样式表写在一个独立的.css文件中,然后在页面head区用类似以下代码调用。
<link rel="stylesheet" rev="stylesheet" href="css/style.css" type="text/css" media="all" />

在符合web标准的设计中,我们使用外部调用法,好处不言而喻,你可以不修改页面只修改.css文件而改变页面的样式。如果所有页面都调用同一个样式表文件,那么改一个样式表文件,可以改变所有文件的样式。

双表法调用样式表

查看某些符合标准站点的原代码,你可能看到,在调用样式表的地方有如下2句:

<link rel="stylesheet" rev="stylesheet" href="css/style.css" type="text/css" media="all" /> <style type="text/css" media="all">@import url( css/style01.css );</style>

为什么要写两次呢?

实际上一般情况下用外联法调用(就是第一句)就足够了。我这里使用双表调用只是一种示例。其中的"@import"命令用于输入样式表。而"@import"命令在netscape 4.0版本浏览器是无效的。也就是说,当你希望某些效果在netscape 4.0浏览器中隐藏,在4.0以上或其它浏览器中又显示的时候,你可以采用"@import"命令方法调用样式表。

谈论C#打造自己的文件浏览器

 

引用

C#打造自己的文件浏览器

C#的功能十分强大,用它可以轻松地做出属于自己的文件浏览器。下面简单地介绍一下文件浏览器的大致实现过程。其中涉及的有关这些控件的具体用法可参见C#的联机帮助。

你需要用到几个控件:

TreeView(用于显示显示目录树);

ListView(用于显示文件和目录列表);

Splitter(用于允许用户调整TreeView和ListView的大小);

其它的如:MainMenu,ToolBar,StatusBar,ImageList等等就看你的实际需要了。

首先,新建一个C#项目(Windows应用程序),命名为MyFileView,将窗口命名为mainForm,调整主窗口大小(Size)。添加MainMenu,ToolBar,StatusBar,ImageList等控件。

然后,添加TreeView控件,命名为treeView,Dock属性设为Left,再添加Splitter控件,同样将Dock属性设为Left。最后添加ListView控件,命名为listView,Dock属性设为Fill。

 

界面做好了,那么怎样才能在这个界面里显示文件夹和文件呢?这需要我们添加代码来实现。

首先引用以下名字空间:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.IO ;

using System .Runtime .InteropServices ;

在mainForm_Load事件中添加以下代码,用于在treeView控件中显示目录树:

private void mainForm_Load(object sender, System.EventArgs e)

//获取逻辑驱动器

string[] LogicDrives=System.IO .Directory .GetLogicalDrives();

TreeNode[] cRoot =new TreeNode[LogicDrives.Length];

for (int i=0;i< LogicDrives.Length ;i++)

{

TreeNode drivesNode=new TreeNode(LogicDrives[i]);

treeView.Nodes .Add (drivesNode);

if (LogicDrives[i]!="A:\\" && LogicDrives[i]!="B:\\"

)

getSubNode(drivesNode,true);

}

}

其中,getSubNode为一方法,用于获取子目录,以创建目录树节点,参数:PathName为获取的子目录在此节点下创建子节点,参数isEnd:结束标志,true则结束。

private void getSubNode(TreeNode PathName,bool isEnd)

{

if(!isEnd)

return; //exit this

TreeNode curNode;

DirectoryInfo[] subDir;

DirectoryInfo curDir=new DirectoryInfo (PathName.FullPath);

try

{

subDir=curDir.GetDirectories();

}

catch{}

foreach(DirectoryInfo d in subDir)

{

curNode=new TreeNode(d.Name);

PathName.Nodes .Add (curNode);

getSubNode(curNode,false);

}

}

当鼠标单击目录节点左边的+号时,节点将展开,此时,应在AfterExpand事件中加入以下代码,以获取此目录下的子目录节点:

private void treeView_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs

e)

{

try

{

foreach(TreeNode tn in e.Node .Nodes )

{

if (!tn.IsExpanded)

getSubNode(tn,true);

}

}

catch{;}

}

当鼠标单击选中目录节点时,右边的listView控件应显示此目录下的文件和目录,代码如下:

private void treeView_AfterSelect(object sender,System.Windows.Forms.TreeViewEventArgs

e)

{

listView.Items.Clear();

DirectoryInfo selDir=new DirectoryInfo(e.Node.FullPath );

DirectoryInfo[] listDir;

FileInfo[] listFile;

try

{

listDir=selDir.GetDirectories();

listFile=selDir.GetFiles();

}

catch{}

foreach (DirectoryInfo d in listDir)

listView.Items .Add (d.Name,6);

foreach (FileInfo d in listFile)

listView.Items .Add (d.Name);

}

至此,一个简单的文件浏览器就做成了,当然,它还很初级,甚至不能用它打开一个文件,加另外,它也不能显示文件和目录的图标,没有进行错误处理,没有进行安全控制……它能给你的只是一个思路。

head区的其他设置

些技巧主要讲meta标签设置的,其实与符合web标准关系不大,只要注意在最后加"/"关闭标签就可以,但是既然是入门教程,就写得详细一点吧。

收藏夹小图标

如果你将本站加入收藏夹,可以看到在收藏夹网址之前的IE图标变成了本站特别的图标收藏夹小图标。要实现这样效果很简单,首先制作一个16x16的icon图标,命名为favicon.ico,放在根目录下。然后将下面的代码嵌入head区:

<link rel="icon" href="/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />

为搜索引擎准备的内容

代码如下,替换成你自己站点的内容就可以:

  • 允许搜索机器人搜索站内所有链接。如果你想某些页面不被搜索,推荐采用robots.txt方法
<meta content="all" name="robots" />
  • 设置站点作者信息
<meta name="author" content="ajie@netease.com,阿捷" />
  • 设置站点版权信息
<meta name="Copyright" content="www.w3cn.org,自由版权,任意转载" />
  • 站点的简要介绍(推荐)
<meta name="description" content="新网页设计师。web标准的教程站点,推动web标准在中国的应用" />
  • 站点的关键词(推荐)
<meta content="designing, with, web, standards, xhtml, css, graphic, design, layout, usability, ccessibility, w3c, w3, w3cn, ajie" name="keywords" />

先介绍这么多。补充说明,前面花了5节都是讲head区的代码,实际页面内容还一字未提,呵呵,不要急,其实head区是非常重要的,看一个页面的head的代码就可以知道设计师是否够专业。

XHTML代码规范

在开始正式内容制作之前,我们必须先了解一下web标准有关代码的规范。了解这些规范可以帮助你少走弯路,尽快通过代码校验。

1.所有的标记都必须要有一个相应的结束标记

以前在HTML中,你可以打开许多标签,例如<p>和<li>而不一定写对应的</p>和</li>来关闭它们。但在XHTML中这是不合法的。XHTML要求有严谨的结构,所有标签必须关闭。如果是单独不成对的标签,在标签最后加一个"/"来关闭它。例如:

<br /><img height="80" alt="网页设计师" src="../images/logo_w3cn_200x80.gif" width="200" />

2.所有标签的元素和属性的名字都必须使用小写

与HTML不一样,XHTML对大小写是敏感的,<title>和<TITLE>是不同的标签。XHTML要求所有的标签和属性的名字都必须使用小写。例如:<BODY>必须写成<body> 。大小写夹杂也是不被认可的,通常dreamweaver自动生成的属性名字"onMouseOver"也必须修改成"onmouseover"。

3.所有的XML标记都必须合理嵌套

同样因为XHTML要求有严谨的结构,因此所有的嵌套都必须按顺序,以前我们这样写的代码:

<p><b></p>/b>

必须修改为:

<p><b></b>/p>

就是说,一层一层的嵌套必须是严格对称。

4.所有的属性必须用引号""括起来

在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。例如:

<height=80>

必须修改为:

<height="80">

特殊情况,你需要在属性值里使用双引号,你可以用",单引号可以使用&apos;,例如:

<alt="say&apos;hello&apos;">

5.把所有<和&特殊符号用编码表示

  • 任何小于号(<),不是标签的一部分,都必须被编码为& l t ;
  • 任何大于号(>),不是标签的一部分,都必须被编码为& g t ;
  • 任何与号(&),不是实体的一部分的,都必须被编码为& a m p;

注:以上字符之间无空格。

6.给所有属性赋一个值

XHTML规定所有属性都必须有一个值,没有值的就重复本身。例如:

<td nowrap> <input type="checkbox" name="shirt" value="medium" checked>

必须修改为:

<td nowrap="nowrap"> <input type="checkbox" name="shirt" value="medium" checked="checked">

7.不要在注释内容中使“--”

“--”只能发生在XHTML注释的开头和结束,也就是说,在内容中它们不再有效。例如下面的代码是无效的:

<!--这里是注释-----------这里是注释-->

用等号或者空格替换内部的虚线。

<!--这里是注释============这里是注释-->

以上这些规范有的看上去比较奇怪,但这一切都是为了使我们的代码有一个统一、唯一的标准,便于以后的数据再利用。