1

I have a custom DataGridView with a number of different Cell Types which inherit from DataGridViewTextBoxCell and DataGridViewCheckBoxCell.

Each of these custom cells has a property for setting a background Colour (needed for some functionality of the grid) called CellColour.

For simplicity we'll take two of the custom cells:

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

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

PROBLEM:

This means that every time I want to set the CellColour property for a Grid Row which contains columns of both Type FormGridTextBoxColumn and FormGridCheckBoxColumn (which have CellTemplaes of the aforementioned custom Cell Types respectively) I have to do the following:

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

When you have 3+ different Cell Types, this is becoming arduous and I am convinced there is a better way of doing this.

SOLUTION SOUGHT:

I have it in my head that if I can create a single class which inherits from DataGridViewTextBoxCell and then have the custom Cell Types in turn inherit from this class:

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

public class FormGridTextBoxCell : FormGridCell
{
     ...
}

public class FormGridCheckBoxCell : FormGridCell
{
     ...
}

I will then only need to do the following:

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

Regardless of how many custom Cell Types there are (as they will all inherit from FormGridCell); any specific control-driven cell types will implement Windows Forms Controls within them.

WHY THIS IS A PROBLEM:

I have tried following this article:

Host Controls in Windows Forms DataGridView Cells

This works for the custom DateTime picker however hosting a CheckBox in the DataGridViewTextBoxCell is a different kettle of fish as there are different properties to control the value of the cells.

If there is an easier way to start with a DataGridViewTextBoxCell and change the Data Type in inherited classes to a pre-defined Data Type more easily than this then I am open to suggestions however the core issue is hosting a checkbox within a DataGridViewTextBoxCell.

Your_Unequal
  • 246
  • 1
  • 5
  • 17

1 Answers1

1

As I'm sure you've found, a single class may only inherit from one base class. What you are wanting is an interface, such as:

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

From there, you can create your sub-classes quite similarly, inheriting from their respective DataGridViewCell types as well as implementing the interface:

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

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

At this point the usage is as simple as you'd hoped; create the cells via the CellTemplate, and as needed just cast cells to the interface type and you're free to do as you wanted (to see the results visually, I set the cell's BackColor as an example):

if (cell is FormGridCell)
{
    (cell as FormGridCell).CellColor = Color.Green;
    cell.Style.BackColor = Color.Green;
}
else
{
    cell.Style.BackColor = Color.Red;
}
OhBeWise
  • 5,350
  • 3
  • 32
  • 60
  • That's exactly what I was after. Many thanks! And yes, the root of the issue was primarily due to only being able to inherit from a single base class. – Your_Unequal Apr 26 '16 at 16:40