我想向已有的一个控件发送拖放数据,但是里面有一段
object obj=DataOject.GetData();
Stream stream=(Stream)obj;
得到数据方法。。
if(obj Is IDispose)
{
   obj.Dispose();
}
而且,它在DragEnter和DragDrop里都调用函有上面语句的函数。所以,当数据拖进去的时候就把里面的那个Stream释放掉了,松开鼠标时只能等异常。
有什么办法,把一个非实现IDispose的类,使它可以支持(Stream)Type吗?在线等。

解决方案 »

  1.   

    最简单的方式是序列化。private void button2_Click(object sender, System.EventArgs e)
    {
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter
    = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); System.IO.MemoryStream stream = new System.IO.MemoryStream(); Class1 class1 = new Class1();
    formatter.Serialize(stream, class1);
    stream.Position = 0;
    }[Serializable]
    public class Class1
    {
    public Class1()
    {
    } string str = "hatita";
    }
      

  2.   

    在class中必须只能方可序列化的对象,如果放如textbox等控件,是无法序列化的。
      

  3.   

    哪么你的类必须继承MarshalByRefObject, IDisposable,并且实现一些,stream必须实现的方法,恩。。这个比较难。
      

  4.   

    谢谢你的热心回答,我又遇到了一个问题,帮帮我,就是跨程序拖放时,本来DataObject的数据一下子变成了System.__ComObject类型,这时假再想还原来的Stream时,就遇到以下异常:
    消息:
    此远程处理代理没有信道接收,这意味着服务器没有正在侦听的已注册服务器信道,或者此应用程序没有用来与服务器对话的适当客户端信道。
    ToString():
    System.Runtime.Remoting.RemotingException: 此远程处理代理没有信道接收,这意味着服务器没有正在侦听的已注册服务器信道,或者此应用程序没有用来与服务器对话的适当客户端信道。
       at System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(IMethodCallMessage reqMcmMsg, Boolean useDispatchMessage, Int32 callType)
       at System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(IMessage reqMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       at System.IO.MemoryStream.Seek(Int64 offset, SeekOrigin loc)
       at WindowsApplication5.Form1.Form1_DragDrop(Object sender, DragEventArgs e) in k:\documents\visual studio projects\windowsapplication5\form1.cs:line 130要怎么处理才能跨程序拖放?
      

  5.   

    使用remoting跨进程进行对象传递吗?那么你是否显式的注册信道呢?如一下
    TcpChannel  tcp = new TcpChannel(1234);
    ChannelServices.RegisterChannel(tcp);
      

  6.   

    不是的,就是普通的拖放,我也不明,我以前一直这样拖放好像没有问题(以前做的时候还是用VC),顺便说明一下,我拖放的类型不是剪切板上预设好的类型,而是"{12345678}",内容是一个MemoryStream.不知这有没有关系。
      

  7.   

    跨进程拖放控件?还有这句
    我拖放的类型不是剪切板上预设好的类型,而是"{12345678}",内容是一个MemoryStream.
    不是很明白。
      

  8.   

    DataOjbect data=new DataObject();
    MemoryStream ms=new MemryStream();
    ----写入数据
    data.SetData("{123456}",ms);
    DoDragDrop(data,...Copy);