DataGridViewTextBoxCell 中的“主机”复选框



我有一个自定义的DataGridView,其中包含许多不同的单元格类型,这些单元格类型继承自DataGridViewTextBoxCell和DataGridViewCheckBoxCell。

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

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

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

问题:

这意味着每次我想为网格行设置 CellColor 属性时,该网格行包含 FormGridTextBoxColumn 和 FormGridCheckBoxColumn(分别具有上述自定义单元格类型的 CellTemplaes)的列时,我都必须执行以下操作:

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

当你有3+不同的细胞类型时,这变得很困难,我相信有更好的方法可以做到这一点。

寻求的解决方案:

我脑子里想着,如果我能创建一个从 DataGridViewTextBoxCell 继承的类,然后让自定义单元格类型依次从这个类继承:

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 窗体控件。

为什么这是一个问题:

我尝试了以下文章:

Windows 窗体中的宿主控件 数据网格视图单元格

这适用于自定义日期时间选取器,但是在 DataGridViewTextBoxCell 中托管复选框是不同的鱼壶,因为有不同的属性来控制单元格的值。

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

我相信你已经发现,一个类只能从一个基类继承。你想要的是一个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 类型,您可以自由地按照自己的意愿进行操作(为了直观地查看结果,我设置了单元格的 BackColor 作为示例):

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

相关内容

  • 没有找到相关文章

最新更新