2010年12月31日
这段时间有个ASP.NET的项目在弄,在对前台页面进行设计时,发现加载设计界面很慢,这都还可以理解,但是不能理解的是
在我修改了某一属性的值后进行保存时,发现所需的时间会更长,我想这样岂不是非常吃力,我到网上找了一些答案。都没有
解决我的问题(要么就是说机器配置低、软件有冲突等)我按照上面的方法改了但是发现还不能解决问题,在家里时发现家里
的机器运行的很快,保存也很快。我就纳闷了,怎么会这样呢,原来是我当时想学习Sliverlight时安装了VS2008 sp1安装补丁
果然在公司的电脑上安装上VS 2008 sp1后一切运行正常。
我安装的SP1 补丁为
VS2008更新包SP1CHSX1512981.iso
在Microsfot 官网上有。
顺便给出个我使用个的VS2008 系列号:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T
2010年10月10日
这段时间利用工作之余想系统的再次去学习ASP.NET。刚好学习到了ASP.NET的三个对象Application,Server,Session觉得比较有用,先作为笔记记录下,方便以后查用,顺便也可以加深印象。因为理解时因人而异,文章中对对象具体的解释清参考MSDN官方文档。
一、Application对象
个人理解:应用程序及对象,当我们程序运行时Application就产生了。Application以键值对存储数据,可以将Application对象理解成对象的集合
所属的类:HttpApplicationState 启用
MSDN官方:ASP.NET 应用程序中多个会话和请求之间的全局信息共享
ASP.NET 应用程序是单个 Web 服务器上的某个虚拟目录及其子目录范围内的所有文件、页、处理程序、模块和代码的总和。
HttpApplicationState 类的单个实例在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建。对于 Web 服务器上的每个 ASP.NET 应用程序都要创建一个单独的实例。然后通过内部 Application 对象公开对每个实例的引用。
应用程序状态不在网络场(应用程序被多台服务器承载)或网络园(应用程序被同一台计算机上的多个进程承载)中共享。
如何使用:如果要使用Application,先可以添加一个ASAX文件,它的作用是初始化应用程序级或会话级变量。VS2008中可以直接添加ASAX文件,而在VS2003中在你新建ASP.NETweb 应用程序时时已经为你创建好了。在VS20003的Global.asax中是以类的形式存在,而在VS2008中的Global.asax是以脚本文件形式存在(个人理解)。新建好之后,我们会看到Global文件中有以下事件:
1、void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
}
2、void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
}
3、void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
}
4、void Session_Start(object sender, EventArgs e)
{
//在新会话启动时运行的代码
}
5、void Session_End(object sender, EventArgs e)
{
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。
}
二、Session对象
个人理解:存储用户信息。会话:客户端(浏览器)想服务器端发送请求,服务器端响应后返回给客户端,这样的一个过程可以理解为一个Session(会话)
所属的类:HttpSessionState
MSDN官方:提供对会话状态值以及会话级别设置和生存期管理方法的访问。详细请参考MSDN关于 ASP.NET 会话状态
常用属性:SessionID(唯一用户会话标识符) TimeOut(用户超时) LCID(本地标识符) Count(会话状态中的项目数)
常用事件:void Session_Start(object sender, EventArgs e)和void Session_End(object sender, EventArgs e)
三、Server对象
个人理解:获取你所请求服务器的相关信息
所属类:HttpServerUtility
MSDN官方:提供用于处理 Web 请求的 Helper 方法。
常用属性:ScrtiptTimeOut MachineName
常用方法:Execute Transfer HTMLEncode,URLEncode,MapPath
Execute:在服务器端去执行另一个页面,执行完成后,将结果返回到当前页面
Transfer:类似于Response.Redirect()
HTMLEncode:以纯文本形式输出HTML标记
URLEncode:处理在通过URL传递参数时包含的特殊字符
&变量分隔符
知识点:
1、application对象是应用程序级的,是所有用户共享的,而session是用户级的,其他用户不能访问其他用户的session
2、apolication和session都是键值对的集合对象
3、会话断开或销毁超时时间一般为20分钟,可以在session_start事件中设置timeout的值,最小为1(1分钟)。还需要注意不是你把浏览器关闭就说明会话断开或销毁,而是你session的TimeOut超时或关闭World Wide Web Publishing服务,还可以是你机器正常关机。
综合实例:统计历史访问人数、在线人数、登陆系统及Server对象的使用
示例
2010年9月1日
前提简介:
之前公司客户向我反映了一个问题,说为什么我第一使用你们的软件,怎么连工程都建不了(我们做的是一个建筑施工项目),这点事我们BOSS跟说我要我解决下,这下子我哪敢怠慢,连忙去联系客户看他出现了什么错误,他截了一张图给我看:
如下图:

我看了下代码索引8处是需要一个日期类型的数据,我就到我的机器上测试,不管怎么测试都没有这个错误,我就想,这还奇了怪了,难道是他操作系统有问题(但是最后确认是我猜对了)。
问题:
本来我使用DateTimePicker控件时,设置的只显示年月日,可是客户传给我的图片中连星期也显示了。

寻求问题解决方案:
1、首先呢,我就到网上去搜索该问题的解决方案,但是都不是我想要的;
2、我就在一个群里面贴了张图上去,果然高手来了,说XP系统时间设置的问题,按照他的方式果然问题在我的机器上出现了;
既然知道了问题,就解决问题。
重现客户问题:
(让DateTimePicker格式显示为年月日星期X)
步骤:开始->控制面板->区域和语言选项->点击自定义按钮->进入日期选项卡,设置如下图:

在长日期格式最后加入dddd,变成yyyy'年'M'月'd'日'dddd这样设置运行后,你就会发现DateTimePicker的格式会显示2010年9月1日星期三
解决方案:
第一种方法:
按照上述重现问题的方法,将长日期格式最后的dddd去掉,问题随之解决(也是这么帮客户解决的);
第二种方法:
采用编码的方式,截取获取的日期格式字符串。即使出现了年月日星期格式也不会出现问题了
例如:
string needStartDate = "";
string testFinishDate = this.dtmFinishDate.Text.Trim();
if (testStartDate.Contains("星期"))
{
string[] sArray = Regex.Split(testStartDate, "星", RegexOptions.IgnoreCase);
if (sArray.Length > 0)
{
//所需的日期格式
needStartDate = sArray[0].ToString();
}
}
个人总结,希望可以帮助到人。
2010年8月16日
DockPanel的基本使用 我就不说了,网上很多,我想说的是在使用DockPanel时 需要注意的几个小问题
第一个:
使用过DockPanel的人,都有可能会遇到这样一个错误:
Invalid Content: ActiveContent must be one of the visible contents, or null if there is no visible content.
翻译过来的意思大致是:无效的内容: 如果没有一个可见的内容,ActiveContent必须是可见的内容或空。
具体是什么原因,大家可以相互探讨下。下面我说说出现这个问题的几种情况
代码中的this关键字代表的就是Dockpanel所在的窗体为Form1
1)、当Dockpanel的DocumentStyle不为DockingMdi时,以下代码会出现这个问题
Frm_A frmA = null;
//判断子窗体中是否已经存在在DockPanel中
foreach (DockContent frm in this.dockPanel1.Contents)
{
if (frm is Frm_A)
{
frm.Activate(); //激活子窗体
return;
}
}
frmA = new Frm_A();
frmA.MdiParent = this;
frmA.Show(this.dockPanel1);
解决方案:看你设置Dockpanel的DocumnetStyle是否为DockingMdi。大家也可以试试其他几种方式(DockingWindow,DockingSdi,SystemMdi)
2)、设置了Dockpanel的DocumentStyle不为DockingMdi时,如果你想要设置窗体Frm_B为左边浮动窗体,需要设置窗体Frm_B的DockAreas为且仅为DockLeft,如果想要实现其他功能可自行去设置其他属性信息,现在请看下面代码
Frm_B frmB = null;
//判断子窗体中是否已经存在在DockPanel中
foreach (DockContent frm in this.dockPanel1.Contents)
{
if (frm is Frm_B)
{
frm.Activate(); //激活子窗体
return;
}
}
frmB = new Frm_B();
//frmB.MdiParent = this;
frmB.Show(this.dockPanel1,DockState.DockLeft);
注意,如果你在你的代码中加了红色注释的代码,那么程序运行时 也会报上面的那个错
解决方案:注释红色的代码。
原因:(个人理解)frmB.Show(this.dockPanel1,DockState.DockLeft);这句代码其实就设置了frmB只停靠在DockPanel左边,此时的frmB是不属于MDI子窗体的,所以一旦你加入红色的代码,程序就会报错。
第二个:
拖动、停靠、固定子窗体(显示在Dockpanel中)
拖动:如果你想使你的子窗体可以任意拖动,那么你在设置子窗体的DockAreas属性时,保持默认值,不要修改。
停靠:首先你需设置DockAreas的位置,可以停靠在左、右、下等,也可以通过程序代码控制,参考上面代码。
固定:只需设置你窗体的DockAreas为Document就行了
第三个:
子窗体和Contents的判断
很多时候你需要判断Dockpanel中存在多少个子窗体或Contents,请参考下面代码:
foreach(Form in this.MdiChildren)
{
//这样判断时,停靠的窗体是不会计算在内的
}
而
foreach (DockContent frm in this.dockPanel1.Contents)
{
//这样设置后,所有的继承与DockContent的窗体都会被计算在内的
}
第四个:
寻找主窗体、动态显示子窗体
参考图:

实现的功能:这里我们需要实现,右键点击A窗体,通过右键菜单来显示窗体B。
//主窗体的对象
Form1 form1;
private void showB_Click(object senders, EventArgs e)
{
GetFrmMain(); //通过此函数来获取form1
foreach (Form frm in form1.MdiChildren)
{
if (frm is Frm_B)
{
frm.Activate();
return;
}
}
Frm_B frmB = new Frm_B(this);
frmB.MdiParent = form1;
frmB.Show(form1.dockPanel1);
}
private void GetFrmMain()
{
if (this.Parent.Parent.Parent.Parent != null)
{
form1 = (Form1)this.Parent.Parent.Parent.Parent;
}
else
{
form1 = (Form1)this.Parent.Parent.Parent;
}
}
现在是在A窗体中,this关键字已经代码的不是主窗体了,那么这里我们就需要获取主窗体对象
当A窗体停靠时,需要this.Parent.Parent.Parent.Parent(四个)
不停靠时,只需要三个this.Parent.Parent.Parent
调试代码发现:停靠时
this.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPane}
this.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockWindow, BorderStyle: System.Windows.Forms.BorderStyle.None}
this.Parent.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPanel, BorderStyle: System.Windows.Forms.BorderStyle.None}
this.Parent.Parent.Parent 为 {TestEvenhandler.Form1, Text: Form1} 就是我们要找的主窗体Form1
不停靠时:
this.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPane}
this.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPanel+AutoHideWindowControl, BorderStyle: System.Windows.Forms.BorderStyle.None}
this.Parent.Parent.Parent 为 {TestEvenhandler.Form1, Text: Form1} 就是我们要找的主窗体Form1
四个小问题,也算不上技巧,是我在开发中遇到过的,里面的缘由可能解释不是很清楚,忘大家相互探讨,共同进步。
待续。
2010年8月2日
学习Java桌面应用程序开发_主窗体
一般的应用程序都是登陆窗体,登陆成功后进入主界面的,先看看主界面的草图:

从图中可以看出,主界面大致可以分为四块,上面是菜单栏及图片工具栏,左边是树形导航,下边的状态栏。
菜单栏:JMenuBar(菜单条),JMenu(菜单),JMenuItem (菜单项)
工具条:toolbar,JButton(按钮+图片)
树形导航:JTree
状态栏:toolbar,JLable
实现界面的代码:
菜单栏:

代码
1 final JMenuBar menuBar = new JMenuBar();
2 menuBar.setName("menuBar");
3 setJMenuBar(menuBar);
4
5 final JMenu jmenuFile = new JMenu();
6 jmenuFile.setText("文件(F)");
7 jmenuFile.setName("menuFile");
8 menuBar.add(jmenuFile);
9
10 final JMenuItem newProject = new JMenuItem();
11 newProject.setName("newProject");
12 newProject.setText("新建工程");
13 jmenuFile.add(newProject);
14
15 final JMenu jmenuTool = new JMenu();
16 jmenuTool.setText("工具(T)");
17 jmenuTool.setName("jmenuTool");
18 menuBar.add(jmenuTool);
工具栏:

代码
final JToolBar toolBar = new JToolBar();
toolBar.setName("toolBar");
getContentPane().add(toolBar, BorderLayout.NORTH);
final JButton jbtnNew = new JButton();
jbtnNew.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
//点击新建按钮触发事件
}
});
jbtnNew.setName("jbtnNew");
jbtnNew.setIcon(SwingResourceManager.getIcon(Main.class,
"Image/FileNew.png"));
jbtnNew.setText("新建");
toolBar.add(jbtnNew);
toolBar.addSeparator();
final JButton jbtnSave = new JButton();
jbtnSave.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
}
});
jbtnSave.setName("jbtnSave");
jbtnSave.setIcon(SwingResourceManager.getIcon(Main.class, "Image/FileSave.png"));
jbtnSave.setText("保存");
toolBar.add(jbtnSave);
树形菜单:
//根节点
DefaultMutableTreeNode root = new DefaultMutableTreeNode("任务信息");
//创建树
JTree tree = new JTree(root);
状态栏:

代码
1 final JToolBar stautsBar = new JToolBar();
2 stautsBar.setName("statusBar");
3 getContentPane().add(stautsBar, BorderLayout.SOUTH);
4
5 lblWelcome = new JLabel();
6 lblWelcome.setText("欢迎");
7 stautsBar.add(lblWelcome);
8
9 stautsBar.addSeparator();
10
11 lblSupport = new JLabel();
12 lblSupport.setText("技术支持:");
13 stautsBar.add(lblSupport);
利用上述代码 就可以搭出主界面的框架来,可能还需要朋友们自己去扩展。。
注意:
1、要注意界面的布局,可以添加jpanel容器参与布局。

2、现在看到的草图控件是比较少的,如果控件多了,处理的事件多了,那么就为了防止主界面代码过多,就需要我们学会使用分拆分,再组合的方式。
例如:树形控件或处理事件的代码 成一个类(test1)
面板1控件或处理事件的代码一个类(test2)
。。。。。。
主界面中时 组合在一起 效果是一样的 但是主界面的代码将大大减少。。
3、在新建一个jframe后,一定要为界面编写释放资源的代码,如果你不编写dispose(); 运行一次 就会在进程中添加一个javaw进程(可以自己测试)
public void windowClosing(final WindowEvent e) {
dispose();
}
2010年7月27日
摘要: 当你在使用WindowBuilder.Pro.v6.1.1 作为开发Java swing程序的插件时,你必然会遇到一个问题,就是需要注册。下面的步骤教你进行破解。 第一步: 开始>运行>cmd>输入ipconfig /all,在DOS窗口中你会看到有个Physical Address:**-**-**-**-**-** 第二步: WindowBuilder 注册机 Keyg...
阅读全文
2010年6月20日
摘要: 今天也是想记录工作中出现的两个错误:第一个是服务器应用程序不可用,第二个错误是"IIS虚拟目录名"应用程序中的服务器错误.以上两个错误是把ASP.NET程序配置在IIS上出现的。。。 解决方案: 第一个问题,右键你要配置在IIS上程序所在的文件夹,进入安全选项卡,然后添加ASP.NET账户,设置权限为完全控制 第二个问题,同上步骤,但是这次你需要添加的是everyone账户,同样的勾选完全控制 参...
阅读全文
2010年6月18日
摘要: 这两天把系统重装了一遍,对VS,MSSQL也进行了重装,也把IIS进行了重装(最好与OS版本一致),配置了之前做的一个网站,运行不了,提示"服务器应用程序不可用",按照网上网友提供的解决方案,http://www.cnblogs.com/lemontree/archive/2009/03/04/1403219.html 不知怎么搞的还是没有解决,由于提示这个错误之前,也提示过一个错误就是&ldqu...
阅读全文
2010年6月15日
摘要: 今天,有个朋友问我,怎么把程序配置在IIS上,报了一个错误:"无法显示网页"(找不到服务器),我当时就纳闷了,怎么之前配置的是好好的,怎么今天配的时候就出现了这个问题,我就开始上网查资料,有的人说需要设置用户权限: http://www.2000xg.com/article.asp?id=398也有的人说是其他的问题,具体的问题可是在百度或谷歌上搜搜。。但是当我看到访问的地址时:http://19...
阅读全文
2010年6月13日
摘要: 学习Java桌面应用程序开发_登陆窗体最近这段时间公司用Java做C/S的项目,自己去下了个插件(WindowBuilder.Pro.v6.1.1)在Eclipse上运行。由于也是刚开始研究Java swing 想记录下自己的开发中的一点小心得,希望可以帮到需要帮助的人。也同时帮助自己加深了印象。。首先,来看个效果图:这个窗体在运行时,是在屏幕的正中间,并且是固定的大小。。慢!或许你会说这有什么难...
阅读全文