- PR -

カスタムコントロール作成につきまして

1
投稿者投稿内容
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-01-19 17:01
毎々大変お世話になっております。

題記の件、現在ドロップダウンリストコントロールの
カスタムコントロールを作成しております。

======================以下、作成コントロール内容======================
WebControl, INamingContainerを継承したクラス内で
DropDownListのプロパティを色々とIDE上に表示させ、
IDE上で設定されたプロパティによって画面表示時に
表示する値等を変更しようと考えております。

  イメージとしてはこのような感じです。
    public class CustomDropDownList : WebControl, INamingContainer
    {
     #region コントロール作成
     protected override void CreateChildControls()
     {

       DropDownList _DropDownList = new DropDownList();       
       this.Controls.Add(_colorDropDownList);
       #region RequiredFieldValidator
       _objReq = new RequiredFieldValidator();
       _objReq.ControlToValidate = "_ctl0";
       _objReq.Text = this._ErrText;
       _objReq.ErrorMessage = this._requiredErrMsg;
       _objReq.Enabled = true;
       _objReq.EnableClientScript = true;
       _objReq.Display = ValidatorDisplay.Static;
       #endregion
     }
     #endregion
    }
======================================================================

単純にDropDownListのみではなく、CustomValidatorを
組み込んだ形でのコントロールを作成しようとしております。

IDE上にDataSource、DataFieldValue、DataTextValueを表示し、
通常のドロップダウンリストと同様の操作にしたいと考えております。
単純にDataSource等のプロパティを記述しても
IDE上、DataSetと関連付けることが出来ません。

======================プロパティ例======================
public string DataSource
{
get
{
return dataSource;
}
set
{
return dataSource;
}
}
============================================

大変お忙しい中、申し訳ございませんが、
上記事項につきまして、解決方法をご存知の方が
いらっしゃいましたら、ご教授の程、宜しくお願い致します。

以上

1127
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-01-19 17:46
たなすぺさん、こんばんは。

System.Web.UI.WebControls.ListControl を継承する必要があるような気がします。
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-01-19 18:31
毎々大変お世話になっております。

きくちゃんさんご回答ありがとうございます。

>System.Web.UI.WebControls.ListControl を継承する必要があるような気がします。
との事ですが、ListControlを継承したコントロールとしても
DataSourceプロパティは正常には動作しておりません。

現象としましては、IDE上にDataSetを貼り付け
DataSourceプロパティを選択しようとしても、
コンボボックスが表示されない。
(かつDataSourceの文字色が薄くなっています)

※通常のDropDownListでは、同様に
 IDE上にDataSetを貼り付け
 DataSourceプロパティを選択しようとすると、
 IDE上に貼り付けたDataSetがコンボボックスに表示され、選択できます。

以上
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2005-01-19 19:25
確認です。
プロパティ例がありますが、DataSourceはobjectでは?
引用:

======================プロパティ例======================
public string DataSource
{
get
{
return dataSource;
}
set
{
return dataSource;
}
}
============================================


そこで、質問の件ですが、
DataSourceConverter クラスを使って、DataSourceプロパティに
[TypeConverterAttribute(typeof(DataSourceConverter))]
と設定することで、リスト表示されませんか?
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-01-19 19:41
毎々大変お世話になっております。

Os_さんご回答ありがとうございます。

>プロパティ例がありますがDataSourceはobjectでは?
 →すいません、確かにDataSourceはobjectです。
  記載ミスです。

>DataSourceConverter クラスを使って、DataSourceプロパティに
>[TypeConverterAttribute(typeof(DataSourceConverter))]
>と設定することで、リスト表示されませんか?
 早速、試してみました。
 確かに、ご教授頂いた通り、IDE上にDataSetを貼り付け
DataSourceプロパティを選択すると、貼り付けたDataSetが選択可能になりました。
 大変ありがとうございます。

大変恐縮ですが追加で、質問をさせて頂きたいと思います。
DataSourceプロパティで設定した値により、DataTextField及び、
DataValueFieldも通常のDropDownListでは連動して
選択値を表示できるのですが、これも同様に可能なのでしょうか?

ためしに、下記のように記述してみたのですが、
リスト表示されるだけで、DataSourceに紐付くデータは
一覧表示されませんでした。

===========================================================
  [TypeConverterAttribute(typeof(DataFieldConverter))]
  public string DataField
  {
   get
   {
    return dataField;
   }
   set
   {
    dataField = value;
   }
  }
===========================================================

お忙しい中、度々申し訳ございませんが
ご教授の程、宜しくお願い致します。


きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-01-19 20:49
たなすぺさん、こんばんは。

引用:

DataSourceプロパティを選択しようとしても、
コンボボックスが表示されない。


ああ、そういう事でしたか。Os_さんの言うとおり、TypeConverter 属性の指定が必要ですね。

引用:

DataSourceプロパティで設定した値により、DataTextField及び、
DataValueFieldも通常のDropDownListでは連動して
選択値を表示できるのですが、これも同様に可能なのでしょうか?



当然、そういう風にコーディング(プロパティに指定された文字列をもとにコンテナ上のデータソースオブジェクトを探して、データを取得して、レコードの数だけoptionタグを追加して…)をすれば可能だと思います。
ただ、実際にドロップダウンをレンダリングするのは内部 DropDownList コントロールにやらせるんですよね?
ということは、データバインディング関係のプロパティやメソッドに関して、内部ドロップダウンのプロパティ、メソッドを呼び出してやれば良いような気がします。

コード:

[TypeConverterAttribute(typeof(DataFieldConverter))]
public string DataField
{
get
{
return _DropDownList.DataField;
  }
set
{
_DropDownList.DataField = value;
}
}



みたいな感じで…。

【追記】
良ーく読み返したら、なんか、微妙に質問の意図を取り違えてしまっているような気が…。

「通常のDropDownListでは連動して選択値を表示できる」というのは、「実行時に、バインドしたデータをもとに選択肢を表示する」という話ではなく、「デザイン時に、プロパティグリッドに連結列の選択肢を表示したい」という話?
まあ、その場合でも、上記の方法を取り敢えず試してみて頂きたいのですが。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2005-01-19 21:05 ]
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-01-19 21:27
きくちゃん、こんばんわ。
大変貴重なお意見をありがとうございます。

>「通常のDropDownListでは連動して選択値を表示できる」というのは、
>「実行時に、バインドしたデータをもとに選択肢を表示する」という話ではなく、
>「デザイン時に、プロパティグリッドに連結列の選択肢を表示したい」という話?
  → 上記の通りです。
    あくまでデザイン時にDataSourceプロパティとDataTextFieldの
    整合性を図る事を考えています。

>コード: ----------------------------------------------------------------------
>[TypeConverterAttribute(typeof(DataFieldConverter))]
>public string DataField
>{
> get
> {
> return _DropDownList.DataField;
>  }
> set
> {
> _DropDownList.DataField = value;
> }
>}
>
>
>------------------------------------------------------------------------------
>まあ、その場合でも、上記の方法を取り敢えず試してみて頂きたいのですが。
 → 試してみましたが、「_DropDownList」とコーディングした際、
   インテリジェンス機能が働かないこと、
   また、上記段階ではまだ、_DropDownListコントロールは
   インスタンスを生成していないことから、不可能かと思われます。
   (実際に試しました。)

Os_さんからご教授頂いた「[TypeConverterAttribute(typeof(DataFieldConverter))] 」を参考にヘルプを読み漁ってみましたが
やはりうまくDataSourceとDataTextFieldが連動してくれません。

ちなみに参考にしたURLは下記の通りです。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwebuidesigndatafieldconverterclasstopic.asp

以上
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-01-20 10:10
たなすぺさん、おはようございます。

よく見るとデータ関係のプロパティが、親(ListControl)のプロパティをオーバーライドするようになってませんね? 取り敢えず、そこを修正してみて下さい。
そうすると、DataSource は Object になって、TypeConverter 属性の指定も必要ありません。

データ関係のプロパティに、内部コントロールのプロパティをそのままスルーするかどうかはお任せしますが、

引用:

 → 試してみましたが、「_DropDownList」とコーディングした際、
   インテリジェンス機能が働かないこと、
   また、上記段階ではまだ、_DropDownListコントロールは
   インスタンスを生成していないことから、不可能かと思われます。


これ↑については、_DropDownList をメンバ変数として宣言していないからですよね?
1

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