1.所有的控件全部封装成Control.dll,比如TBTextBox是重写的一个继承了微软的TextBox的自己定义TextBox。
2.定义一个BaseForm : Windows.Form,这个也放在Control.dll里面。在设计时,所有的窗体都是继承了BaseForm的,所有的控件都是从Control.dll里面拖上来的。要实现一个功能:做一个FormA,Using Control;如果窗体FormA的控件的内容发生过改变,那么在关闭时提示是否保存,如果没发生改变,不提示保存。这个就和Word的工作原理是一样的。不能遍历FormA的所有控件然后判断取值,不能对每个控件的TextChange等事件中写代码,只能修改基类,修改Control.dll里面的TBTextBox,重写KeyUp事件。可以修改BaseForm。因为可能有上百个窗体,每个窗体上有上百个控件。尝试用委托做了,可是重写了TBTextBox的OnKeyUp事件后就不知道怎么去对FormA产生影响了,在OnKeyUp这个事件里面我怎么才能传一个东西出去并且保存在一个变量里面?

解决方案 »

  1.   

    在BaseForm里添加Modified属性,以表示是否有修改,在Control.dll里面的TBTextBox,重写KeyUp事件,在这个事件里,设置窗体的这个属性值,比如自定义Modified属性,在窗体关闭的时候取Modified看是否为True来表示是否有数据修改过.
      

  2.   

    不能遍历FormA的所有控件然后判断取值
    --------------------------
    为什么?FormA里的控件只会有自己定义的TBTextBox吗?如果不是,这个要求是实现不了的。
      

  3.   

    2楼的实现不了。
    1. BaseForm和TBTextBox的命名空间都是Control,这是两个不同的类。
    2. FormA是继承的BaseForm,判断的时候是判断FormA的某个属性,如果以您的意思,那么我有类似于FormA的100个窗体,每个窗体上有20个控件,其中10个是TextBox,还有其他类型控件,这又怎么做?
      

  4.   

    FormA里面不止有TBTextBox,而且有CBCombox,还有自定义的时间控件,还有LBListBox,CBCheckBox,RBRadioButton等等
      

  5.   

    控件不是都有FindForm()方法查找它所在的窗体吗?
    你可以这样来做:
    //在控件类的修改事件中编写如下的代码
    BaseForm bf=this.FindForm() as BaseForm;
    if (bf!=null)
    {
        bf.Modified=true;
    }
      

  6.   

    谢谢hbxtlhx(平民百姓) ( ) 信誉:112    已经解决问题,你的思路也是对的,主要是在TBTextBox里面找到它所属的窗体,this.Parant。只要找到输入的窗体就好了,为了防止这个控件是属于其他控件的,所以加个while循环直到找到BaseForm。浪费一天半时间Thanks,结帖
      

  7.   

    有2个缺点:
    1、这样的结果是一但被编辑过,modified就为true,不管编辑的结果是否与原先相等。
    2、必须自己重写所用到的控件,或者为每个控件添加事件,通用性不好。
    优点就是效率高,要求不高的时候比较好用。