DataGridViewTextBoxCell中的主机复选框

时间:2016-04-25 21:58:08

标签: c# datagridview datagridviewtextboxcell

我有一个自定义的DataGridView,它有许多不同的Cell Types,它们继承自DataGridViewTextBoxCell和DataGridViewCheckBoxCell。

每个自定义单元格都有一个属性,用于设置名为CellColour的背景颜色(网格的某些功能所需)。

为简单起见,我们将采用两个自定义单元格:

public class FormGridTextBoxCell : DataGridViewTextBoxCell
{
     public Color CellColour { get; set; }
     ...
}

public class FormGridCheckBoxCell : DataGridViewCheckBoxCell
{
     public Color CellColour { get; set; }
     ...
}

问题:

这意味着每次我想为Grid Row设置CellColour属性时,它包含Type TypeGridTextBoxColumn和FormGridCheckBoxColumn(分别具有上述自定义Cell Types的CellTemplaes)的列,我必须执行以下操作:

if(CellToChange is FormGridTextBoxCell)
{
     ((FormGridTextBoxCell)CellToChange).CellColour = Color.Red;
}
else if (CellToChange is FormGridCheckBoxCell)
{
     ((FormGridCheckBoxCell)CellToChange).CellColour = Color.Red;
}

如果您有3种以上不同的细胞类型,这将变得非常艰难,我相信有更好的方法可以做到这一点。

解决方案:

我觉得如果我可以创建一个继承自DataGridViewTextBoxCell的单个类,然后让自定义的Cell Types继承自这个类:

public class FormGridCell : DataGridViewTextBoxCell
{
     public Color CellColour { get; set }
}

public class FormGridTextBoxCell : FormGridCell
{
     ...
}

public class FormGridCheckBoxCell : FormGridCell
{
     ...
}

然后我只需要执行以下操作:

if(CellToChange is FormGridCell)
{
     ((FormGridCell)CellToChange).CellColour = Color.Red;
     ...
}

无论有多少自定义单元格类型(因为它们都将继承自FormGridCell);任何特定的控件驱动的单元格类型都将在其中实现Windows窗体控件。

为什么这是一个问题:

我试过这篇文章:

Host Controls in Windows Forms DataGridView Cells

这适用于自定义DateTime选择器,但是在DataGridViewTextBoxCell中托管CheckBox是一个不同的鱼群,因为有不同的属性来控制单元格的值。

如果有一种更简单的方法从DataGridViewTextBoxCell开始并将继承类中的数据类型更容易更改为预定义的数据类型,那么我愿意接受建议但是核心问题是在DataGridViewTextBoxCell中托管一个复选框

1 个答案:

答案 0 :(得分:1)

我确定你已经发现,一个类只能从一个基类继承。您想要的是interface,例如:

public interface FormGridCell
{
    Color CellColor { get; set; }
}

从那里开始,您可以非常相似地创建子类,继承各自的DataGridViewCell类型以及实施interface

public class FormGridTextBoxCell : DataGridViewTextBoxCell, FormGridCell
{
    public Color CellColor { get; set; }
}

public class FormGridCheckBoxCell : DataGridViewCheckBoxCell, FormGridCell
{
    public Color CellColor { get; set; }
}

此时使用情况就像您希望的那样简单;通过CellTemplate创建单元格,并根据需要将单元格转换为interface类型,并且您可以根据需要自由地进行操作(以视觉方式查看结果,我设置单元格&#39 ; s BackColor为例):

if (cell is FormGridCell)
{
    (cell as FormGridCell).CellColor = Color.Green;
    cell.Style.BackColor = Color.Green;
}
else
{
    cell.Style.BackColor = Color.Red;
}