在 DataGridViewTextBoxCell 中托管复选框
Host Checkbox in a DataGridViewTextBoxCell
我有一个自定义 DataGridView,其中包含许多继承自 DataGridViewTextBoxCell 和 DataGridViewCheckBoxCell 的不同单元格类型。
每个自定义单元格都有一个 属性 用于设置称为 CellColour 的背景颜色(网格的某些功能需要)。
为简单起见,我们将采用两个自定义单元格:
public class FormGridTextBoxCell : DataGridViewTextBoxCell
{
public Color CellColour { get; set; }
...
}
public class FormGridCheckBoxCell : DataGridViewCheckBoxCell
{
public Color CellColour { get; set; }
...
}
问题:
这意味着每次我想为包含 FormGridTextBoxColumn 和 FormGridCheckBoxColumn 类型的列(分别具有上述自定义单元格类型的 CellTemplaes)的网格行设置 CellColour 属性 时,我必须做以下:
if(CellToChange is FormGridTextBoxCell)
{
((FormGridTextBoxCell)CellToChange).CellColour = Color.Red;
}
else if (CellToChange is FormGridCheckBoxCell)
{
((FormGridCheckBoxCell)CellToChange).CellColour = Color.Red;
}
当你有 3 种以上不同的细胞类型时,这会变得很困难,我相信有更好的方法来做到这一点。
寻求的解决方案:
我的想法是,如果我可以创建一个继承自 DataGridViewTextBoxCell 的单个 class,然后让自定义单元格类型依次继承自此 class:
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
这适用于自定义日期时间选择器,但是在 DataGridViewTextBoxCell 中托管复选框是另一回事,因为有不同的属性来控制单元格的值。
如果有更简单的方法从 DataGridViewTextBoxCell 开始并将继承的 classes 中的数据类型更改为预定义的数据类型比这更容易,那么我愿意接受建议但是核心问题在 DataGridViewTextBoxCell 中托管一个复选框。
我相信您已经发现,单个 class 只能从一个基数 class 继承。你想要的是一个interface
,例如:
public interface FormGridCell
{
Color CellColor { get; set; }
}
从那里,您可以非常相似地创建您的子classes,继承它们各自的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;
}
我有一个自定义 DataGridView,其中包含许多继承自 DataGridViewTextBoxCell 和 DataGridViewCheckBoxCell 的不同单元格类型。
每个自定义单元格都有一个 属性 用于设置称为 CellColour 的背景颜色(网格的某些功能需要)。
为简单起见,我们将采用两个自定义单元格:
public class FormGridTextBoxCell : DataGridViewTextBoxCell
{
public Color CellColour { get; set; }
...
}
public class FormGridCheckBoxCell : DataGridViewCheckBoxCell
{
public Color CellColour { get; set; }
...
}
问题:
这意味着每次我想为包含 FormGridTextBoxColumn 和 FormGridCheckBoxColumn 类型的列(分别具有上述自定义单元格类型的 CellTemplaes)的网格行设置 CellColour 属性 时,我必须做以下:
if(CellToChange is FormGridTextBoxCell)
{
((FormGridTextBoxCell)CellToChange).CellColour = Color.Red;
}
else if (CellToChange is FormGridCheckBoxCell)
{
((FormGridCheckBoxCell)CellToChange).CellColour = Color.Red;
}
当你有 3 种以上不同的细胞类型时,这会变得很困难,我相信有更好的方法来做到这一点。
寻求的解决方案:
我的想法是,如果我可以创建一个继承自 DataGridViewTextBoxCell 的单个 class,然后让自定义单元格类型依次继承自此 class:
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
这适用于自定义日期时间选择器,但是在 DataGridViewTextBoxCell 中托管复选框是另一回事,因为有不同的属性来控制单元格的值。
如果有更简单的方法从 DataGridViewTextBoxCell 开始并将继承的 classes 中的数据类型更改为预定义的数据类型比这更容易,那么我愿意接受建议但是核心问题在 DataGridViewTextBoxCell 中托管一个复选框。
我相信您已经发现,单个 class 只能从一个基数 class 继承。你想要的是一个interface
,例如:
public interface FormGridCell
{
Color CellColor { get; set; }
}
从那里,您可以非常相似地创建您的子classes,继承它们各自的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;
}