0

私のプロジェクトでは、ComboBox、Text、Link ラベルを DataGridView に追加していますdgvMain。以下に示すように、さまざまなセル テンプレートに対してさまざまなメソッドを作成しました (以下のコードは機能しています) 。

gridLnklbl(string headerName)

   DataGridViewLinkColumn col = new DataGridViewLinkColumn();
   col.HeaderText = headerName;     //
   col.Name = "col" + headerName;   // same code repeating to all the methods
   dgvMain.Columns.Add(col);        //

gridCmb(string headerName)

   DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
   col.HeaderText = headerName;
   col.Name = "col" + headerName;
   dgvMain.Columns.Add(col);

gridText(string headerName)

   DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
   col.HeaderText = headerName;
   col.Name = "col" + headerName;
   dgvMain.Columns.Add(col);  

ご覧のとおり、オブジェクトの宣言を除いて、すべてのメソッドのコードが繰り返されています。知りたいのですが、繰り返しコードを単一のメソッドに変換できますか? 私はそれを行う方法を知りません..それは行の約3つのコードではありません.私はそれらの方法に共通にすることができるより多くの行を書きました.

4

4 に答える 4

1

すべての列タイプは、プロパティ HeaderText および Name を持つDataGridViewColumnから派生します。この基本型を取り、値を設定するメソッドを作成できます。

public void AddColumnHeader(DataGridViewColumn column, string headerName)
{
    column.HeaderText = headerName;
    column.Name = "col" + headerName;
    dgvMain.Columns.Add(column);
}

使用法は次のようになります

DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();

AddColumnHeader(col, "Header name");

Jonathon Reinhart には、拡張メソッドを使用したよりクリーンなソリューションがあります。これを使用することをお勧めします。

于 2012-11-20T05:02:22.453 に答える
1

で一般的な 拡張メソッドを使用しますDataGridView

public static class ExtensionMethods {

    public static void AddColumn<TCol>(this DataGridView dgv, string headerName) 
        where TCol : DataGridViewColumn, new()
    {
       var col = new TCol {
           HeaderText = headerName,
           Name = "col" + headerName,
       };
       dgv.Columns.Add(col); 
    }
}

のサブクラスであることを保証する制約があります。TColDataGridViewColumn

拡張メソッド を次のように呼び出します。

dgvMain.AddColumn<DataGridViewLinkColumn>(headerName);
于 2012-11-20T05:02:22.970 に答える
0

これらのすべてのクラスがインターフェースまたはスーパークラスを共有していると仮定すると (おそらく共有しているように見えます)、次のように記述できます。

void AddColumns(params ColumnSuperType[] columns) {
    for...
}

ここで、「ColumnSuperType」は、関連する親の型またはインターフェイスが何であれです。

それからあなたはすることができます

AddColumns(new DataGridViewTextBoxColumn(), new DataGridViewComboBoxColumn(), etc)
于 2012-11-20T05:02:35.747 に答える
0

すべての列オブジェクトは DataGridViewColumn から派生しています。次のようにしてみてください。

private void yourMethode(DataGridViewColumn col)
{
   col.HeaderText = headerName;     
   col.Name = "col" + headerName;   
   dgvMain.Columns.Add(col);   
}
于 2012-11-20T05:03:05.137 に答える