C# 自定义DataGridView列-哪里出了问题?

C# 自定义DataGridView列-哪里出了问题?,c#,datagridview,C#,Datagridview,我需要创建一个新的DataGridView列类型,它允许以下操作: 多个图像的小缩略图,如果需要可以拆分为多行 是 在每个缩略图上悬停或单击的功能,将显示完整大小的图像 将缩略图从一行拖动到另一行的功能 一步一个脚印,我试图让它至少能正确显示图像。以下是我的专栏代码: public class DataGridViewPODColumn : DataGridViewColumn { public DataGridViewPODColumn() { this.

我需要创建一个新的DataGridView列类型,它允许以下操作:

  • 多个图像的小缩略图,如果需要可以拆分为多行 是
  • 在每个缩略图上悬停或单击的功能,将显示完整大小的图像
  • 将缩略图从一行拖动到另一行的功能
一步一个脚印,我试图让它至少能正确显示图像。以下是我的专栏代码:

public class DataGridViewPODColumn : DataGridViewColumn
{
    public DataGridViewPODColumn()
    {
         this.CellTemplate = new DataGridViewPODCell();
    }

    public override object Clone()
    {
         return base.Clone()
    }
}
这是该单元的代码:

public class DataGridViewPODCell : DataGridViewTextBoxCell
{
    private static Type defaultValueType = typeof(List<PODImage>);
    private int _XCoordinate = 0;
    private int _YCoordinate = 0;

    public int XCoordinate { get { return _XCoordinate; } set { _XCoordinate = value; } }
    public int YCoordinate { get { return _YCoordinate; } set { _YCoordinate = value; } }

    public override Type ValueType
    {
        get
        {
            Type valueType = base.ValueType;
            if (valueType != null) return valueType;
            return defaultValueType;
        }
    }

    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)
    {

        if (this.DataGridView == null) return;
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

        int counter = 0;
        foreach (PODImage podVal in (List<PODImage>)value)
        {
            GraphicsContainer container = graphics.BeginContainer();
            graphics.SetClip(cellBounds);
            Point objPoint = new Point(cellBounds.Location.X + XCoordinate, cellBounds.Location.Y + YCoordinate);
            graphics.DrawImage(podVal.POD, objPoint.X, objPoint.Y, 20, 40);
            XCoordinate += 22;
            counter++;
            if (counter % 3 == 0)
            {
                YCoordinate += 42;
                XCoordinate = 0;
            }
        }
    }
公共类DataGridViewPODCell:DataGridViewTextBoxCell { 私有静态类型defaultValueType=typeof(列表); 私有int XCoordinate=0; 私有整数协调=0; public int XCoordinate{get{return{uxcoordinate;}set{{uxcoordinate=value;}} 公共int-YCoordinate{get{return}u-YCoordinate;}set{u-YCoordinate=value;} 公共重写类型ValueType { 收到 { 类型valueType=base.valueType; 如果(valueType!=null)返回valueType; 返回defaultValueType; } } 保护覆盖无效涂料(System.Drawing.Graphics Graphics、System.Drawing.Rectangle剪贴簿、System.Drawing.Rectangle cellBounds、int rowIndex、DataGridViewElementState cellState、对象值、对象格式化值、字符串错误文本、DataGridViewCellStyle cellStyle、DataGridViewAdvancedBorderStyle advancedBorderStyle、DataGridViewPaintParts paintParts) { if(this.DataGridView==null)返回; 绘制(图形、剪贴簿、单元格边框、行索引、单元格状态、值、格式化值、错误文本、单元格样式、高级边框样式、绘制部件); int计数器=0; foreach(PODImage podVal in(列表)值) { GraphicsContainer容器=graphics.BeginContainer(); 图形.SetClip(cellBounds); 点objPoint=新点(cellBounds.Location.X+XCoordinate,cellBounds.Location.Y+YCoordinate); graphics.DrawImage(podVal.POD,objPoint.X,objPoint.Y,20,40); XCoordinate+=22; 计数器++; 如果(计数器%3==0) { YCoordinate+=42; XCoordinate=0; } } } 但是,我对此有一些主要问题:

  • 我无法通过DGV设计器添加我的列-当我为列选择该类型并单击“添加”时,它不会添加列,因此我必须在代码中添加
  • 行的大部分变为黑色,单击图像会使其向右移动(即,它似乎认为这是一个新图像)
  • “收藏”一词显示在图像后面
  • 我知道这可能是相当基本的东西!我是Windows窗体开发的新手,去年只在ASP.NET中工作过……哦,我多么渴望我的GridView和TemplateField


    如果有人能给我指出正确的方向,我将不胜感激。

    在接下来的几天里,当我有一分钟的空闲时间时,我会仔细考虑你的问题,但我想我会建议,如果可能的话,使用WPF——你想用WPF网格做的事情非常简单。