2008年7月18日

由于对XML不熟,所以,还是老方法用递归实现。数据库的表:
sh_id int 4 0
sh_name varchar 500 1
sh_parent int 4 1
sh_number int 4 1

Code

nodesDataSet 是一个Session,保存了这张表的所有的节点信息。这个方法,只要知道这个节点,就能绑定它的子节点,以前还看到了有些人定义数据库表,还要节点的层数,我觉得很傻。。。

另外,我用来了哈希表来保存每个已经绑定了的节点。 一开始先添加一个value的值为0的根节点。然后正常的调用这个方法即可。

更深层次的东西:
从这个例子中可以看出,这个哈希表的其实是对象的引用而不是对象的复制。从哈希表中取出父节点并添加子节点可以看出。但是我一直很郁闷的就是,我如果直接对哈希表操作,让某个节点展开什么的。。。都不行。。

posted @ 2008-07-18 16:45 gxpotato 阅读(96) | 评论 (0)编辑


2008年4月7日

最近做的东西很郁闷,当初新手的时候,没有对某些列表控件例如:DropDownList/ListBox/CheckBoxList等这些列表控件进行边界处理.测试的时候,都是有数据的,后来系统初始化,清理所有测试数据交给客户用的时候,就出现了空的DataSet绑定这些控件,而出现空值出错的问题...由于做的东西很多..方法都十几个,,如果一个一个修改的话..累死..还要重新测试一遍..翻阅了MSDN之后,发现了一个方法..老鸟肯定知道的..像我这样的菜鸟就需要了..

这些控件有个.Net 2.0之后添加的属性: AppendDataBoundItems 表示绑定的数据都在预设列表值之后追加.也就是说,我们设定一个默认值,避免出现因为DataSet空值绑定,返回空值而出现的边界问题.

<asp:DropDownList ID="teamList" runat="server" DataTextField="schtms_name" DataValueField="schtms_id" OnSelectedIndexChanged="teamList_SelectedIndexChanged" AutoPostBack="True" AppendDataBoundItems="true">
    <asp:ListItem Value="-1">暂无团队</asp:ListItem>
    </asp:DropDownList>


红色部分就是最加的内容.其他的控件同上.这样一来,绑定的数据都在"<asp:ListItem Value="-1">暂无团队</asp:ListItem>"后面,也就是说有个初始化的默认值,就不会因为返回空值而出错了.


我本以为这个问题就这样OK了.可是事情并不是照我想象的那样...因为我在测试的过程中发现了一件很奇怪的事情,就是这个属性会让数据重复绑定.出现重复的数值......这个时候我才明白,这个"AppendDataBoundItems",实际上就是一个绑定前,清不清空item数据的选项.

俗话说:1计不成,再生1计.我想了一下..绑定数据的时候,会自动清空DropDownList里面的items.肯定不能在绑定之前加这个默认选项了....整理了一下思路,方法有2:

1 绑定前给dataset添加一条数据.....这个方法太烂...因为要new一个row.
2 在DropDownList 绑定数据之后,insert一个默认选项出来.可以利用DropDownList的DataBound事件,这个事件是绑定之后处理的.
    protected void DropDownList1_DataBound(object sender, EventArgs e)
    {
        ListItem newLI = new ListItem("select all", "-1");
        DropDownList1.Items.Insert(0, newLI);
    }


这下..终于搞定这个默认值了,看样子这个"AppendDataBoundItems"不是那么好用的...虽然解决了默认值的问题..我发现..我还是要把项目中做过的DropDownList全部加一遍这个事件...我还是老老实实做人算了..

posted @ 2008-04-07 11:50 gxpotato 阅读(13) | 评论 (0)编辑


2008年4月2日

昨天碰到一个问题.以前都没有注意到的问题.就是多线程浏览器,只要不关闭浏览器,每个标签不管你如何更换登录用户共用的都是一个Session,这个和Session产生的机制有关,具体的不多说了.主要的是,我们为什么会碰到问题,在系统的应用过程中,某个企业个人肯定存在一个人担当多个角色的问题,那么进行重复的登录就是平常的事情了,比如说:我用角色A,填表单,然后提交给角色B,然后我再登录角色B处理这个表单,然后提交回去给A.这个时候如果切换到刚才A的标签进行处理就发现实际上系统确定角色是B.

有些人说了他们的解决方案:1 重申新登录用户必须新开一个浏览器. 2 通过Session是否存在,禁止多用户同一浏览器重复登录..其实这些解决的方法都是下下策.方法1太麻烦,我们做系统,就要把客户想象成那种非常白纸,什么都没有的,非常懒的,不愿意多步操作的人一样.你不能指望客户和我们一样的有耐心. 方法2.在企业里面个人担当多个角色的情况肯定存在,多用户登录无法避免,我们总不能操作一个,就要登录一次.一个工作流下来的几个审批...你要登录多少次??.因此,我们需要一个解决的方法.

我个人推荐的方法是,把用户的ID带入页面级.具体的解决方法我觉得有:
1 通过URL传递用户ID.这个用户ID一直跟著用户操作的每个页面.我们取值的时候,可以通过Session["+Request["用户ID"].toString()+"]--来区分每个不同的Session.在页面处理的时候,通过URL传递的用户ID,来取不同的Session变量.
2 通过页面的隐藏的input来传递用户ID.同样可以通过Session["+Request["用户ID"].toString()+"]--来区分每个不同的Session.在页面处理的时候,通过URL传递的用户ID,来取不同的Session变量.
3 通过保存页面的状态视图来获取用户的ID.

有些人说,可以通过cookies来解决.我到现在还没想好cookies怎么解决这个问题.因为cookies的产生机制和Session一样的.cookies一样存在共用问题.你虽然可以读取所有的COOKIES,但是你不知道哪个cookies才是和当前页面所属操作人员对应.

最后,建议通过URL或者隐藏input来传递的变量,要进行加密,加强安全性.

posted @ 2008-04-02 20:55 gxpotato 阅读(19) | 评论 (0)编辑


2008年4月1日

最近单位的OA需要用到这个web编辑器.研究了一下,其实这个东西很好配置.

1 这个控件分成两个部分.一个是.net部分一个是基础部分.
http://jaist.dl.sourceforge.net/sourceforge/fckeditor/FCKeditor_2.5.1.zip
http://jaist.dl.sourceforge.net/sourceforge/fckeditor/FCKeditor.Net_2.5.zip

2 解开2.5.1 有个fckeditor目录,放在项目根目录.解开.net 2.5,找到2.0的DLL.添加到vs2005的选项卡,然后新建一个页面直接把控件拖出来.默认的ID我记得是:FCKeditor1.可以通过FCKeditor1.Value获取编辑器里面的值.

3 关于图片的上传需要设定2个路径,一个是相对路径,一个是绝对路径.有两种方法,第一种是修改webconfig的方法.第二种是直接修改config.ascx(路径在:/fckeditor/editor/filemanager/connectors/aspx/下).
如果是修改webconfig的话,添加的内容如下:
<appSettings>
    <add key="FCKEditor:BasePath" value="/fckeditor/" />
    <add key="FCKeditor:UserFilesPath" value="/UploadFiles/" />
  </appSettings>
一定需要注意的是,路径以"/"结尾.否则会出错.

如果是修改config.ascx的话.打开config.ascx修改:

UserFilesPath = "/userfiles/";
 UserFilesAbsolutePath = "";


如果没有2个以上的站点公用一个图片目录,可以不修改绝对路径.因为我的项目有个问题就是:一台服务器上的两个站点公用一个图片路径.因此,需要设定绝对路径,保证保存在同一个地方.然后通过新建虚拟目录指向这个图片的绝对路径,修改两个站点的相对路径指向,还有绝对路径.就能公用一个图片目录.

需要注意的是,fckeditor针对image/flash/file/media上传类型,会各自添加相应的目录.
TypeConfig[ "File" ].FilesPath     = "%UserFilesPath%file/";
TypeConfig[ "Image" ].FilesPath     = "%UserFilesPath%image/";
...............

所以,如果你有需要不然他自动添加这个目录的话,可以删除这些filespath里面的字符串末尾的那些目录名称.

4 修改fckeditor下面的fckconfig.js.
找到:FCKConfig.DefaultLanguage ='en'   改为 FCKConfig.DefaultLanguage ='zh-cn'
找到:var _FileBrowserLanguage = 'php'  改为 var _FileBrowserLanguage = 'aspx'
找到:var _QuickUploadLanguage= 'php'  改为 var _QuickUploadLanguage = 'aspx'


5 运行看看,基本上就没有什么问题了.

posted @ 2008-04-01 15:50 gxpotato 阅读(35) | 评论 (0)编辑


posts - 4, comments - 0, trackbacks - 0, articles - 0

Copyright © gxpotato