none
DataGridViewのカスタム行について RRS feed

  • 質問

  • DataGridViewのカスタム行についてお教え下さい。

        public class NewDataGridViewRow : DataGridViewRow
        {
            ・・・・・
        }

    DataGridViewRow クラスから派生したカスタム行を作成したのですが、dataGridView1でコードによる行の追加や挿入はカスタム行を指定して行えば難なくできるのですが、最後の新規行(行ヘッダーに「*」のある行)で編集を始めると当然ですが、

    「型 'System.Windows.Forms.DataGridViewRow' のオブジェクトを型 'project1.NewDataGridViewRow' にキャストできません。」

    という、エラーが出てしまいます。

    webなどでいろいろ調べた結果、

    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.rowtemplate.aspx

    「DataGridViewのRowTemplate プロパティ でカスタム行を指定するのではないか」というところまではなんとか、たどり着いたのですが、そこから先に
    進めなくなってしまいました。

         DataGridViewRow row = this .dataGridView1.RowTemplate;

    のコードを下記のように変えてみましたが、ダメでした。

         NewDataGridViewRow row = this .dataGridView1.RowTemplate;

    どのようにしたら良いか、ご教示頂けないでしょうか?

    ぜひよろしくお願いいたします。

    2009年9月28日 0:27

回答

  • RowTemplate は、新しい行が必要なときに、このプロパティに設定されているインスタンスの Clone を新しい行として通常の DataGridViewRow の代わりに使用する、というプロパティです。
    新しく作成した NewDataGridViewRow をこのプロパティに設定するようにしてください。
    2009年9月28日 0:57

すべての返信

  • RowTemplate は、新しい行が必要なときに、このプロパティに設定されているインスタンスの Clone を新しい行として通常の DataGridViewRow の代わりに使用する、というプロパティです。
    新しく作成した NewDataGridViewRow をこのプロパティに設定するようにしてください。
    2009年9月28日 0:57
  • Hongliangさん、早速の返信ありがとうございます。

    > 新しく作成した NewDataGridViewRow をこのプロパティに設定するようにしてください。

    とは、具体的にはどのようにすれば良いのでしょうか。
    2009年9月28日 1:17
  • Hongliangさんに教えていただいたことを元に試行錯誤しているうちに自己解決しました。

        public class NewDataGridViewRow : DataGridViewRow
        {
            ・・・・・
        }

        public class NewDataGridView : DataGridView
        {
            public NewDataGridView()
            {
                NewDataGridViewRow row = new NewDataGridViewRow();
                this.RowTemplate = row;
            }

            ・・・・・
        }

    Hongliangさん、ありがとうございました。

    2009年9月29日 4:14
  • 経緯とその後のご報告をさせていただきます。

    1.今回対象となる下記のカスタム行を作成しました。

        public class NewDataGridViewRow : DataGridViewRow
        {
           public string NewProp { get; set; }       

            ・・・・・
        }

    2.カスタムDataGridViewを作り、Formに貼り付けForm_Loadに

    NewDataGridViewRow row = new NewDataGridViewRow();
    newDataGridView1.RowTemplate = row;

    を入れたところ最後の新規行(行ヘッダーに「*」のある行)は、NewDataGridViewRowとして認識されずエラーが出ました。

    次に上記のように public class NewDataGridViewのコンストラクタにRowTemplateとしてカスタム行を登録しました。

            public NewDataGridView()
            {
                NewDataGridViewRow row = new NewDataGridViewRow();
                this.RowTemplate = row;
            }

    一度起動すると正常起動できるのですが、正常にアプリでは作業できました。

            private void InitializeComponent()
            {
                ・・・・
                 
                  //
                  // newDataGridView1
                  //
               ・・・・
                  this.NewProp = null;
               ・・・・
                  //             
            }

    (前回はここまでで完全に解決かと思ったのですが、その後問題が発生しました。)

    3.次に起動すると、フォームデザイナ(Form1.Designer.cs)に自動的に追加したプロパティが登録されていて、

    「'System.Windows.Forms.DataGridViewRow' に 'NewProp' の定義が含まれておらず、型 'System.Windows.Forms.DataGridViewRow' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。:」

    というエラーが出ました。

    4.そこでRowTemplateの指定をコンストラクタからメソッドSetRowTemplate()として独立させFormに貼り付けForm_Loadで登録しました。

        public class NewDataGridView : DataGridView
        {
            public NewDataGridView()
            {
            }

            public void SetRowTemplate()
            {
                NewDataGridViewRow row = new NewDataGridViewRow();

                this.RowTemplate = row;
            }

               ・・・・   
        }
       
        //----------------
       
    private void Form1_Load(object sender, EventArgs e)
        {
            NewDataGridView1.SetRowTemplate();

            ・・・
        }

    ご報告でした。
    2009年10月1日 4:16
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    Hongliangさん、いつもお世話になっております。

    おやぢ2007さん、初めまして。
    MSDNフォーラムのご利用ありがとうございます。

    問題が解決して良かったですね(^-^)
    サンプルコードと一緒に、ご報告して頂けると他の方にも分かり易く、大変助かります!
    今回Hongliangさんのアドバイスが問題解決に繋がったようなので、
    勝手ながら、Hongliangさんからの投稿に、回答マークを付けさせてもらいました。

    今後ともMSDNフォーラムを宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年10月9日 4:37