0

在我的项目中,我将 ComboBox、Text、Link 标签添加到我的 DataGridView 中dgvMain。我为不同的单元格模板创建了不同的方法,如下所示:(下面的代码有效

gridLnklbl(字符串标题名称)

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

gridCmb(字符串标题名称)

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

gridText(字符串标题名称)

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

如您所见,除了对象的声明外,每个方法的代码都是重复的。只是想知道,可以将重复代码转换为单一方法吗?我不知道该怎么做.. 它不是关于 3 行代码,我已经写了更多可以与这些方法通用的行。

4

4 回答 4

1

您的所有列类型都派生自DataGridViewColumn,它具有 HeaderText 和 Name 属性。您可以创建一个采用此基本类型的方法,并设置值:

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); 
    }
}

有一个约束TCol确保它是DataGridViewColumn.

像这样调用扩展方法

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 回答