none
デザイン時サポート:DataGridViewのカスタム列の場合 RRS feed

  • 質問

  • DataGridViewのカスタム列に型コンバーターを付与したいと考え、以下のようなコードを作りました。目的は DataGridViewのデザイン時の"列の編集"ダイアログ上のプロパティグリッドの表示内容を動的に操作することです。(例えば表示順の変更)

        class MyTextBoxCell : DataGridViewTextBoxCell
        {
        }

        [TypeConverter(typeof(MyDgvColumn_TypeConverter))]
        public class MyDgvColumn : DataGridViewColumn
        {
            int var1;
            public MyDgvColumn(): base(new MyTextBoxCell()){    }
            public int TestProp1
            {
                get { return var1; }
                set { var1 = value; }
            }
        }

        internal class MyDgvColumn_TypeConverter : TypeConverter
        {
            public override bool GetPropertiesSupported(ITypeDescriptorContext context)
            {
                return true;
            }

            public override PropertyDescriptorCollection GetProperties(    ITypeDescriptorContext context,
                                                                                                                       Object _targetObj,
                                                                                                                       Attribute[] attributes)
            {
                MyDgvColumn targetObj = (MyDgvColumn)_targetObj;//<== ①ここで実行時エラー
                .......
            }
        }

    実行すると、①のところで実行時エラーになります。理由は型が全く違うのでキャストできないとのことです。
    デバッガで調べると、_targetObjの型は下記の通りです。これは非公開クラスでありアクセスができません。その中にDataGridViewColumn型のメンバが入ってるようです。
        System.Windows.Forms.Design.DataGridViewColumnCollectionDialog.ListBoxItem

    DataGridViewのカスタム列のデザイン時サポートに関してはインターネット上にも殆ど情報がありません。いかにすればこの問題に対処できるでしょうか? どなたか、お知恵をお借りしたいと思います。よろしくお願いします。

    2006年12月27日 4:52

回答

  • カスタムコントロールやタイプコンバータにはリフレクションの勉強は必須課題です。
    頑張ってくださいね。

                Type type = value.GetType();

                PropertyInfo info = type.GetProperty("DataGridViewColumn");

                MyDgvColumn column = (MyDgvColumn)info.GetValue(value, null);

    2006年12月27日 12:44

すべての返信

  • カスタムコントロールやタイプコンバータにはリフレクションの勉強は必須課題です。
    頑張ってくださいね。

                Type type = value.GetType();

                PropertyInfo info = type.GetProperty("DataGridViewColumn");

                MyDgvColumn column = (MyDgvColumn)info.GetValue(value, null);

    2006年12月27日 12:44
  • えムナウ さんへ。

    おっしゃることはよくわかりました。必須課題の勉強をやりなおしたいと思います。

    大変、参考になりました。貴重なアドバイスをありがとうございました。

    2006年12月28日 0:00
  • えムナウ さんへ。

    お示しいただいたコードを組み込んでテストした結果、おかげさまで目的を達することができました。

    やみくもに試行錯誤していたのがお恥ずかしく、反省しています。リフレクション等を正月の間に勉強しなおしたいと思います。

    このたびは、たいへんありがとうございました。

    2006年12月28日 0:47
  • Yamakeiさん目的を達することができてよかったですね。
    最初は試行錯誤するのもしょうがないと思います。
    でも結局は体系だった勉強が必要になります。

    回答マークは私のレスポンスに付けていただけると幸いです。

    2006年12月28日 3:53
  •  えムナウ さんからの引用

    回答マークは私のレスポンスに付けていただけると幸いです。

    失礼しました。回答マークの意味を誤解していました。今、つけかえました。よろしくお願いします。

    2006年12月28日 6:39