【问题标题】:How to paint custom control on datagridviewcell?如何在 datagridviewcell 上绘制自定义控件?
【发布时间】:2012-10-29 16:57:01
【问题描述】:

我想为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);               
     }
 }

谁能指导我怎么做?

【问题讨论】:

    标签: c# winforms datagridview custom-controls


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如何将用户控件“绘制”到单元格上以显示模式?
    • @Melvin 如果它是一个完全由用户绘制的控件,您可以运行与该控件的Paint 方法中相同的代码。如果它是一个复合控件(上面有其他控件),您可以将控件绘制到中间Bitmap(使用DrawToBitmap 方法),然后将位图绘制到单元格上,否则您将不得不还原到我描述的第二种技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2012-04-03
    • 2017-04-09
    相关资源
    最近更新 更多