Rovan

      一个犁牛半块田,收也凭天,荒也凭天, 清茶淡饭饱三餐,早也香甜,晚也香甜, 布衣得暖胜丝绵,长也可穿,短也可穿, 草舍茅屋有几间,行也安然,待也安然, 雨过天青驾小船,鱼在一边,酒在一边, 夜归儿女话灯前,今也有言,古也有言, 日上三竿我独眠,请是神仙,我是神仙.

首页 新随笔 联系 订阅 管理
概述:如何将ASP.NET用户控件移植为ASP.NET自定义控件
关键字:Asp.net, 用户控件, 自定义控件
本文适用读者:
- 熟悉aspnet,能创建ascx用户控件
- 想创建自定义控件,而又为其庞杂的实现方法而惧的读者
相关下载:
- 本文使用的ascx控件例程:WebFtp060308(pm06).rar
- 本文使用的自定义控件例程:WebFtpControl 1.0.2259_source.rar
术语声明:
Field 类成员变量
Property 类属性
Attribute 类特性
NameSpace 命名空间
Assembly程序集

引言:
asp.net自定义控件使用起来相当方便,但相对ascx用户控件而言,由于其没有可视化编程支持,编写时相当困难。
有没有简单的办法呢?既可以使用ascx可视化编程的优点,又可以发挥自定义控件使用方便的特点。
本文介绍一种解决方案:先设计好ascx控件,再转化为用户控件。以下为具体步骤。


一、创建ascx控件,并调试通过

具体怎么创建ascx用户控件不是本文的重点,跳过啦~
本文使用到的ascx例程可点击此处下载。该例程创建了一个web文件管理的ascx控件。效果如:

二、将ascx移植为自定义控件

(一)新建工程aspnet自定义控件工程,将原ascx类中的所有cs代码都拷贝到自定义控件类中去
(二)修改InitializeComponent()函数以初始化控件。可将其扩充为三个小函数,如:

privatevoidInitializeComponent()
{
CreateComponent();
SetComponentProperty();
SetComponentEvent();
}
其中
1)CreateComponent()函数用于新建出所有使用到的控件,并组织好其层次关系
privatevoidCreateComponent()
{
//create
lblCurrPath=newLabel();
lblUpload
=newLabel();
lblNewFolder
=newLabel();


//nest
Controls.Add(this.lblCurrPath);
Controls.Add(
newHtmlGenericControl("br"));
this.panAdmin.Controls.Add(this.file);

}
2)SetComponentProperty()函数用于设置这些控件的属性,如
privatevoidSetComponentProperty()
{
lblCurrPath.Font.Size
=FontUnit.XLarge;
lblCurrPath.CssClass
="webftp_title";
panInfo.BackColor
=Color.Yellow;
panInfo.Visible
=false;

}
值得注意的是,aspnet提供的组合绑定控件(如DataGrid,DataList..)的属性设置较为复杂,参见附录二
3)SetComponentEvent()函数中设置控件的事件句柄,这个从原有的InitializeComponent函数中拷贝过来就可,如
privatevoidSetComponentEvent()
{
this.btnUpload.Click+=newSystem.EventHandler(this.btnUpload_Click);
this.btnNewFolder.Click+=newSystem.EventHandler(this.btnNewFolder_Click);
this.dg.ItemCommand+=newSystem.Web.UI.WebControls.DataGridCommandEventHandler(this.dg_ItemCommand);
this.Load+=newSystem.EventHandler(this.Page_Load);

}


(三)填充Render()函数用以渲染输出效果。可将其扩展为两个小函数,如

protectedoverridevoidRender(HtmlTextWriteroutput)
{
RenderClientScript(output);
RenderServerComponent(output);
}
其中
1)RenderClientScript函数可用于输出客户端脚本,以及样式style代码,如:
privatevoidRenderClientScript(HtmlTextWriteroutput)
{
output.Write(
" ","A{TEXT-DECORATION:none}","A:hover{TEXT-DECORATION:underline}");

}
2)RenderServerComponent函数用于输出各控件,也可在此添加一些普通html代码的输出,如
privatevoidRenderServerComponent(HtmlTextWriteroutput)
{
this.lblCurrPath.RenderControl(output);
output.Write(
"");
this.panAdmin.RenderControl(output);
this.dg.RenderControl(output);
}


(四)让类实现INamingContainer接口,以避免页面上放置多个该控件而导致子控件id冲突的情况
该接口无任何函数,只需声明实现就可,如

publicclassWebFtp:System.Web.UI.WebControls.WebControl,INamingContainer

只要让类实现该接口,系统将自动实现避免id冲突的方法
具体步骤是将内部控件id名前都附上父控件的id。如在panel(id=pan)中有一个lable(id=lblName),那么label的id会给自动改为pan_lblName;
至此,编译调试成功后,该控件就可以使用了。再加上图片,效果可以是这样:

三、商业标准化自定义控件

第二步完成后,该控件已经可以使用了(如何使用?晕,请看附录五),但其还是一个粗胚,例如没有控件图标,没有设计时外观等。
以下将介绍如何修饰该控件,令其像个标准化的商业控件。
(1)为控件的属性添加例如类别、描述、默认值等Attribute特性
这些特性将影响到控件在属性工具栏中的内容
格式如:[Bindable(true), Category("类别"), Description("描述信息"), DefaultValue("缺省字符串类型值")]
常用的Attribute有:

CategoryAttribute属性类别
BrowsableAttribute属性可否显示
DefaultPropertyAttribute控件的缺省属性
DefaultValueAttribute属性的缺省值
DescriptionAttribute属性的描述信息
ReadOnlyAttribute属性是否只读
BindableAttribute属性是否可绑定
NotifyParentPropertyAttribute修改该属性后是否通知控件

更多的Attribute 请查阅附录三、附录、以及 System.ComponentModel 命名空间
(2)添加工具栏图标
为类添加特性:[ToolboxBitmap(typeof(WebFtp), "Kingsoc.Web.Controls.WebFtp.bmp")]
其中要注意的是:
- 项目的默认命名空间为Kingsoc.Web.Controls
- 图片名称为webftp.bmp,并需要设置其编译选项为“嵌入的资源”
这样工具栏上图标就变成这样咯~:
(3)添加设计时外观支持
为类添加特性:[Designer(typeof(Kingsoc.Web.Controls.WebFtpDesigner))]
其中,类 Kingsoc.Web.Controls.WebFtpDesigner 继承至ControlDesigner,用于绘制设计时的控件外观,如:

usingSystem;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.ComponentModel;
usingSystem.ComponentModel.Design;
usingSystem.Web.UI.Design;
usingSystem.Text;
namespaceKingsoc.Web.Controls
{
publicclassWebFtpDesigner:ControlDesigner
{
publicoverridestringGetDesignTimeHtml()
{
//returnbase.GetDesignTimeHtml();
WebControlctrl=(WebControl)this.Component;
StringBuildersb
=newStringBuilder();
sb.AppendFormat(
"
{2}
",
ctrl.Width,
ctrl.Height,
ctrl.ID);
returnsb.ToString();
}

publicoverrideboolAllowResize
{
get{returntrue;}
}
}
}

这样,设计时控件就有了外观支持:
(嫌太简陋?自己用dreamweaver等设计工具设计,想多好看就多好看!再拷贝html代码到GetDesignTimeHtml()函数内部去)
(4)添加TagPrefix
用于指定将控件从工具栏中拖放到窗体中,自动生成的控件名称前缀(实际上是控件所属的命名空间的别名)
在AssemblyInfo.cs文件中添加:[assembly: TagPrefix("Kingsoc.Web.Controls", "ks")]
这样,添加了该控件的web窗体就会自动生成类似代码

<%@RegisterTagPrefix="ks"Namespace="Kingsoc.Web.Controls"Assembly="Kingsoc.Web.Controls.WebFtp"%>
<ks:WebFtpid="webFtp"runat="server">ks:WebFtp>

(5)设置版权信息
修改AssemblyInfo.cs文件中的以下特性

[assembly:AssemblyTitle("")]
[assembly:AssemblyDescription(
"")]
[assembly:AssemblyConfiguration(
"")]
[assembly:AssemblyCompany(
"Kingsocsoftware")]
[assembly:AssemblyProduct(
"")]
[assembly:AssemblyCopyright(
"")]
[assembly:AssemblyTrademark(
"Kingsoc")]
[assembly:AssemblyCulture(
"")]

(6)将控件添加到GAC中。见附件五
(7)添加控件注册保护。见附件六


--------------------------------------------------------------------
附录
--------------------------------------------------------------------
附录一:自定义控件基类的选择
Control 所有web控件的基类
WebControl 继承至Control类,并添加了例如Width,Height等属性,这是常用且默认的基类,常用于有外观的控件
Component 常用于无外观的控件,例如:数据访问控件
故,对于组合控件,一般使用WebControl作为基类。而对于无界面的控件,一般使用Component就可以了

附录二:用代码创建DataGrid绑定列
(1)普通绑定列

BoundColumncol=newBoundColumn();
col.DataField
="name";
col.ReadOnly
=true;
dg.Columns.Add(col);

(2)模板绑定列

TemplateColumncol=newTemplateColumn();
col.ItemTemplate
=newLinkButtonTemplate("btnName","name","Select");
col.EditItemTemplate
=newTextBoxTemplate("txtName","name");
dg.Columns.Add(col);
其中LinkButtonTemplate和TextBoxTemplate模板代码如下:
//LinkButton模板
publicclassLinkButtonTemplate:ITemplate
{
string_id;
string_bindField;
string_commandName;

publicLinkButtonTemplate(stringid,stringbindField,stringcommandName)
{
_id
=id;
_commandName
=commandName;
_bindField
=bindField;
}
publicvoidInstantiateIn(Controlcontainer)
{
LinkButtonctrl
=newLinkButton();
ctrl.ID
=_id;
ctrl.CommandName
=_commandName;
ctrl.DataBinding
+=newEventHandler(this.BindData);
container.Controls.Add(ctrl);
}
voidBindData(objectsender,System.EventArgse)
{
LinkButtonctrl
=senderasLinkButton;
ctrl.Text
=DataBinder.Eval(ctrl.NamingContainer,"DataItem."+_bindField).ToString();
//或ctrl.Text=((ctrl.NamingContainerasDataGridItem).DataItemasDataRowView)[_bindField].ToString();
}
}

//TextBox模板
publicclassTextBoxTemplate:ITemplate
{
string_id;
string_bindField;

publicTextBoxTemplate(stringid,stringbindField)
{
_id
=id;
_bindField
=bindField;
}
publicvoidInstantiateIn(Controlcontainer)
{
TextBoxctrl
=newTextBox();
ctrl.ID
=_id;
ctrl.DataBinding
+=newEventHandler(this.BindData);
container.Controls.Add(ctrl);
}
voidBindData(objectsender,System.EventArgse)
{
TextBoxctrl
=senderasTextBox;
ctrl.Text
=DataBinder.Eval(ctrl.NamingContainer,"DataItem."+_bindField).ToString();
}
}

 


附录三:自定义控件可用的特性(Attribute)
System.ComponentModel 命名空间提供用于实现组件和控件运行时和设计时行为的类。
此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。
CategoryAttribute
BrowsableAttribute
DefaultPropertyAttribute
DefaultValueAttribute
DescriptionAttribute
ReadOnlyAttribute
NotifyParentPropertyAttribute

AmbientValueAttribute
BindableAttribute
DefaultEventAttribute
DesignerAttribute
DesignerCategoryAttribute
DesignerSerializationVisibilityAttribute
DesignOnlyAttribute
DesignTimeVisibleAttribute
EditorBrowsableAttribute
ImmutableObjectAttribute
InheritanceAttribute
InstallerTypeAttribute
LicenseProviderAttribute
ListBindableAttribute
MergablePropertyAttribute
ParenthesizePropertyNameAttribute
ProvidePropertyAttribute
RecommendedAsConfigurableAttribute
RefreshPropertiesAttribute
RunInstallerAttribute
ToolboxItemAttribute
ToolboxItemFilterAttribute
TypeConverterAttribute


附录四:关于DefaultValue特性
只用于检测用户输入值是否与该值相同,若相同,则不会在asp页面代码中显示出该属性值;反之则显示。实际并没有修改该属性的值!
例如,对于以下语句,AttachTimeStampToUploadedFile 应该等于构造函数中指定的true,而非DefaultValue中提供的false

[DefaultValue(false)]
publicboolAttachTimeStampToUploadedFile
{
get{return_AttachTimeStampToUploadedFile;}
set{_AttachTimeStampToUploadedFile=value;}
}
publicWebFtp()
{
AttachTimeStampToUploadedFile
=true;
}

所以,设置默认值时应该确保与初始化值相同,否则会带来令人困惑的结果。要么干脆就不写。

附录五:如何将自定义控件添加到工具栏
(1)在工具栏面板中点击右键,点击”添加/移除项..."
(2)在弹出的“自定义工具箱”对话框中点击“浏览”按钮,选择自定义控件dll文件
(3)点击确定,关闭对话框。控件图标将显示在工具栏面板上

附录六:将控件添加到GAC中
.Net framework 要求组件必须是 Strong-Name Assembly类型才能部署到GAC(全局程序集缓存Global Assembly Cache)。将组件部署到GAC中的好处就像是以往把Win32 DLL放置到System32目录中的效果,所有程序都可以共享这个组件,而无需再每个程序的目录中都放置一个assembly,这样可以减少部署的文件数和大小。
(1) 首先先生成keyfile,可以用sn.EXE工具(在VS安装目录\SDK\v1.1\Bin下可找到)生成:
sn -k MyCompany.snk
(2) 把keyfile放置到项目根目录下,并在AssemblyInfo.cs中指定这个keyfile,并重新编译
[assembly: AssemblyKeyFile(@"..\..\MyCompany.keys")]
(3) 部署到GAC中:管理工具->Microsoft.Net Framework 1.1 配置->任务"向程序集缓存中添加程序集",指定编译好的dll。也可以直接使用GACUtil:
- 把程序集添加到GAC中: GACUtil /i sample.dll
- 把程序集移出GAC:GACUtil /u sample.dll


附录七:添加控件注册保护
未完成

--------------------------------------------------------------------
参考文章
--------------------------------------------------------------------
《ASP.NET组件设计指南》

posted @ 2006-03-12 16:23 Kevin Cheng 阅读(1578) | 评论 (7) |编辑收藏

2006年3月9日

Kingsoc.Web.Controls.WebFtp

[最后修改日期 2006-03-12, Kevin Cheng]
- /Files/surfsky/WebFtp2/webftp2.3.rar(版本2.3.2263.36853)2006-03-13 20:41
- /Files/surfsky/WebFtp2/webftp2.2.rar(版本2.2.2262.27391)2006-03-12 15:17
- /Files/surfsky/WebFtp/Kingsoc.Web.Controls.WebFtp 1.0.2259.39656.rar(版本1.0.2259.39656,无需图片)2006-03-09
注:2.3为稳定版本,现停止更新。下一版本将为3.0,将提供大图标视图


一、功能

- ASP.NET 1.1 控件,可用以web方式进行文件的上传和下载操作
- 仿windows资源管理器,提供详细信息形式视图
- 支持60多种常用的文件格式图标,并提供xml文件,可任意扩充
- 所有的文件操作都被限定在指定的根目录下,杜绝安全隐患
- 提供文件过滤器,禁止指定扩展名的文件被下载或上传
- 控件所有的操作消息都Post给自身进行处理,非url方式,无泄漏链接地址的危险
- 上传文件可选自动打上时间标签,以避免文件冲突
- 提供只读(可下载)和可编辑两种视图

二、使用该控件可以做什么

- 只需拖拉配置,无需任何代码就可以实现文件下载和管理功能
- 只要附上用户管理模块,很容易就能实现类似多用户网络硬盘的功能
- 本控件是免费的!可任意下载使用,但分发拷贝时请保留本文档信息


三、使用步骤

- 新建ASP.NET工程
- 将webftp目录拷贝到工程目录下(一般放置到images目录内即可)
- 在工具栏中添加项目,选定WebFtp.dll
- 将该控件拖动到窗体上,并设置属性:
Root:根目录路径
ReadOnly:是否只读
DenyFileFilter:文件过滤器
AttachTimeStampToUploadedFile:是否修改上传文件名并自动打上时间标签
ClientFilesFolder:客户端文件目录
ShowRootPath: 是否显示根目录路径
ShowMouseOverEffect: 是否显示鼠标移动背景改变效果
MouseOverColor: 鼠标悬停背景色
- 运行查看效果


四、功能展示











 

posted @ 2006-03-09 22:49 Kevin Cheng 阅读(393) | 评论 (10) |编辑收藏

2005年12月30日

语法高亮控件ICSharpCode.TextEditor来自开源项目SharpDevelop,今天才知道,汗!害我白白花费时间自己编了一个SyntaxTextBox(http://surfsky.cnblogs.com/archive/2005/12/12/295814.html)。不妨发挥拿来主义风格,解剖了它再说!科学研究发现,咳咳,这个控件比较牛了啦~。VisualStudio代码编辑器的功能基本都能实现(包括CodeComplete和tip功能),速度也很快,而且是--开源免费软件!(大家鼓掌:),我想我爱上它了^_^,在此严重推荐一下!


1。以下是该控件的源代码和自己草编的简单使用例程:
ICSharpCode.TextEditor1.1的源代码:【下载
ICSharpCode.TextEditor2.2的源代码:【下载
自己编的使用例程:【下载

2。使用效果:


3。使用该控件的关键句子:

usingICSharpCode.TextEditor;
usingICSharpCode.TextEditor.Gui.CompletionWindow;
usingICSharpCode.TextEditor.Document;
usingICSharpCode.TextEditor.Actions;

protectedICSharpCode.TextEditor.TextEditorControltxtContent;

txtContent.Document.HighlightingStrategy
=HighlightingStrategyFactory.CreateHighlightingStrategy("C#");
txtContent.Encoding
=System.Text.Encoding.Default;

这几句代码若是不写的话,会无法高亮显示代码且汉字会变乱码的。切记切记,阿弥陀佛~

欢迎大家讨论该控件的使用方法~~

posted @ 2005-12-30 21:21 Kevin Cheng 阅读(466) | 评论 (10) |编辑收藏

2005年12月29日

发布数据库连接字符串生成工具(下载),特点:
-支持Oracle, SqlServer, Access, Excel, Text, FoxPro等,并支持数据库插件扩展
-可生成8位DES加密后的数据库连接字符串文件
posted @ 2005-12-29 22:06 Kevin Cheng 阅读(276) | 评论 (2) |编辑收藏

2005年12月21日

O'Reilly总裁提姆-奥莱理谈Web2.0原则

posted @ 2005-12-21 11:10 Kevin Cheng 阅读(16) | 评论 (0) |编辑收藏
2005年度综述:Web 2.0改变互联网
posted @ 2005-12-21 11:08 Kevin Cheng 阅读(30) | 评论 (0) |编辑收藏
无可致否,代码生成器对于程序员的帮助是越来越大。网上出现了一些优秀的代码工具,比较出名的如:CodeSmith, MyGeneration。但我一直没有找到直接将oracle存储过程包转化为c#的工具或模板(有谁知道告知我啊非常感谢!:),故在工作中编写了CodeRobot这个小冬冬(下载),使用起来是比较方便的。以下简要说明一下使用方法:

(1)生成的代码基于OracleBase类(用于数据库开闭及command参数预处理)。请将该类包含进工程。
(2)数据库连接字符串默认保存在工程的config配置文件中,如
<addkey="ConnStr"value="datasource=portal;userid=user;password=pass;"/>
(3)对于字符串类型的输出参数,在生成C#代码类似
AddCmdParamOut(cmd,"P_NAME",OracleType.VarChar,#length#);
的代码,请将#length#改成对应字段的实际长度
(4)对于游标类型的输出参数,在oracle中定义为:
typegenrefcurisrefcursor;
procedureexample(p_idint,p_curoutgenrefcur);
则生成C#代码为:
publicvoidEXAMPLE(longP_ID,outOracleDataReaderP_CUR)
(5)使用代码如:
using(DbExampledb=newDbExample)
{
db.FUNC1(..);
db.FUNC2(..);
}
posted @ 2005-12-21 10:19 Kevin Cheng 阅读(420) | 评论 (11) |编辑收藏

2005年12月19日

最近在学习 Firebird Embeded Database。作为一款单文件型小型数据库,Firebird 具有很多吸引人的特征,比如支持事务、支持存储过程触发器等,而且 Embeded 版本的 Firebird 在 .NET 开发中只需要拷贝两个文件:一个 fbembed.dll (非托管但不需要注册的动态链接库)和一个 ADO.NET Data Provider 的 FirebirdSql.Data.Firebird.dll。这些特征都非常适合那些需要在客户端存储一些数据,但又不想安装数据库(比如MSDE)软件的情形。

据称,在国外,需要使用客户端数据库的情况中,有30%左右的开发者选择Access,有30%的开发者选择MSDE 2000,有30%的开发者选择Embedded Firebird,剩余10%选择其他小型数据库,如SQLite,MySQL 等。

上面所说的Access,MSDE 2000,Embedded Firebird,SQLite等都是可以免费再分发(free redistributable)的数据库。相比而言,MSDE 2000 显著缺点是需要安装,最大优点是和服务器端的 SQL Server 编程模型一致,开发便利。Access的显著缺点是功能较少,不支持事务等常用功能,最大优点是简单、多数开发者都很熟悉,部署也很方便。SQLite支持事务,也是一款单文件数据库,比较不足的是 .NET Data Provider 还不是很成熟。Firebird则同时具有:单文件、部署简单不需安装(只需 XCOPY 两个文件)、支持事务、存储过程、触发器,.NET Data Provider比较稳定成熟等优点。

Firebird 本身有SuperServer和Embedded版本之分,后者只能本机访问,不接受TCP连接。对于开发者而言,从Embedded数据库切换到SuperServer,只需更改数据库连接串中的ServerType值就行。

但是,在你正式决定使用?Firebird 之前,请你注意下面这个 known issue(已知问题): Firebird 数据库文件不能放置在含有中文等字符的路径中。Firebird 的文件名不可以用中文字符,所在路径的任何部分如果含有中文字符,都将无法访问到数据库。举个例子,中文Windows桌面所在的目录一般是“C:\Documents and Settings\用户名\桌面”,如果数据库文件放置在桌面上,就无法访问到。当然,Firebird 内部是可以存储中文字符的,因为它支持 GB2312 和 UNICODE 等字符集。

我已向 Firebird 开发者报告了这个 BUG,希望能早日解决这个 BUG。

需要注意一点,连接串中的 Database 地址如果使用相对路径,请一定注意这个相对路径是相对于 fbembed.dll 所在目录的。

posted @ 2005-12-19 13:05 Kevin Cheng 阅读(36) | 评论 (0) |编辑收藏

2005年12月12日

推进门来,立翔习惯性的向左侧的小间瞄上一眼,门缝中并没有透过光来。
还没回来么...立翔低估了一句,弯腰使劲拽下皮靴,轻轻放在鞋架上。换上拖鞋,起身,往自己的小间瞄去,屋里也是一片漆黑。
上哪去了,都这个时候了,该回来了吧?立翔脑子转了一小圈,不免泛起一点失落。随即不甘的看了看表,10点5分,还早吧,应该没有回来。这丫头,上哪溜达去了。
立翔走进里间,点亮了灯,解下外套往床上一扔,很自然的又将桌上的电脑打了开来。“滴~~嗡~~”冬天电脑启动时噪音特别大,将他小吓了一跳,随后让立翔感觉到更多的忧郁:电脑,电脑,我是喜欢你没错,可是刚从公司加班回来,看得眼镜都疼了,回来还要面对它 ,虽然是花了2500大洋新添的曾令我欢喜无比液晶显示器。没办法,晚上还要帮人上传一下产品图片。
没见她熟悉的姿势,懒洋洋的倚着靠背椅,双脚塞进我的被窝,悠闲的上着网,看的不是肥皂剧就是娱乐片。往常都是这个样子,见我回来了,头侧到一边,笑嘻嘻的说道“你回来了”,然后继续全神的看碟。立翔则放下辎重,坐在阿丹放脚的床沿上,陪她一起休闲一下,一半看碟,一半时间看阿丹。立翔很喜欢这种温馨的感觉,尤其是到了这个既熟悉又陌生的城市以后。
然而,今晚阿丹似乎没有回来。
立翔有些不甘,转身踱回大厅。大厅里很静,仅开了一盏白色的节能灯,立翔再次往门侧的小间望去,门缝里依旧黑漆漆,没有透出一丝光亮。外面寒热的天气已让立翔蹉唆不以,从公交车下来后几乎是小跑回的家,而这张静静关闭的小间门,则把立翔心里唯一的希望和热量都带走了。
立翔哆嗦了一下,不甘而又无奈返回里间,做他该做的事去。门半开闭着,几声似有非有的破寂之声惹他时不时往大厅里瞄瞄,可是该回来的人还是没有回来。立翔不知道自己是怎么了,连上线,打开自己博客写下:
2005年12月12日 我很寂寞,是的,非常的寂寞
posted on 2006-06-20 11:42  Ruxuan  阅读(7575)  评论(0编辑  收藏  举报