UP UP UP UP UP UP!!!

解决方案 »

  1.   

    请各位高手注意,我这个控件可以在设计时由设计器自动生成代码(用了自定义TypeConverter特性),如果简单的用继承CollectionConverter可能不会成功的。还有顺便起问一下:大家都知Description特性可以为事件或是属性产生说明性文字,这个可以在属性窗口看得到,可是为什么在输入代码的时候就看不到了呢?比如:我们要对一个Button控件进行操作,那么当输入这个Button的变量名Button1加“."时后面就会出现这个控件的所有内容,然后我们将鼠标移到那些内容上面时,就会出现一个ToolTip,上面会有该内容的签名和说明,用Description特性能作到这一点吗?用什么特性才能作到这一点呢?
      

  2.   

    "你重改它的OnPaint行不行啊???"不行,我以经生写了OnPaint过程,可是问题的实质就是我的OnPaint过程无法得到调用,在设计时没有事件可以引发这个过程,如果能引发的话我想可能就解决了。
      

  3.   

    输入代码的时候看的到就这样:/// <summary>
    /// 显示test属性
    /// </summary>
    public string test
    {
    get{return m_test;}
    }
      

  4.   

    实在onpaint事件里写啊,我做的就是这样的啊.它会自动刷新的,当你添加按钮时,调用重绘方法invalidate(...)
      

  5.   

    当我添加ToolBarButton时,在集合编辑器中我如何调用ToolBar的Invalidate()呢?还想说明一下,我指的是类似ToolBar的控件,而非直接继承ToolBar,在ToolBar控件里,微软可是写了好多的代码了,而我们自定义控件中,是不会存在这些的,只有靠自已去写。我就是想知道这个Invalidate()方法通过什么方法调用呢?如何在点击集合编辑器的“新增”按钮时调用Invalidate()?
      

  6.   

    问题的关键是我如何在集合属性改变后发出一个事件,这才是问题的关键!如果我能发出一个事件,那么只需要在这个事件处理器里面调用Invalidate()就可以了。大家知道,为一个集合增加一个元素是一般是通过Add方法来完成的,可是如果用集合编程器新增元素,则Add方法就根本没有执行,所以我在哪里去触发这个事件呢?我就是想知道如果用了集合编程器,那么我应该如何去触发这个集合改变这个事件呢?
      

  7.   

    这是自定义事件的一个例子,希望可以帮到你:using System;
    using System.Timers;
    namespace Ch12Ex02
    {
    /// <summary>
    /// Summary description for Connection.
    /// </summary>

       public delegate void MessageHandler(string messageText);   public class Connection
       {
          public event MessageHandler MessageArrived;      private Timer pollTimer;      public Connection()
          {
             pollTimer = new Timer(100);
             pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
          }      public void Connect()
          {
             pollTimer.Start();
          }      public void Disconnect()
          {
             pollTimer.Stop();
          }      private void CheckForMessage(object source, ElapsedEventArgs e)
          {
             Console.WriteLine("Checking for new messages.");
             Random random = new Random();
             if ((random.Next(9) == 0) && (MessageArrived != null))
             {
                MessageArrived("Hello Mum!");
             }
          }
       }
    }
      

  8.   

    续:
    using System;namespace Ch12Ex02
    {
    /// <summary>
    /// Summary description for Display.
    /// </summary>
    public class Display
    {

             public void DisplayMessage(string message)
             {
                Console.WriteLine("Message arrived: {0}", message);
             }
    }
    }---------------------------------------------------------------------------------using System;namespace Ch12Ex02
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
             Connection myConnection = new Connection();
             Display myDisplay = new Display();
             myConnection.MessageArrived +=
                new MessageHandler (myDisplay.DisplayMessage);
             myConnection.Connect();
             Console.ReadLine();
    }
    }
    }
      

  9.   

    不就是调用invalidate()么
    试一试invalidate(new object(),new System.EventArg());
    不就可以了么,我调用click时都是这么调用的啊
      

  10.   

    misvcom(零下一度) 兄:
    定义委托也是一个办法,小弟也曾想定义一个Timer然后再定义一个事件,然后在设计时一直检测,如果集合有改变,那么就发出事件。
    可是这样真的感觉到很不爽,只能算是一个权宜之计,我之所以想把设计时行为加上,就是想让程序更加完美,如果采用权宜之计还不如不要了。lovelyxinxin(小欣欣)兄:谢谢你的参与,你可能还没有看清楚我的意思,我不是不会发出调用一个事件,而是我不知道在什么地方才能调用这个事件。
      

  11.   

    唉,怎么CSDN上的英雄们老是遇到了一个有点意思的难题就失语了吗?
      

  12.   

    我不是叫你定义一个Timer然后再定义一个事件,这只是一个自定意事件的例子,我的意思是既然你不知道如何在集合属性改变后发出一个事件,那就干脆自己定义一个在集合属性改变后触发的事件,我没有你程序的源码,所以根本没办法帮你写合适的样例代码,敬请原谅^-^
      

  13.   

    在集合中的add和remove方法中加入fireModelChanged()方法,这个方法触发一个事件.如下:先定义一个委派
    public delegate void ModelChangedHandler(Object sender, System.EventArgs args);
    声明一个事件
    public event ModelChangedHandler OnModelChanged;
    private void fireModelChanged()
    {
       if (OnModelChanged != null)
          OnModelChanged(this,EventArgs.Empty);
    }当在控件中加入集合属性时,向控件指定听众。
    Control.OnModelChanged += new ModelChangedHandler (MyHandler);最后编写处理方法
    private void MyHandler(Object sender, System.EventArgs e)
    {
      //调用invalidate
      this.invalidate();
    }
    不知这样是不是可行,如果可以的话。请告诉我一声
      

  14.   

    ddqqll(酸菜)兄,谢谢你的关注,但是你的方法一定是不行的,因为通过“集合编辑器”中的“新增”按钮是不会调用Collection类的Add方法的,如果调用那问题不就解决了吗?我认为最终解决方法一定是要重写CollectionConverter类的,可是在重写的时候又有很多难题。具体就是:http://community.csdn.net/Expert/topic/3234/3234796.xml?temp=.4195978
      

  15.   

    说的不错,重写CollectionConverter这个有什么问题,说出来啊.我以前看到过相关的贴子,忘了在那儿.
      

  16.   

    问题就是:这是我以前的贴子:大家都知道,如果一个控件具有集合属型的属性(比如:ToolBar),那么在编辑该集合类型属性时就会弹出来一个“集合编辑器”对话框。而这个对话框实际就是CollectionEditor类的实现。我的问题有1.我自定义一个控件,在这个控件(MyControl)中有一个属性Items,其类型为MyCollection(继承自CollectionBase),在MyCollection中有一个Add方法,该方法调用List的Add方法,而且还有其他的一些语句。我的问题是,在使用“集合编辑器”新增MyColtrol.Items属性的元素时,好象根本就没有使用MyCollection.Add方法,因此在MyCollection.Add中除了List.Add(***)的语句行外,其他的都没有执行(其中List.Add(***)可能也没有执行,只不过是有这个效果)。但是我非常希望能将MyCollection.Add方法能在使用“集合编辑器”单击新增按钮时执行,这个问题怎么解决?
    2.上一个问题无法解决,那我就不指望CollectionEditor了,我就自已定制一个编辑器好了,就像是TreeNode的Editor那样,可是这个里面还是存在一个问题:
    我无法继承CollectionEditor里面的CollectionForm类,可是这个类我明明是声明为Protected的呀?如下:
    Public Class MyCollectionEditor
     Inherits CollectionEditorPublic Sub New(Byval type as Type)
      MyBase.New(type)
    End SubProtected Overrides Function CreateCollectionForm() As CollectionForm
          Return New MyCollectionForm(Me)
    End FunctionPrivate Class MyCollectionForm
      Inherits CollectionForm......End Class...End Class为什么在Private Class MyCollectionForm类中就无法继承CollectionForm呢,提示是:“CollectionForm类是Protected”,可是我就是在CollectionEditor类的子类中使用的呀?为什么在一个类的子类中就不能使用基类中的Protected类型的对象呢?还有想顺便请教一个各位高手,如果我想让自定义控件在设计时就能看到一些效果,比如:在添加ToolBar的ToolBarButton时,就会在设计中的窗体上看到你刚才添加的ToolBarButton了。要达到这个目的该怎么做呢?请各位大哥给小弟支个招:)
      

  17.   

    interim(interim)大哥,可否发给小弟看看,谢谢[email protected]如果您的代码不方便发,那么给小弟讲讲思路也好呀!!!
      

  18.   

    非常感谢interim(interim)兄。他已经帮我解决了这个问题此贴三天后结贴。大家再讨论一下!
      

  19.   

    能否告知解决的方法
    Email: [email protected]