- PR -

独自クラスのコピー&ペースト

1
投稿者投稿内容
sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2006-04-05 21:10
独自クラスでコピー&ペーストできなくて困っています。
たとえば、下に示すようなEmployeeクラスの情報をコピー&ペーストしたいとします。

コード:
[Serializable()]
public class Employee
{
    private int id;
    private string name;

    public int ID
    {
       get{return id;}
       set{id = value;}
    }
    public string Name
    {
       get
          {
              return name;
          }
       set
          {
               name = value;
               OnChanged(EventArgs.Empty);
          }
    }

    public event EventHandler Changed;

    protected virtual void OnChanged(EventArgs e)
    {
         if(Changed != null)
         {
             Changed(this,e);
         }
    }
}

//テストコード
static void Main()
{
   //コピー
     Employee empA = new Employee();
     empA.ID = 100;
     empA.Name = "tanaka";
     empA.Changed += new EventHandler(empA_Changed);
     
     DataObject dataObj = new DataObject();
     DataFormats.Format myFormat = DataFormats.GetFormat("Employee");
     
     dataObj.SetData(myFormat.Name,empA);
     
     Clipboard.SetDataObject(dataObj,true);


     //ペースト
     IDataObject idataObj = Clipboard.GetDataObject();

     Employee empB = (Employee)idataObj.GetData(myFormat.Name);

     //empBがnull参照になりクリップボードからデータを取得できなくなる
}


private static void empA_Changed(object sender,EventArgs e)
{
     //イベント処理
}




コード的にはおかしなことはやっていないと思うんですが・・。
なにやらコピーする対象のインスタンスにイベントを登録するとうまく行かなくなるんです!
イベントの利用をやめるとクリップボードからデータを取得できるようになります。
これはなぜ?
イベントは利用しなければならないんで、イベントの登録はやめられません。
どなたか解決策を教えてください。

環境
Windows2000,WindowsXP
.NET Framework1.0
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-05 21:56
引用:

souさんの書き込み (2006-04-05 21:10) より:

イベントは利用しなければならないんで、イベントの登録はやめられません。


このクラスにイベント登録しなくてはならないことはないんじゃないでしょうか?
このクラスのインスタンスを持つ別のクラスに登録すれば良いんじゃないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-05 22:03
また、振り分けに悩む。。。

とりあえず、シリアライズに振りました。
つまり、「シリアライズしてクリップボードに登録してみたら?」ってことです。

ことですが、クリップボードですよね?他のアプリケーションにペーストしたとき、イベントって、どうやって実行するんですか?
データをコピーできても、処理をコピーするというのは、なんか違うと思う。


〆 written by Jitta@仕分け人
sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2006-04-05 22:43
じゃんぬねっとさんにJittaさん、早速の返答ありがとうございます。

Jittaさんのお陰でペーストできない理由が何となくわかってきました。
そうなんですね、処理をコピーするというのは出来ないですよね。
と言うか、処理までコピーしようとしているとは知らなかったです・・。

じゃんぬねっとさんの教えにヒントを得てコピー&ペーストをする方法を考えました。
いい方法であるかわかりませんが、インスタンスのCloneを作ってイベントを削除してコピー&ペーストすると上手くいきました。

コード:
[Serializable()]
public class Employee:ICloneable
{
    private int id;
    private string name;

    public int ID
    {
       get{return id;}
       set{id = value;}
    }
    public string Name
    {
       get
          {
              return name;
          }
       set
          {
               name = value;
               OnChanged(EventArgs.Empty);
          }
    }

    public Employee Clone()
    {
          Employee empClone = (Employee)this.MemberwiseClone();

          empClone.Changed = null;

          return empClone;
    }
    object ICloneable.Clone()
    {
          return this.Clone();
    }

    public event EventHandler Changed;

    protected virtual void OnChanged(EventArgs e)
    {
         if(Changed != null)
         {
             Changed(this,e);
         }
    }
}

//テストコード
static void Main()
{
   //コピー
     Employee empA = new Employee();
     empA.ID = 100;
     empA.Name = "tanaka";
     empA.Changed += new EventHandler(empA_Changed);
     
     Employee empC = empA.Clone();

     DataObject dataObj = new DataObject();
     DataFormats.Format myFormat = DataFormats.GetFormat("Employee");
     
     dataObj.SetData(myFormat.Name,empC);
     
     Clipboard.SetDataObject(dataObj,true);


     //ペースト
     IDataObject idataObj = Clipboard.GetDataObject();

     Employee empB = (Employee)idataObj.GetData(myFormat.Name);

     //empBに貼り付けることができ、empAのイベントも引き続き利用することができました
}


private static void empA_Changed(object sender,EventArgs e)
{
     //イベント処理
}



Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-04-05 23:35

NonSerialized 属性とかどうなんでしょ
1

スキルアップ/キャリアアップ(JOB@IT)