如何在datagridviewcell上绘制自定义控件?

时间:2012-10-29 08:40:46

标签: c# winforms datagridview custom-controls

我想为datagridviewcell托管自定义控件。

我唯一的好参考是http://msdn.microsoft.com/en-us/library/7tas5c80.aspx

但是,我希望单元格在

上显示我自己的用户控件
 public class CustomCell : DataGridViewTextBoxCell
 {   
     protected override void Paint(System.Drawing.Graphics graphics,
       System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds,
        int rowIndex, DataGridViewElementStates cellState, object value, object 
          formattedValue, string errorText, DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
     {
          base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
            formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);               
     }
 }

有谁能指导我怎么做?

1 个答案:

答案 0 :(得分:1)

为了节省资源,DataGridView控件中的单元格大部分时间都处于显示模式,只有当用户使用鼠标或键盘进入单元格时才更改为编辑模式。您在问题中提到的示例被视为最佳做法,因为编辑控件(在这种情况下,DateTimePicker,但可能很容易就是您自己的自定义用户控件)只出现在编辑模式中,并且因此,一次只能用于一个小区。

当单元格未处于编辑模式时,它应使用Paint子类的DataGridViewCell方法内的逻辑呈现其值的等效表示。您可以通过以下几种方式之一完成此任务:

  • 只需根据单词的值将文本或图像绘制到单元格的边界上;不要试图复制编辑控件的外观。
  • 使用ControlPaintVisualStyleRenderer模拟编辑控件的外观(注意:这涉及大量额外工作)。
  • 将绘制代码从自定义用户控件移动到实用程序类中,以便它和单元格都可以使用相同的绘制代码。

在大多数情况下,第一种选择就足够了;如果重要的是单元格看起来与编辑控件完全相同,则只尝试其他方法之一。