CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
posts - 117, comments - 484, trackbacks - 11, articles - 0
  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理

置顶随笔

摘要: 1、 C#事件是特殊的委托 2、 C#中使用委托模型来实现事件的。 3、 C#中的委托是一个引用类型,可以把它看成一个特殊的”类”。 阅读全文

posted @ 2010-07-08 11:03 Charles Chen 阅读(3433) 评论(25) 编辑

摘要: 一、起因:一位同事在使用XmlDocument.Load("test.xml")方法加载xml文件时候,出现错误,错误是:test.xml文件找不到,也就是说程序找不到test.xml文件。 二、经过: 当出现这个毫无疑问的错误后,马上到应用程序的执行目录下去寻找是否存在test.xml文件。因为这里使用的相对路径,所以应当在当前程序执行目录下去寻找。但是奇怪的是应用程序的执行目录下是存在test...阅读全文

posted @ 2010-05-13 22:46 Charles Chen 阅读(707) 评论(1) 编辑

摘要: 记得已经写过一篇关于(Observer模式), http://www.cnblogs.com/Charles2008/archive/2008/10/06/1305116.html 发布/订阅简称(Pub/Sub)模式,这种Pub/Sub设计模式是observer的一种变体。Observer模式在Design patterns用于:一个对象(Observer)观察者被注入到另一个对象(主题Subj...阅读全文

posted @ 2009-03-07 15:17 Charles Chen 阅读(1084) 评论(0) 编辑

posted @ 2008-12-11 09:17 Charles Chen 阅读(3205) 评论(10) 编辑

posted @ 2008-10-21 07:00 Charles Chen 阅读(2009) 评论(7) 编辑

posted @ 2008-10-06 23:28 Charles Chen 阅读(424) 评论(0) 编辑

posted @ 2008-07-20 16:32 Charles Chen 阅读(3858) 评论(9) 编辑

摘要: 一、起因: 开发团队的一名开发人员突然离职,他把他负责的模块任务交给了我。其中一个模块是他写了一个用户控件,我在我的页面尚始终都用不起,运行时发生错误,错误消息是:The base class includes the field *****, but its type (****) is not compatible with the type of control (ASP.webuserc...阅读全文

posted @ 2008-06-27 14:02 Charles Chen 阅读(2443) 评论(10) 编辑

摘要: 最近比较空闲,我喜欢在空闲的时间来总结总结新的知识。记得一个项目中要实现Google Map中搜索功能。通过在网上查阅相关资料。原来是要使用GoogleMap提供的API函数来实现。下面我用GoogleMap来实现以个简单的Map,可以通过某个地区的经纬度来查询城市的地理位置。(支持缩放,移动等功能) 纬度 经度 源文件下载: 点击下载阅读全文

posted @ 2008-03-03 10:54 Charles Chen 阅读(1027) 评论(6) 编辑

2011年5月25日

本文转载于:http://hi.baidu.com/yangyangye2008/blog/item/1775770215a22782d53f7c18.html

两者大同小异,之说comBoBox吧,我们知道数据绑定控件被绑定之后是无法再在里面添加数据的,因为这是后的DataSource是无法修改的!不管是先再comBoBox之前使用其属性Items下的Add方法添加都会被后来的DisplayMember覆盖,

①这样是不行的:

comboBox1.Items.Add("--选择所有--");

this.comboBox1.DataSource = EmployerSet;

this.comboBox1.DisplayMember = "EmployeesTable.FirstName";

这种错误时先添加一项殊不知,会被后来的覆盖掉!

②另外可能有人想的是:

this.comboBox1.DataSource = EmployerSet;

this.comboBox1.DisplayMember = "EmployeesTable.FirstName";

comboBox1.Items.Insert(0,"--选择所有--");

这一种是最普遍的错误,这时候错误会出现在红色位置:设置 DataSource 属性后无法修改项集合。

怎么解决了,在长期的经历中我发现还是有方法可行的,第二种最佳,是昨天做项目的时候发现的:

第一种方法,想修改绑定的数据源之后再绑定,代码如下:

DataTable dt = EmployerSet.Tables["EmployeesTable"];

DataRow dr = dt.NewRow();

dr["FirstName"] = "--选择所有--";

dt.Rows.InsertAt(dr, 0);

this.comboBox1.DataSource = dt;

this.comboBox1.DisplayMember = "FirstName";

方法二:

采用了数据源的管理对象BindingContext,先将当前项的值修改之后再赋予呈现成员

this.comboBox1.DataSource = EmployerSet;

DataRowView rowV = (DataRowView)this.BindingContext[EmployerSet, "EmployeesTable"].Current;

rowV["FirstName"] = "--选择所有--";

this.comboBox1.DisplayMember = "EmployeesTable.FirstName";

你可以测试发现其实 rowV["FirstName"]原本的值就是EmployeesTable.FirstName中的第一个值,只是后来被修改了,接着赋予其呈现成员,这里之所以修改数据源会成功,我自己的认为是使用到了数据的管理对象,就好像是管理员可以修改一样而别人无法修改!

posted @ 2011-05-25 09:57 Charles Chen 阅读(428) 评论(0) 编辑

2011年1月25日

摘要: 唉,又是一次相当费力费时的系统维护,为了便于总结和思考,故对这次系统维护进行记录笔记!阅读全文

posted @ 2011-01-25 12:23 Charles Chen 阅读(259) 评论(0) 编辑

2010年12月15日

摘要: 这几天对SQL中的事务进行复习,来自于对客户项目维护引起的思考!先说说项目维护中遇到的问题:我们公司开发的软件项目,它建立在第三方公司开发项目(你见到过垄断主义的软件吗?)之上,数据库是直接的依赖关系,它偶尔出现死机的现象?阅读全文

posted @ 2010-12-15 13:57 Charles Chen 阅读(2079) 评论(26) 编辑

2010年12月13日

摘要: 设计模式的要点:设计模式(Design pattern)的鼻祖来至于建筑学领域。 建筑学定义的模式是:每个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。 然后在软件设计里面,从建筑学那边借鉴过来,软件设计模式描述了在软件设计过程中某一类常见问题的一般性解决方案。通过建筑学和软件设计的不同领域,其实也能看出有很强的类比性。通过对比可以看出,软件设计模式描述了常见问题的一般性解决方案。其实我们知道在软件设计过程中,设计软件其实有很多的陷阱,你可以拿到工具和语言可以做各种各样的事情,解决各种各样的问题。阅读全文

posted @ 2010-12-13 13:53 Charles Chen 阅读(283) 评论(0) 编辑

2010年12月10日

      记得曾经学习State设计模式的时候,记录了学习笔记.NET下的状态(State)模式 ------行为型模式 ,而最近一段时间我借助于项目的重构时间温习了关于行为型的模式----State(状态)模式。

      关于State设计模式的要点和代码结构在.NET下的状态(State)模式 ------行为型模式一文中已经有比较的清晰的说明,这里我就通过一个Demo来从另一个方面介绍关于State模式的分析。

     案例Demo:这样的一个场景:有一个关于PDA设备的在押人员点名的管理系统,在点名的过程中,在押人员有不同的状态(在所,不在所,外出就医,外出探亲等),不同的在押状态在PDA上显示的方式和点名的行为完全不同。

通常的方式,你会想到可以根据Prisoner(在押人员)的CurrentStatus属性来判断用户的状态来表现不同的行为。类似于下面的代码结构:

代码
        public void Process(Prisoner p)
        {
            
//不同状态有不同的行为
            switch (p.CurrentStatus)
            {
                
case 0:
                    {
                        
//在所状态
                        break;
                    }
                
case 1:
                    {
                        
//不在所状态
                        break;
                    }
                
case 2:
                    {
                        
//外出就医
                        break;
                    }
                
case 3:
                    {
                        
///出外探亲
                        break;
                    }
                
default: { break; }
            }
        }

 

这样的设计本没什么错,通过If Else语句或者Switch语句在程序运行时候根据对象的状态来表现不同的行为。但是对象的状态和对象的行为的依赖关系就是一个紧耦合的关系,而且主逻辑承担了在押人员状态的的判断和表现行为的复杂逻辑,给模块的可维护性带来了挑战?

另外如果随着系统需求的细化,我们可能要增加在押人员的其他状态,而这些状态所表现的行为有不同,发生了这样的变化我们是不是要修改这块主逻辑呢?

因此我们引入State设计模式,通过将对象和对象的状态进行分离,把对象状态的转换以及有不同状态产生的行为交给具体的状态类去实现,这样的话就能比较好的解决上述遇到的问题。

类图如下所示:

     

Context类如下:

代码
    public class Context
    {
        
private Prisoner p;
        
public int PrisonerState
        {
            
get
            {
                
return p.CurrentStatus;
            }
        }

        
private State m_Current;
        
public State Current
        {
            
get { return m_Current; }
            
set { m_Current = value; }
        }

        
public Context(Prisoner p)
        {
            
this.p = p;
            m_Current 
= new InGuardState();
        } 

        
public void Process()
        {
            m_Current.Process(
this);
        }
    }

 Prisoner类如下:

代码
  /// <summary>
    
/// 在押人员
    
/// </summary>
    public class Prisoner
    {
        
private string m_Name;
        
/// <summary>
        
/// 在押人员姓名
        
/// </summary>
        public string Name
        {
            
get { return m_Name; }
            
set { m_Name = value; }
        }

        
private bool m_Sex;
        
/// <summary>
        
/// 在押人员性别
        
/// </summary>
        public bool Sex
        {
            
get { return m_Sex; }
            
set { m_Sex = value; }
        }

        
private int m_CurrentStatus;
        
/// <summary>
        
/// 出所状态(在所:0,不在所:1,外出就医:2,出外探亲:3...)
        
/// </summary>
        public int CurrentStatus
        {
            
get { return m_CurrentStatus; }
            
set { m_CurrentStatus = value; }
        }
    }

 

State抽象类:

    public abstract class State
    {
        
public abstract void Process(Context p);
    }

 

在所状态类:

代码
 public class InGuardState:State
    {
        
public override void Process(Context c)
        {
            
if (c.PrisonerState == 0)
            {
                Console.WriteLine(
"在押人员状态是在所!");
            }
            
else
            {
                c.Current 
= new OutGuardState();//不在所
                c.Process();
            }
        }
    }

 

不在所状态类:

代码
 public class OutGuardState:State
    {
    
        
public override void Process(Context c)
        {
            
if (c.PrisonerState == 1)
            {
                Console.WriteLine(
"在押人员状态是不在所!");
            }
            
else
            {
                c.Current 
= new OutDoctorState();//外出就医
                c.Process();
            }
        }
    }

 

外出就医状态:

代码
    public class OutDoctorState : State
    {
        
public override void Process(Context c)
        {
            
if (c.PrisonerState == 2)
            {
                Console.WriteLine(
"在押人员状态是外出就医!");
            }
            
else
            {
                c.Current 
= new OutHomeState();//外出探亲
                c.Process();
            }
        }
    }

 

外出探亲状态:

代码
    public class OutHomeState:State
    {
        
public override void Process(Context c)
        {
            
if (c.PrisonerState == 3)
            {
                Console.WriteLine(
"在押人员状态是外出探亲!");
            }
            
else
            {
                Console.WriteLine(
"在押人员状态错误!");
            }
        }
    }

 

客户端调用:

代码
 static void Main(string[] args)
        {
            Prisoner p 
= new Prisoner();
            Context process 
= new Context(p);
            p.CurrentStatus 
=2;
            process.Process();
            p.CurrentStatus 
= 3;
            process.Process();
            p.CurrentStatus 
= 0;
            process.Process();
        }

 

要点:为Prisoner的CurrrentStatus操作是在各个具体的状态中进行的,在这里可以看到需要说明一下的是:这种状态的转换在真实的环境下是有序列的。(但Demo中表现并不明显,这种需要强调一下)。

再次补充说明一下状态和策略模式的区别:

前者的行为实行方式是有条件决定的,并且应当不在客户端干预的情况下自己迁移到合适的状态,而后者的行为实行方式是有客户端选择,并且能随时替换。

 

版权说明

  本文属学习笔记,欢迎转载且注明文章出处,其版权归作者和博客园共有。  

  作      者:Charles Chen

 文章出处:http://charles2008.cnblogs.com/  或  http://www.cnblogs.com/

 

 

 

 

posted @ 2010-12-10 15:10 Charles Chen 阅读(179) 评论(0) 编辑

2010年9月25日

摘要: Sql Server数据库的一大优势,就是具有富UI的管理和调试工具,这是优于ORACLE和其他的大中型数据库的。Sql Server的众多工具中,对于开发人员和DBA来讲,非常重要的一个,就是Sql Profiler (事件探查器) 了。阅读全文

posted @ 2010-09-25 16:27 Charles Chen 阅读(1397) 评论(3) 编辑

2010年8月9日

摘要: 问题:这样软件我是第一次碰到,垄断主义,现在分享给大家讨论讨论。下面就一一道来:一、问题的起因:因我的电脑安装一套软件系统,整个软件的安装自带了SQL Server2000的安装。由于我本就已经装了SQL Server 2000,故直接安装软件。当安装软件完成并打开初始化软件数据后,我再通过SQL Server 2000的企业管理器进不去了(默认是用SA帐号登录),而且通过查询分析器输入SA用户名...阅读全文

posted @ 2010-08-09 14:41 Charles Chen 阅读(2900) 评论(38) 编辑

2010年7月8日

摘要: 1、 C#事件是特殊的委托 2、 C#中使用委托模型来实现事件的。 3、 C#中的委托是一个引用类型,可以把它看成一个特殊的”类”。 阅读全文

posted @ 2010-07-08 11:03 Charles Chen 阅读(3433) 评论(25) 编辑

2010年7月2日

摘要: .Net应用程序的执行环境(CLR关于Assembly的搜索算法) 阅读全文

posted @ 2010-07-02 13:22 Charles Chen 阅读(530) 评论(8) 编辑

2010年6月24日

摘要: 最近为培训WCF做了一个演示DEMO,关于WCF集成COM+应用程序时候遇到一个问题:SvcConfigEditor.exe工具不让我集成COM+应用程序,出现的情况如下图所示: 阅读全文

posted @ 2010-06-24 16:21 Charles Chen 阅读(393) 评论(0) 编辑