トップ回答者
型を引数として関数に渡したいのですが・・・

質問
-
お世話になっております。
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など、他のタイプも指定できるように
したいと思うのですが、皆様ならどように組まれますでしょうか。
ご意見・ご教示いただければ幸いです。
回答
-
別解として
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
-
>ご意見・ご教示いただければ幸いです。
単純にご要望のものであれば、以下ではどうでしょうか。
// メソッド 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
すべての返信
-
>ご意見・ご教示いただければ幸いです。
単純にご要望のものであれば、以下ではどうでしょうか。
// メソッド 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
-
別解として
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