none
型を引数として関数に渡したいのですが・・・ RRS feed

  • 質問

  • お世話になっております。

    VS2008でC#を用いてDataGridViewのカラムを追加する関数を作りたいと思っております。

    private void _Load(String clmName)
    {
      DataGridViewTextBoxColumn clm = new DataGridViewTextBoxColumn();
      this.dataGridView1.Columns.Add(clm);
      clm.HeaderText = clmName;
    }
    

    これを

    private void _Load(String clmName, カラムのタイプ)
    {
    
    }
    

    のようにDataGridViewTextBoxColumnの部分をDataGridViewComboBoxColumnなど、他のタイプも指定できるように

    したいと思うのですが、皆様ならどように組まれますでしょうか。

    ご意見・ご教示いただければ幸いです。

    2010年10月19日 9:39

回答

  • 別解として

    void AddColumn<T>( string columnName ) where T: DataGridViewColumn, new(){
       dataGridView1.Columns.Add( new T{ HeaderText = columnName } );
    }

    void button1_Click( object sender, EventArgs e ){
        AddColumn<DataGridViewTextBoxColumn>( "カラム1" );
        AddColumn<DataGridViewButtonColumn>( "カラム2" );
        AddColumn<DataGridViewCheckBoxColumn>( "カラム3" );
        AddColumn<DataGridViewComboBoxColumn>( "カラム4" );
        AddColumn<DataGridViewImageColumn>( "カラム5" );
        AddColumn<DataGridViewLinkColumn>( "カラム6" );
        AddColumn<DataGridViewTextBoxColumn>( "カラム7" );
    }

    とか。genericを使うことで、型キャストを排除しています。これにより、指定した型が正しいかどうかをコンパイラが判断してくれます。

    • 回答としてマーク spna 2010年10月19日 23:35
    2010年10月19日 11:55
  • >ご意見・ご教示いただければ幸いです。

     

    単純にご要望のものであれば、以下ではどうでしょうか。

    // メソッド
    private void AddColumn(String clmName, Type t)
    {
    	object obj = Activator.CreateInstance(t);
    	((DataGridViewColumn)obj).HeaderText = clmName;
    	this.dataGridView1.Columns.Add((DataGridViewColumn)obj);
    }
    
    // 動作確認
    private void button1_Click(object sender, EventArgs e)
    {
    	AddColumn("カラム1", typeof(DataGridViewTextBoxColumn));
    	AddColumn("カラム2", typeof(DataGridViewButtonColumn));
    	AddColumn("カラム3", typeof(DataGridViewCheckBoxColumn));
    	AddColumn("カラム4", typeof(DataGridViewComboBoxColumn));
    	AddColumn("カラム5", typeof(DataGridViewImageColumn));
    	AddColumn("カラム6", typeof(DataGridViewLinkColumn));
    	AddColumn("カラム7", typeof(DataGridViewTextBoxColumn));
    }
    
    

    • 回答としてマーク spna 2010年10月19日 23:35
    2010年10月19日 10:16

すべての返信

  • >ご意見・ご教示いただければ幸いです。

     

    単純にご要望のものであれば、以下ではどうでしょうか。

    // メソッド
    private void AddColumn(String clmName, Type t)
    {
    	object obj = Activator.CreateInstance(t);
    	((DataGridViewColumn)obj).HeaderText = clmName;
    	this.dataGridView1.Columns.Add((DataGridViewColumn)obj);
    }
    
    // 動作確認
    private void button1_Click(object sender, EventArgs e)
    {
    	AddColumn("カラム1", typeof(DataGridViewTextBoxColumn));
    	AddColumn("カラム2", typeof(DataGridViewButtonColumn));
    	AddColumn("カラム3", typeof(DataGridViewCheckBoxColumn));
    	AddColumn("カラム4", typeof(DataGridViewComboBoxColumn));
    	AddColumn("カラム5", typeof(DataGridViewImageColumn));
    	AddColumn("カラム6", typeof(DataGridViewLinkColumn));
    	AddColumn("カラム7", typeof(DataGridViewTextBoxColumn));
    }
    
    

    • 回答としてマーク spna 2010年10月19日 23:35
    2010年10月19日 10:16
  • 別解として

    void AddColumn<T>( string columnName ) where T: DataGridViewColumn, new(){
       dataGridView1.Columns.Add( new T{ HeaderText = columnName } );
    }

    void button1_Click( object sender, EventArgs e ){
        AddColumn<DataGridViewTextBoxColumn>( "カラム1" );
        AddColumn<DataGridViewButtonColumn>( "カラム2" );
        AddColumn<DataGridViewCheckBoxColumn>( "カラム3" );
        AddColumn<DataGridViewComboBoxColumn>( "カラム4" );
        AddColumn<DataGridViewImageColumn>( "カラム5" );
        AddColumn<DataGridViewLinkColumn>( "カラム6" );
        AddColumn<DataGridViewTextBoxColumn>( "カラム7" );
    }

    とか。genericを使うことで、型キャストを排除しています。これにより、指定した型が正しいかどうかをコンパイラが判断してくれます。

    • 回答としてマーク spna 2010年10月19日 23:35
    2010年10月19日 11:55
  • 佐祐理様 honefai様

    2パターンいただいたことでより理解が深まりました。

    ご教示誠にありがとうございました。

    • 回答の候補に設定 fuldat 2017年5月1日 7:18
    2010年10月19日 23:35