这几天有点小活,要求是ASP.NET的,虽然我不怎么看好ASP.NET,但是人家要求了我也就照做吧。
最复杂的部分是一个TreeView。出于兼容性和简单性考虑没有用ASP.NET的TreeView控件,而是参考一篇文章自行写了一个出来。

[singlepic=18460]

技术指标如下:

  • 实现:Div+CSS+JavaScript+ASP.NET(C#)
  • 功能:可以实现无限级的TreeNode
  • 标准:在IE 7和Firefox 3.1下显示效果相同,兼容XHTML 1.0 Strict最严格的网页标准

效果如左图所示。最后一个函数可能会因为超宽看不到全部,具体请参照文章附件中的源代码。
附件下载:http://download.nocoo.us/Download/Archive/TreeViewCode.rar

TreeNode.cs

[code=’c#’]
///

/// TreeView结点类
///

public class TreeNode
{
private string name;
private string href;
private List subNodes = new List();

///

/// 结点名
///

public string Name { get { return name; } }
///

/// 结点链接
///

public string Href { get { return href; } }
///

/// 下级结点个数
///

public int Count { get { return this.subNodes.Count; } }
///

/// 获取或者设置下级结点
///

/// 序号 /// 下级结点
public TreeNode this[int index]
{
get { return subNodes[index]; }
set { subNodes[index] = value; }
}

///

/// 构造函数
///

/// 结点名 public TreeNode(string name)
{
this.name = name;
this.href = null;
}

///

/// 构造函数
///

/// 结点名 /// /// 结点链接 public TreeNode(string name, string href)
{
this.name = name;
this.href = href;
}

///

/// 添加下级结点
///

/// 新结点 public void Add(TreeNode node)
{
subNodes.Add(node);
}
}
[/code]

TreeView.cs

[code=’c#’]
///

/// TreeView
///

public class TreeView
{
private List nodes = new List();

///

/// 填充测试用数据
///

public void FillTestData()
{
TreeNode node1 = new TreeNode(“中国”, “#”);
TreeNode node11 = new TreeNode(“华北地区”, “#”);
TreeNode node111 = new TreeNode(“河南省”, “#”);
TreeNode node112 = new TreeNode(“河北省”, “#”);
TreeNode node113 = new TreeNode(“山东省”, “#”);
TreeNode node1131 = new TreeNode(“青岛市”, “#”);
TreeNode node1132 = new TreeNode(“济南市”, “#”);
TreeNode node11321 = new TreeNode(“市中区”, “#”);
TreeNode node11322 = new TreeNode(“历下区”, “#”);
TreeNode node11323 = new TreeNode(“槐荫区”, “#”);
TreeNode node11324 = new TreeNode(“天桥区”, “#”);
TreeNode node11325 = new TreeNode(“长清区”, “#”);
TreeNode node1133 = new TreeNode(“菏泽市”, “#”);
TreeNode node1134 = new TreeNode(“济宁市”, “#”);
TreeNode node1135 = new TreeNode(“德州市”, “#”);
TreeNode node12 = new TreeNode(“东北地区”, “#”);
TreeNode node13 = new TreeNode(“西北地区”, “#”);
TreeNode node14 = new TreeNode(“华东地区”, “#”);
TreeNode node15 = new TreeNode(“西南地区”, “#”);
TreeNode node16 = new TreeNode(“华南地区”, “#”);
TreeNode node17 = new TreeNode(“华中地区”, “#”);
TreeNode node18 = new TreeNode(“港澳台地区”, “#”);

node1132.Add(node11321);
node1132.Add(node11322);
node1132.Add(node11323);
node1132.Add(node11324);
node1132.Add(node11325);

node113.Add(node1131);
node113.Add(node1132);
node113.Add(node1133);
node113.Add(node1134);
node113.Add(node1135);

node11.Add(node111);
node11.Add(node112);
node11.Add(node113);

node1.Add(node11);
node1.Add(node12);
node1.Add(node13);
node1.Add(node14);
node1.Add(node15);
node1.Add(node16);
node1.Add(node17);
node1.Add(node18);

nodes.Add(node1);
nodes.Add(new TreeNode(“俄罗斯”, “”));
nodes.Add(new TreeNode(“美国”));
nodes.Add(new TreeNode(“韩国”));
nodes.Add(new TreeNode(“澳大利亚”));
nodes.Add(new TreeNode(“印度”, “”));
nodes.Add(new TreeNode(“加拿大”, “”));
}

///

/// 获取TreeView的html代码
///

///
public string GetHtmlString()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(“

    “);
    for (int i = 0; i < nodes.Count; i++) { sb.AppendLine(GetNodeHtml(nodes[i], 1, (i + 1).ToString())); } sb.AppendLine("

“);
return sb.ToString();
}

private string GetNodeHtml(TreeNode thisNode, int depth, string id)
{
StringBuilder sb = new StringBuilder();
bool hasSub = (thisNode.Count > 0) ? true : false;
sb.AppendLine(string.Format(“

  • “, depth, id));
    sb.AppendLine(string.Format(

    {3}

    “,
    hasSub ? “closedir” : “nodir”,
    depth,
    id,
    (thisNode.Href == null || thisNode.Href.Equals(“”)) ? thisNode.Name : string.Format(“{1}“, thisNode.Href, thisNode.Name)
    ));
    if (hasSub)
    {
    sb.AppendLine(string.Format(“

    “, depth, id));
    sb.AppendLine(“

      “);
      for (int i = 0; i < thisNode.Count; i++) { sb.AppendLine(GetNodeHtml(thisNode[i], depth + 1, string.Format("{0}_{1}", id, i + 1))); } sb.AppendLine("

    “);
    sb.AppendLine(“

    “);
    }
    sb.AppendLine(“

  • “);
    return sb.ToString();
    }
    }
    [/code]

    ASP.NET页面调用:

    [code=’c#’]
    <% CMC.TreeView list = new CMC.TreeView(); list.FillTestData(); Response.Write(list.GetHtmlString()); %>
    [/code]

    ASP.NET页面JavaScript:

    [code=’js’]
    defaultNodeState();

    function defaultNodeState()
    {
    var nodeState = getCookie(“nodeState”);
    if(nodeState == null)
    {
    nodeState = “,|,|,”;
    setCookie(“nodeState”,nodeState);
    }
    var layer = nodeState.split(‘|’);
    for(var i=0;i

    这种情况:
    一组照片,或者MP3歌曲,知道它们的路径,保存在一个数组中。现在想随机播放之。要求,每首歌出现的概率相等,且播放完全部之前不会重复,并且保证顺序可以前后无限快进或者快倒。
    [code=’c#’]
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;

    namespace RandomStringArray
    {
    class Program
    {
    private static int count = 50;

    static void Main(string[] args)
    {
    string[] originalArray = GetStringArray();
    string[] randomArray = new string[originalArray.Length];

    SortedList list = new SortedList();
    for (int i = 0; i < originalArray.Length; i++) { list.Add(originalArray[i].GetHashCode(), originalArray[i]); } int index = 0; foreach (KeyValuePair item in list)
    {
    randomArray[index++] = item.Value;
    }

    // Print Result
    Console.WriteLine(“Original:”);
    for (int i = 0; i < originalArray.Length; i++) { Console.WriteLine(string.Format("[{0}]{1}", i, originalArray[i])); } Console.WriteLine("Random:"); for (int i = 0; i < randomArray.Length; i++) { Console.WriteLine(string.Format("[{0}]{1}", i, randomArray[i])); } } ///

    /// Generate a directories list for test
    ///

    /// Directories list
    private static string[] GetStringArray()
    {
    if (!Directory.Exists(“Temp”))
    {
    Directory.CreateDirectory(“Temp”);

    for (int i = 0; i < count; i++) { Directory.CreateDirectory("Temp\\" + Guid.NewGuid().ToString()); } } return Directory.GetDirectories("Temp"); } } } [/code]

    0. 动机

    如果你是一个没什么事情的人,估计这篇文章对你来说一点作用都没,甚至觉得有点无病呻吟。
    如果你是个忽然间陷入忙碌的工作中的人,你可能还没意识到工作和生活可以有一套方法去管理。恭喜你,这篇文章目标就是写给你的。当然这里的方案都是我在使用的方案,很多时候也许对你来说,还存在着更好的方案。(举个例子,我用联通,也许你用移动,那么恭喜你你可以用飞信。飞信是开放API的你知道吗?这种优势,写个程序,也许可以让你的烤面包机给你发SMS呢。)
    如果你和我一样是一个被事情缠住根本无法脱身而不得不做,而且和我一样是一个崇尚高效鄙夷浪费时间的人,看过这篇文章之后,一定会产生共鸣吧。我希望你能够在下面留言,告诉我你的方法,我们共同进步。

    1. 圣经

    s2754540 《时间管理——给系统管理员》,Thomas A. Limoncelli
    这本书是圣经。
    记得第一次读这本书纯属比较懒的一种动机。2008发生了很多事情,在这一年里,我在2月、3月、4月、5月、6月、7月、8月、9月都回家一次。在回家的火车里,读一本书俨然是routine。记得以前拿着Java编程思想啃,也学习过打印出书的某一章读完这样破坏环境的事情。其实拿起这本书的时候我的角色是一个新系统管理员想学点东西,放下这本书的时候是一个激动的我寻找到了知音一晚上没睡着觉满脑子想架一套个人信息管理系统。
    可惜豆瓣没有六颗星。

    2. 信息中心——E-mail

    别告诉我看到这个题目你很惊讶。我也知道很多人一个月都不一定打开一次Email。记得我入职MSRA Intern的第一天,被HR MM(97分!!)领着去见我的Mentor,海东见到我第一件事情是领我到计算机旁边,然后让我先建好工作环境,说,这是Outlook,用你的域帐户登陆。Outlook是你的最重要的工作工具,重于Visual Studio。其实那个时候我已经很重视了Email的作用。

    身份:
    我知道你是个忙人,你一定有很多种身份吧~你也许喜欢注册很多很NB的邮箱,但是注册了就忘记了。其实,Gmail可以管理这样的多重身份,最终效果就是你只需要在一个Gmail里检查邮件就可以,不需要一次性登录到所有的邮箱。那样真的很麻烦,估计这也是某些人远离Email的原因之一。

    [singlepic=18227,600,413]

    解决多重身份问题,使用Gmail的Accounts概念。原理其实很简单,大家都知道Email发件人其实是可以伪造的吧。Gmail其实是在你授权之下伪造发件人地址,使用你指定的发件人。

    Continue reading

    [singlepic=18219]

    [2008年12月05日 08:03] 摄于 [同济大学嘉定校区电子与信息工程学院大楼]

    天气忽然变得好冷。不过早晨还是看到有MM穿裙子…我寒…
    各位保重身体。