经常上CSDN社区论坛的朋友应该知道在CSDN里面结贴的时候会让你给各个回帖的人一定的分值作为报酬。此时我们不能固定TextBox框的个数,因为回帖的人数是不固定的。而且如果将TextBox控件和单一的回帖人关联则会导致后台代码冗余,也不利于维护和扩展吗,显得不灵活不显示。

QQ空间的留言本里面也是类似的情况。当有人给我们留言的时候我们要回复这个留言就点击“回复”就会出现一个TextBox框出来,然后我们填好自己的留言点击“提交”系统就自动提交了我们的留言。一般对这种重复的数据读取我们经常是用Repeater控件来做,而且也能比较灵活得分页,更可贵的是它能够做到动态生成控件。

下面我们就来实现类似QQ留言和回复留言的效果。

<asp:Repeater ID="Rep" runat="server">

                <ItemTemplate>

                    <table border="1" width="100%" cellpadding="0" cellspacing="0">

                        <tr>

                            <td id="Right_img" width="25%" align="center" valign="top" rowspan="3">

                                <br />

                                <%# "<img src=" + "../image/head/" + DataBinder.Eval(Container.DataItem,"HeadImage") + ".gif" + ">" %>

                                <br />

                                <br />

                                <br />

                                <%# DataBinder.Eval(Container.DataItem, "Name") %>

                                <br />

                                <%# DataBinder.Eval(Container.DataItem, "GuessDate") %>

                            </td>

                            <td id="Right_Top" height="22" align="center">

                                留言标题:<%# DataBinder.Eval(Container.DataItem, "Title") %>

                            </td>

                        </tr>

                        <tr>

                            <td valign="top" align="left" style="padding-top:15px;padding-bottom:25px;padding-left:2px;">

                                <br />

                                <%# DataBinder.Eval(Container.DataItem, "Content") %> 

                                <br /> 

                                <br />                         

                                <%# DataBinder.Eval(Container.DataItem, "Reply") %>   

                                <%# DataBinder.Eval(Container.DataItem, "RDate") %>

                                <br />

                                <div id='<%#"Reply" + DataBinder.Eval(Container.DataItem, "ID") %>' style="display:none;">

                                    <p>----------------------------</p>

                                    <asp:TextBox ID="RepInput" runat="server" TextMode="MultiLine" Width="300" Height="70"></asp:TextBox>

                                    <br />

                                    <asp:LinkButton ID="RepButton1" runat="server" CommandArgument= '<%# Eval("id")+","+(Container as RepeaterItem).ItemIndex%>'  OnCommand="RepButton_Click" CommandName="save">提交</asp:LinkButton>

                                    <a href="javascript:;" onclick='HideReply("<%#"Reply"+DataBinder.Eval(Container.DataItem,"ID") %>")' >取消</a>

                                </div>                                    

                            </td>

                        </tr>

                        <tr id="Right_Bottom" valign="middle">

                            <td height="22" valign="middle">

                                <div id="UserInfo">

                                    <img class="im" src="../image/email.gif" alt="Email" height="15" width="15" /><%#"<a href=mailto:"+ DataBinder.Eval(Container.DataItem, "Email") +">电子邮箱</a> "%>

                                    <img class="im" src="../image/home.gif" alt="Email" height="15" width="15" /><%#"<a href=http://"+ DataBinder.Eval(Container.DataItem, "HomePage")+" >个人主页</a>"%>

                                    <img class="im" src="../image/oicq.gif" alt="Email" height="15" width="15" /><%#"<a href= "+ DataBinder.Eval(Container.DataItem, "QQ")+" >QQ</a> "%>

                                    <span id="Master">

                                       <a href="javascript:;" onclick='ShowReply("<%#"Reply"+DataBinder.Eval(Container.DataItem,"ID") %>")'>回复留言</a>                                 

                                       <asp:LinkButton ID="LinkButton2" runat="server" OnClientClick="return confirm('确定要删除这条留言么?');" OnCommand="Del_Click" CommandArgument= '<%# DataBinder.Eval(Container.DataItem,"ID") %>'>删除留言</asp:LinkButton>

                                    </span>

                                </div>

                            </td>

                        </tr>

                    </table>

                </ItemTemplate>

            </asp:Repeater>

 

我们姑且不去深究这段代码,只需要去注意一下红色部分就好。

红色部分是一个隐藏的Div层,里面是一个TextBox控件和一个用于提交回复留言的LinkButton控件。

本来这个层是隐藏的,正常情况下是看不到的。当我们点击下面的超链接“回复留言”的时候这个层就显示出来(相关的js代码忽略)。然后我们在这个层里的TextBox框输入我们的留言,随即点击“提交”控件提交内容。这个时候就有一个问题了:我们是怎么获得Repeater控件里面的控件值的(注意:这个控件是“活的”,是在运行的时候根据客户来输入的,而不是我们定死的内容,如Label控件!)并将这个值写进数据库中相关的表中并且用于区分是对这个留言者的回复?

要解决以上问题就必须了解Repeater控件的运行机制原理。既然是重复得读取记录,那么肯定有用于区分记录的“项值”,因此(Container as RepeaterItem).ItemIndex这个就是因此诞生。对于第一条记录它的只为0,第二条它的值为1,以此类推因此我们就可以用它和我们数据库表中的主键一起传递到后台代码中。

CommandArgument= '<%# Eval("id")+","+(Container as RepeaterItem).ItemIndex%>'的意思很明显,id 就是后台数据库中留言记录唯一的主键值,中间隔一个逗号之后再连接一个项值。这样在后台我们就能够轻松得到这两个主要的值了。

后代相关事件代码如下:

public void RepButton_Click(object sender, CommandEventArgs e)

        {          

            RepText = this.Rep.Items[Convert.ToInt32(e.CommandArgument.ToString().Split(',')[1])].FindControl("RepInput") as TextBox;

                System.Data.OleDb.OleDbConnection con = MengXin.MyCode.DB.CreateConnect();

                System.Data.OleDb.OleDbDataAdapter Ada = new System.Data.OleDb.OleDbDataAdapter("Select * from GuestBook where state = yes and ID = " + e.CommandArgument.ToString().Split(',')[0], con);

                System.Data.OleDb.OleDbCommandBuilder Bui = new System.Data.OleDb.OleDbCommandBuilder(Ada);

                DataSet ds = new DataSet();

                Ada.Fill(ds, "RepGuestBook");

                if (ds.Tables["RepGuestBook"].Rows.Count > 0)

                {

                    ds.Tables["RepGuestBook"].Rows[0]["Reply"] = "----------------------<br />管理员回复:<br /><br /><p style='color:#fcb202'>" + RepText.Text + "</p><br />";

                    ds.Tables["RepGuestBook"].Rows[0]["RDate"] = System.DateTime.Now.ToString();

                    Ada.Update(ds, "RepGuestBook");

                }

                else

                {                 

                    Response.Write("<script language=javascript>alert('无记录!');window.location='Default.aspx';</script>");

 

                }

                con.Close();

                Response.Write("<script language=javascript>window.location='Default.aspx';</script>");

 

           

        }

 

注意事件中红色的部分,RepText是一个TextBox控件,主要是接收客户点击的项中的回复留言的内容。

具体的还需要多多练习实践。如果结合Ajax,实现一下局部刷新就完美实现了QQ留言板的功能了

 

PS:以上代码在XP+IIS5.1+VS2008+IE8+ACCESS测试通过

posted @ 2009-06-03 09:16 梦心 阅读(80) | 评论 (0)编辑

一个经常让开发人员疑惑的问题是母版页是如何处理相对路径的。如果你使用的是静态文字,这一问题不会困扰你。不过,如果你加入了<img>标签或者指向其他资源的HTML标签,问题就可能发生。

当你把母版页和内容页放在不同的目录时,问题就发生了。把母版页和内容页分放到不同的目录,这是大型网站推荐使用的最佳实践。实际上,微软建议你在专门的文件夹里保存所有的母版页。不过,如果你不够小心,使用相对路径时会带来问题。

例如,假设你把母版页放在一个叫做MasterPages的子文件夹里,并在母版页里加入了如下的<img>标签:

假设文件\MasterPages\banner.jpg存在,这看起来是行得通的。甚至在Visual Studio设计环境会出现图片。但是,如果你在另一个子文件夹里创建了一个内容页,路径就会被解释成相对于那个文件夹。如果文件在那里不存在,就会得到 一个破损的链接而看不到图片。更糟的是,如果有一幅具有相同文件名的另外一个图片,你会不经意地得到一幅错误的图片。

这样的问题之所以会发生,是因为<img>标签是普通的HTML。所以,ASP.NET不会接触到它。遗憾的是,当ASP.NET创建 内容页的时候,这个标签就不合适了。相同的问题出现在向其他页面提供相对链接的<a>标签以及用来把母版页链接到样式表 的<link>元素。

要解决这一问题,你可以预先把URL写成相对于内容页面的地址。不过这会带来混淆,限制母版页使用的范围,并且产生在设计环境里不正确显示母版页的负面效应。

另一个快捷的解决方案是把图片标签变成服务器端控件,这样ASP.NET就会修复这个错误:

  

这个解决办法会起作用是因为ASP.NET根据这一信息创建一个HtmlImage服务器控件。这个对象在母版页的Page对象实例化后创建,此时,ASP.NET把所有路径解释为相对于母版页的位置。你可以使用同样的技术来修复<a>标签对其他页面的链接。

你还可以使用根路径语法,并用"~"字符作为URL的开头。例如,下面这个<img>标签毫无歧义地指向网站的MasterPages文件夹中的banner.jpg文件。

遗憾的是,这种语法只对服务器端控件有效。如果你要对普通的HTML产生同样的效果,你需要在链接里包含域名的完整的相对路径。这样的HTML代码难看且不可移植,所以不推荐使用。

今天在解决这个问题的时候另一个问题又出现了,现在我要在母版页引入jquery的文件,按照上面的方法我写成   

<script src="js/jquery.js" type="text/javascript" runat="server"></script>

可是在运行的时候却出错了,说是jquery.js中的第12行的$符号不知道是什么意思,然后我把runat="server"去掉后就又运行成功了,看来是不能加runat="server"这个属性了,可是这样的话我在另一文件夹中套用母版页的时候又会出现上面这个相对路径的错误了,经到CSDN论坛发贴问,解决方法如下:

<script src='<%=ResolveUrl("~/js/jquery.js") %>' type="text/javascript"></script>

第一次知道有ResolveUrl这个方法,还真不错,呵呵...

posted @ 2009-05-12 12:39 梦心 阅读(100) | 评论 (0)编辑

     我相信許多使用 Access 作為資料庫的程式設計師而言,多半曾經遇到煩人的「運作必須使用更新查詢」的問題。坦白說,我實在不認為這道錯誤訊息切合實情,甚至經常會誤導程式設計師。

在大部份時侯,這個問題的源頭根本就是權限的問題。所以說最快、最骯髒的解決方法,就是對於資料庫檔案加上 Everyone 的完全控制權限,十有八九可以立即解決問題。不過另一個問題來了,這對於權限的控管和安全性方面又有極為不良的影響。

Dirty的解決方法,把目錄權限開給everyone房市家 大社區s+i"{F+t)d3d,T

       

         

如果不要那麼 Dirty 的解決問題,各位可以在這個檔案的「安全性」屬性中,檢查是否有 IIS-WPG 這個使用者。如果有,那麼它預設應該已有「讀取及執行」和「讀取」兩個權限。現在請把「寫入」也給它打個勾,那麼或許就可以解決問題了!

那麼,為什麼非得加上「寫入」權限呢?呃,小弟在此無法回答;欲知詳情,請洽微軟。

也順便檢查,本身access資料庫的權限,是否開啟可讀寫

                     

                     

posted @ 2009-05-11 13:00 梦心 阅读(52) | 评论 (0)编辑

在VS2008里面开发完全正常,但是在IIS5.1里面默认网站里面新增一个虚拟目录的制定到这个网页里面的话在浏览器里面http://localhost/查看就是可以显示,但是里面的链接全部不正常。

举例:虚拟目录的名称为meng,那么我们要访问我们的网站就要这样:http://localhost/meng/Default.aspx

这样首页是出来了,但是里面的链接都不是以http://localhost/meng/开头,而是以http://localhost/开头!!也就是说我网站目录里面有一个GuestBook的文件夹存放留言的,里面有一个首页文件Default.aspx  如果要链接上去本来链接是:http://localhost/meng/GuestBook/Default.aspx 的,但实际上链接的地址变为:http://localhost/GuestBook/Default.aspx

这些在VS2008里面调试的时候是很正常的!!!而我的IIS服务器新增虚拟路径去引用别人的网站都是正常的。

PS:我的首页对留言本的链接是这样写的: <a href="/GuestBook/Default.aspx">留言本 </a>

请问哪里有问题了??????

PS:忘记了说明一点了:这些问题只有在用到web.sitemap地图里面才会出现这个情况的!!在VS2008里面就是正常的,但是在IIS虚拟服务器里面就不正常了!
地图XML信息如下:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode url="/Default.aspx" title="首页" description="是网站首页!">
<siteMapNode url="/Me.aspx" title="资讯1" description="哈哈">
<siteMapNode url="" title="资讯详细" description="哈哈">
</siteMapNode>
</siteMapNode>
<siteMapNode url="/Blog/Default.aspx" title="博客" description="">
</siteMapNode>
<siteMapNode url="/GuestBook/Default.aspx" title="留言本" description="留言本首页">
<siteMapNode url="/GuestBook/AddBook.aspx" title="签写留言" description="">
</siteMapNode>
</siteMapNode>
<siteMapNode url="/Photos/Default.aspx" title="相册" description="">
</siteMapNode>
<siteMapNode url="/About.aspx" title="关于我" description="">
</siteMapNode>

</siteMapNode>
</siteMap>

这个导航栏是嵌入到母版页里面去的,而且母版页是放在网站根目录下的Master里面的~~~
各位大侠求助啊!!

posted @ 2009-05-08 09:03 梦心 阅读(63) | 评论 (0)编辑

        ASP.NET标准控件功能强大,虽然在编程方面方便点,后台代码可以任意访问到并操作,但CSS对母版内容页里的标准控件则很难。原因是经过编译之后的页面标准控件的ID都会变为母版页占位符和原ID的合成字符串,已经不是原来的ID值了,此时如果你的CSS是用ID来定位则失效(在没有母版页的普通aspx页面里标准空间的id值经过编译之后不会变化)。这就是为什么VS中查看到的代码和浏览器中看到的不一样的原因了。因此用CSS来定位最好是使用Class或者CssClass来做。

        HTML控件不比ASP.NET标准控件强大,且后台代码直接访问不到。此时我们只需要在HTML控件添加一个run=”server”的属性就可以了,把它转化为服务端的控件,具有编程性。同时HTML控件还没有事件的功能,也就是说你直接用OnClick去关联后台代码的事件是会报错的。但CSS对它却能够定位得很好,无论是用id或者Class去定位。

posted @ 2009-04-22 08:27 梦心 阅读(183) | 评论 (0)编辑

这几天在做ASP.NET网站,后台数据库就用轻便的Access作数据库。我发现Access虽然相对MSSQL简单小巧,不用那么多的设置,但它也不轻松。如果你对它执行SQL语句的操作,万一表名或者字段名使用了它的关键字,那么就会抛出异常,而这些关键字在MSSQL中是很正常的。有时候这会让你苦不堪言。

Access作数据库的一个好处就是它可以随意携带而且不用像MSSQL一样还要附加和配置。但它的优势也是它的劣势,Access作为一种文件如果泄漏了它的地址则很容易就被下载下来,这样网站安全性就无从谈起。

ASP.NET中使用Access数据库其中最让人郁闷的就是数据库地址的指定。在桌面程序中,我们只需要用System.Windows.Forms.Application.StartupPath加数据库相对地址就可以了,而在WEB程序中将是另外一种光景。当然,我们也可以System.Web.HttpContext.Current.Server.MapPath这个Web服务器上指定虚拟路径相应的物理文件路径。但这个东东在Internet信息服务里面变得会很异常。也就是说你在VS2008里面调试的或者在浏览器里面进行调试都没有问题,但到Internet信息服务里面直接浏览网站就会报错,可能这个跟Web服务器网站和虚拟路径不太一样。

一旦你的网站发布了,那么所有的代码文件将被转换为DLL直接存放在bin文件夹里,如果你的数据库存放在网站根目录下的Data文件夹下,那么你要在浏览器中可用就必须这样指定地址:System.Web.HttpContext.Current.Server.MapPath"~\\Data\\Data.mdb"),也就是前面加个“~”。难道说我们所要用到的网站主目录是Bin文件夹?

而无论你怎么变,在Internet信息服务里面都是运行不了的搞笑的是在VS2008里面调试的时候却都能适用,即使你把“~”忘记了。

有谁能告诉为什么呢?我想,我应该去百度一下

posted @ 2009-04-20 08:26 梦心 阅读(134) | 评论 (3)编辑

    现在市面上浏览器无外乎有这么几种:微软的IEMozilla的火狐、苹果Safari谷歌ChromeOpera等。其他诸如遨游、世界之窗、360安全卫士等都是基于IE内核的浏览器,少了IE内核它们全部没用,因此严格来说并不是真正意义上的浏览器。

    有这么一句话很多人都知道:未来的一切都是WEB的。对操作系统的作用越来越被浏览器所淡化,以后的趋势就是人们只要一个浏览器能上网就可以了,所有一切都是在网上进行。如微软的Office办公套件都在努力实现Web化了所以这Web之争实际上就是浏览器之争,谁能夺得浏览器市场谁就能在未来的Web世界占绝对的优势。

    在好几年前的网景和微软的浏览器大战我们应该有所耳闻,这两家浏览器各有各有点,互不相容。后来微软耍了一个小伎俩,将IE和自家的Windows系统捆绑发行,直接把网景给干掉了。

    后来的XP系统让微软的操作系统出尽了风光,而XP下的IE6也让微软的浏览份额一度达到顶峰。这一成绩导致了IE好几年都没有新的版本更新出现,让微软的浏览器“颓废”了很久

      后来出现的火狐虽然在网络上一直吹捧自己说自己是绝对的快速度和安全,但很可惜它的市场份额还是很低。不过,随着火狐浏览器的不断改善,从一只丑小鸭逐渐兑变为天鹅,它的速度被人称赞,它的一些习惯逐渐为人们所接受,火狐的浏览器的市场份额开始增加了起来。这下微软急了,看来不能指望IE6能够称霸天下了。

    与此同时,苹果Safari也开始加入竞争,并以速度著称,几乎可以说它的速度是最快的,而且和苹果的系统绑定了。正在这三家闹得不可开支的时候,谷歌也插入一脚,推出了自家的Chrome浏览器,速度也比IE6快出许多。同时在WEB标准支持方面IE6是最差的,最令人诟病的。

    于是微软不干了,急忙推出了IE7出来争夺领土。虽然IE7相比IE6已经有很大的进步,但很可惜的是它和其他的浏览器还是有很大的差距。随着火狐和苹果浏览器的不断升级,这个差距更加明显。占用系统资源方面IE7还是很臃肿,而且速度也不尽人意,在CSS支持方面IE7也很不如意

    后来微软一咬牙,经过几个测试版的IE8之后终于发布了IE8正式版。但发布了之后也没能让IE的份额下滑的速度减缓。我本人也下载IE8 for XP试用了一下,拿它和火狐3.08繁体中文在个人应用上面做一次对比。

 

    拖动打开链接方面:由于我之前有段时间是用基于IE的遨游浏览器,因此特别欣赏它鼠标拖动链接打开的功能,很遗憾IE8和火狐都不支持。其中火狐中国版一拖动链接会打开百度搜索框,让我更不爽

    标签页方面:IE8每打开一个链接都会打开一个IE8的窗口,感觉很不方便。既然你IE8有了标签的功能了为何还要打开新的窗口?这点火狐做得比较好,比较人性化。不过在IE8选项里面设置其实也可以达到和火狐一样的效果的。

右键菜单方面:IE8做得会比火狐好很多,可能是IE8比较广的兼容性吧,可以保存某个地方的背景图片等等。相比火狐的右键菜单就简陋得可怜,没什么可取之处。不知道火狐有没有这样的插件能够做到。

    下载功能方面:整体而言火狐的内建下载功能会好点。火狐内建的FlashGot插件能够进行断点续传,即使你关闭它也没事,下次要下载的时候只要恢复就行了。而IE8的下载对话框只要你关闭就别想再进行恢复了。不过值得一提的是火狐的FlashGot下载中文的文件时中文会显示乱码,不知道有没有这样的插件支持。

    保存网页方面:IE8让我不爽的是它和IE6一样,一保存整个网页就会锁定整个IE,万一碰到一百年也下载不来的网页则什么也做不了,就只能再新开个网页窗口。相比火狐就人性化多咯,不会冻结整个页面,即使你把页面关掉也没事。不过两者都不支持把整个页面保存为png的图片(遨游和360安全卫士可以做到)。

    占用资源方面:IE8稍逊火狐一点,可能是由于我的电脑菜吧,用IE8打开多个标签网页的时候常常会假死,过一会才恢复,内存占用资源比火狐多点。而火狐这些方面倒还好。

    网银方面:不用说,火狐这方面是天生缺陷,IE8只要稍稍设置一下即可用。

 

    以上只是简单得做了一些对比。但用户关心的或许不是这些,也不是关心那款浏览器安全。他们注重的是操作系统和简便性,搞笑的是用户常常抱怨IE7或者IE8操作不习惯要换回IE6,而火狐就更不用说了,不在大众习惯考虑之列。

 

posted @ 2009-04-18 13:39 梦心 阅读(70) | 评论 (0)编辑

2005年初拥有自己的一台PC开始到现在已经有好几年的网龄了,算上高中时代,至少有6年的网龄。期间用过的软件可谓非常多,好的坏的我都用过。本人特别追求新版本的软件,因为新版本就意味着靓丽的UI界面,高效的运行速度,简洁的代码以及丰富的功能等等。现在回头看看以前用过的软件,总结出了一套自有的软件的优胜劣汰的法则。

 

先拿操作系统来说吧:第一次接触的操作系统是Win98,那时候对电脑根本就不懂,因此对Win98没多少好感,但是死机和蓝屏是常有的事,也不以为意。后来知道买了PC之后计划要安装Win2000,但电脑商给我装了XP,用了之后我对Win2000就没有任何的想法了。所以XP一直沿用了非常的久直到后来的Vista出现了。

宿舍的一个朋友笔记本装了Vista系统,我不时得去用用,发现它虽然UI很靓丽,但很可惜软件兼容性太差,很多游戏不能玩,甚至连微软自家的MSSQL2005都不支持,让我特别的无语。郁闷的是老是会提示你是否用管理员帐户运行程序,整个屏幕暗下来,特别的不爽,后来笔记本就奔回XP的阵营了。期间我也尝试了一下Linux的系统,包括红帽以及红旗。用了之后感觉很多地方都不方便,软件支持比Win系统少得多,很多地方的配置都不懂。还来还听说Ubuntu这系统,好像还可以,但没用过,不过CSDN上面袁萌一直在吹捧它我就不想用了,言过其实。也许我对Win系统比较依赖了吧,所以对Linux系统就不感冒了,不会用纯属个人问题。现在Windows 7就要出来了,特别的期待。感觉它定会给疲软的PC市场一个重磅炸弹!

 

接下去就讲输入法:开始用电脑的时候打字是用智能ABC,觉得这款输入法很不错。但后来经过朋友的推荐我知道了拼音加加这款输入法,立马就喜欢上了,因此智能ABC就被我抛掉,永不续用。这个拼音加加从最初的2.0一直用到后来的5.0版本,一直都在用它,4年多,绝对是忠实的Fans了。但工作之后我就发现拼音加加不能词库随身,而且皮肤和速度方面不太如意,所以我就开始转向了搜狗拼音输入法和谷歌输入法了。两者对比我就把谷歌输入法给毙掉了,感觉它和拼音加加一样,没多少我喜欢的。于是我就开始用搜狗输入法,并开始喜欢上了它的皮肤和词库随身,并有统计输入字数的功能。差不多用了半年吧,偶尔机会我看到了QQ拼音输入法,发现它比搜狗的反应速度快多了,让我特别的惊喜的是QQ拼音输入法有一些地方的输入习惯和拼音加加一样,而且和QQ绑定,特别的方便。于是我又倒戈到QQ拼音输入法的阵营了,沿用至今!

 

再谈谈浏览器:没得说,开始肯定是用IE6.0。这款浏览器让微软的浏览器份额达到顶峰。后来我发现只要点击一个链接它都会弹出一个IE窗口来,感觉很不爽,任务栏IE窗口太多就很乱了。于是我就慢慢喜欢上了基于IE内核的遨游浏览器。这款浏览器有标签功能,特别的人性化,而且还支持拖拽打开链接,从此喜欢上了这款浏览器,一用就是4年多。工作了之后发现这遨游特别占用内存,而且老是假死,可能是自己的电脑烂吧。于是我就转而用360浏览器了,一用发现它速度特别的快,而且和遨游一样支持网页保存为图片的功能。于是我也用了一段时间,遨游被我冷落了。

谷歌发布了自家的浏览器,下载下来一用才知道UI很难看,速度很快倒没体现,各项使用结果都很失望,不符合我的使用习惯。广告上吹的那么好看来都是虚的,这浏览器很一般。再后来我偶尔在广告上看到火狐浏览器速度还不错,于是我下载下来试用,这一试用让我将遨游和360浏览器彻底抛弃了。火狐速度没得说,不卡,而且占资源也少,下载和保存网页的时候不会锁定整个浏览器。但是它还是有一点不爽的地方就是不支持拖拽打开链接的功能,让我特别不满意。慢慢的我也发现偶尔的时候它不是很方便,显得有些笨重。后来微软发布了IE8了,我下载下来试用了一下下,发现没多少变化,除了UI界面,每次点击链接还是会弹出窗口。第一次试用失败,我继续用火狐。后来我偶然在IE的选项里面设置,发现它可以和火狐一样标签的功能。而且相比之下它的资源占用比火狐少得多,这下我又慢慢向IE8靠拢了不过遗憾的是IE浏览器对CSS的支持还不如火狐浏览器。因此现在还是火狐和IE共存。

 

播放器方面:听歌我一直用千千静听,从开始用到现在,从未改变过,这软件就是爽!看电影方面我开始的时候用微软的播放器,发现它支持的流媒体非常少,于是转向豪杰播放器,但用了一段时间就觉得这软件操作不方便,于是就开始用HappyShow这款播放器,主要是喜欢上它简洁的界面和好看的图标,但后来还是被暴风影音给征服了,沿用至今。

 

杀毒软件方面:最最开始的时候是裸奔啦,最后还是装上了金山毒霸杀毒软件,觉得它能免费一个月还不错,于是一直用一直用很久,后来发现我系统老是中毒但是它没任何的反应。卸载掉换瑞星,发现瑞星不感冒,没多少用处。于是就转向了卡巴斯基,并搭配360安全卫士,从此这一组合沿用至今,特别的爽对付病毒!

 

系统优化方面:最开始自然是使用黄金内存了,那是在我内存特别小的时代了,后来加大内存容量之后它就从此在我的电脑里面消失了。我也开始用完美卸载,Win优化大师和超级兔子。我发现Win优化大师挺好用的,功能齐全,很多地方都很人性化。而兔子操作不方便,不习惯就逐渐被我遗弃了。完美卸载优化系统感觉不太专业,也被我毙掉了。Win优化大师用了好久好久,几乎重装系统都会用到它,不过现在也慢慢不用了,觉得没啥好优化的。

 

聊天软件方面:最开始当然是用QQ啦,这个没话说。后来我也尝试了一下新浪UC和百度Hi,但它们都有致命的缺点:用户少,于是都毙掉没话说。不过飞信和MSN我还是有用,因为业务工作上联系有时候要用到MSN,发短信方面肯定要用到飞信,这是QQ不能替代的。

 

压缩软件方面:现在是WinmountWinrar一直共存着。要不是rar很多地方用到我才不会用它来压缩呢。我发现Winmount速度又快而且轻便,对ISO的虚拟光驱文件能够即时虚拟成磁盘,非常的方便。而RAR文件也能即时虚拟成移动硬盘,怎一个爽字了得!

 

以上谈了那么多都只是主要的方面。觉得要获得用户的青睐,要取得市场是需要参考竞争者的作品以及用户的体验情况的

posted @ 2009-04-09 08:35 梦心 阅读(81) | 评论 (0)编辑

这天都在学习c#的反射原理,网上的资料很多。以前听说反射也仅仅是在《大话设计模式》里面直到一点点,了解不深。

开始我还不知道反射到底有什么好处,后来我才知道利用反射我们可以在运行时的时候通过变量来实例化类的实例。可以有效避免了很多的逻辑判断。

以下是我的测试的代码:

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;    //反射需要引用的命名空间

 

namespace 反射原理

{

    class Program

    {       

        static void Main(string[] args)

        {

            string str = Console.ReadLine();

            Icon i = ConFactory.ReturnCon(str);

            i.OutputStr();

            Console.ReadKey();

        }

    }

    class ConFactory

    {

        private static readonly string AssemblyName = "反射原理";    //程序及

        public static Icon ReturnCon(string str)   //str参数是指类名

        {

            string ClassName = AssemblyName + "." + str;

            return (Icon)Assembly.Load(AssemblyName).CreateInstance(ClassName);   //生成特定类的实例,然后转换为接口返回

        }

    }

    interface Icon

    {

        void OutputStr();

    }

    class PersonCon : Icon

    {

        public void OutputStr()

        {

            Console.WriteLine("PersonCon");

        }

    }

    class WorldCon : Icon

    {

        public void OutputStr()

        {

            Console.WriteLine("WorldCon");

        }

    }

}

 

这样我们可以通过读取外部的配置文件来对我们的变量进行赋值,然后通过它来实例化特指的类。这招在多数据库的应用特别有效。我们只需要修改配置文件就可以达到更换数据库的目的。有效降低了类之间的耦合,更灵活,更容易修改

 

posted @ 2009-03-25 10:05 梦心 阅读(92) | 评论 (0)编辑

    今天开始重构我的梦心日记本V2.0版本。因为我发现它运行有点慢,而且占用内存资源达到了170M多,这简直很疯狂。每一次读取日记都要载入一次数据库,太恐怖了,做的无用功太多太多。同时我在窗体的构造函数里面实例化了太多的对象,因此程序开始登入的速度很慢很慢...界面有时候还一闪闪的,可能是.NET 的GDI+部分的缺陷吧,反正我一直没有找到好的方法。
    既然是重构我就可能改一些细节和速度了,同时在资源和效率上做一个平衡,垃圾回收太频繁也不是好事。我不打算新增添加功能进去,感觉再做下去也没多大意思了,当初用XML做数据源是觉得方便,现在数据库大了反而是一种负担了,太麻烦。我越来越体会到XML作为数据交换的意义,小文件还可以,数据大了它速度慢的缺点就出来了!
    晚上就把对象从外部集合到方法里面,就是每做一步操作就实例化一次对象,用完后强制销毁它。同时对数据库的载入采用单例模式,预先载入到内存,然后在数据库读取层就把它引进来,在每次存储数据的时候就再载入一次,这样就可以避免每次都载入数据的情况。
    初步重构让梦心日记本2.0内存占用减小到了50m左右,登录的速度和读取的速度也是大大提高...这不能令我满意!我想我有必要再继续重构下去,因为源码里面肯定还有很多垃圾设计在里面~~~明天继续...

posted @ 2009-03-04 18:29 梦心 阅读(110) | 评论 (0)编辑