DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザコントロールでのデータバインド時の自作イベントの作成

環境/言語:[VisualStudio.NET2003 C#]
分類:[.NET]

2004/10/01(Fri) 19:43:35 編集(投稿者)

はじめまして。


いろいろなページを見て回ったのですが、解決方法が見つからずアドバイスをいただけたらと思います。

今、画像編集ツールの様なものを作っていまして、
そこで複数の画像をリスト状に表示し、
重ね絵のような感じで編集できるコントロールの作成を行っています。
(PhotoShopでのレイヤー機能の部分と同じものです。>PhotoShopのレイヤコントロール画像参照)

このコントロールは、ドラッグ&ドロップすることで各アイテム(レイヤー)を
並び替えたりすることが出来るものです。

そこで、1画像情報を格納するためのユーザコントロール(自作ユーザコントロール画像参照)と、
そのコントロールをリスト状に格納並べるためのユーザコントロール(自作ユーザコントロール(リスト)の画像参照)の2つを作って作成してみようと試みました。

このコントロール(リスト表示する側)は、DetaSetとバインドさせて連結させる機能を持たせるため、
コントロールの画像部分をバインドできるように、以下のようにプロパティの記述をしました。


protected object dataSourceImage;
/// <summary>
/// 連結させる画像リストを取得、設定する。
/// </summary>
[
Bindable( true ),
Browsable( true ),
DefaultValue( null ),
Category( "データ" ),
Description( "画像リストを設定、取得する。" )
]
public object DataSourceImage
{
get
{
return this.dataSourceImage;
}
set
{
this.dataSourceImage = value;
}
}

ここまでは良かったのですが、問題はこのようにして作ったバインドデータに対して、
実際にデータに変更が行われた場合、自動でイベントを発生させるには
どのようにすれば良いのかが分かりません。
(DataBindingsのCollectionChengedを利用するのかと思いましたが、設定が行えませんでした。)
リストボックスのコントロールなどにある「DataSourceChenged」イベントの様なものを作成することは出来るのでしょうか?


どうぞ、よろしくお願いいたします。
(この記事にはファイル"1096626899.zip"が添付されていましたが、削除されました。)
IBindingList インターフェイスを使えばなんとかならないかなぁ。
IBindingList の ListChanged イベント あたりを確認されてみては?
杉下朋年さん。
ご返信ありがとうございます。

メール自動返信に設定していたのですが、まったく届いていなかったので遅くなってしまいました。

> IBindingList インターフェイスを使えばなんとかならないかなぁ。
> IBindingList の ListChanged イベント あたりを確認されてみては?

「IBindingList」の存在にまったく気づきませんでした。
これから試してみます。

ありがとうございます。
無事解決しました。

はじめに、IBindingListをユーザコントロールに実装しようとして全く意味が無いことに気づき、
サンプル通りにCollectionBaseを継承し、IBindingListを実装したコレクションクラスを作成しました。

作成したコレクションクラスをユーザコントロールのメンバとし、
コレクションクラスの「ListChanged」イベントを、新しく作成したユーザコントロールの「ListChanged」イベントに素通りさせることで実現させました。


/// <summary>
/// ImageControlList の概要の説明です。
/// </summary>
public class ImageControlList : System.Windows.Forms.UserControl
{

...
// CollectionBaseを継承し、IBindingListを実装したコレクションクラス
public ImageControlCollection imageControlCollection;

// コンストラクタで「imageControlCollection」の実態を確保する。
...

/// <summary>
/// 変更イベント
/// </summary>
// ここのイベント名を「DataSourceChanged」などに変更することで実現する。
public event ListChangedEventHandler ListChanged
{
add
{
this.imageControlCollection.ListChanged += value;
}
remove
{
this.imageControlCollection.ListChanged -= value;
}
}

...
}


杉下朋年さん。
本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板