c# - 同时接收 PictureBox 和 DataGridViewImageCell 的函数

标签 c# winforms datagridview picturebox

我正在创建一个类来帮助修改 GUI 中的图像。图像可以位于 PictureBoxDataGridViewImageCell 中。该类将存储所有可以修改的图像的列表。该类的每个实例都将使用 PictureBoxDataGridViewImageCells,但不能同时使用两者。

有没有办法处理这两个输入?例如,它们之间是否有一些公共(public)接口(interface),或者是否有一种方法将它们转换为某个公共(public)父类?

最佳答案

好吧,你总是可以将它们视为 object ,但我建议您的类专门为这两种类型提供两个重载:

class MyClass
{
    public void AddImage(PictureBox image)
    {

    }

    public void AddImage(DataGridViewImageCell image)
    {

    }
}

如何在内部存储它取决于您。也许你有一个List<object>您将其转换到/转换出,或者您可能维护两个单独的列表,每个列表对应一种类型,或者您可能只是添加每个 image到包含对象的子集合。

对于共享类,我从MSDN上相信它们不共享除Object之外的基类。所以你必须坚持这一点或者用你自己的包含类包装它们。

编辑:这是一种通过包装接口(interface)和工厂来处理它的更全面的方法。

首先,定义一个具有基于共享的类型的接口(interface)(在本例中为 object ),您可以使用它来传递图像:

public interface IImageWrapper
{
    object RawImage { get; }
}

public class PictureBoxImageWrapper : IImageWrapper
{
    public object RawImage { get; private set; }

    public PictureBoxMyImage(PictureBox image)
    {
        this.RawImage = image;
    }
}

public class DataGridViewImageCellImageWrapper : IImageWrapper
{
    public object RawImage { get; private set; }

    public DataGridViewImageCellImageWrapper(DataGridViewImageCell image)
    {
        this.RawImage = image;
    }
}

然后,用户 API 的一个简单工厂可以使用 包装图像, 具有编译时安全性,可以严格支持哪些图像类型:

public class ImageWrapperFactory
{
    public IImageWrapper Create(PictureBox image)
    {
        return new PictureBoxImageWrapper(image);
    }

    public IImageWrapper Create(DataGridViewImageCell image)
    {
        return new DataGridViewImageCellImageWrapper(image);
    }
}

然后你的显示类或 View 可以接收这些IImageWrapper对象并将它们转换为可用类型:

public class MyDisplayClass
{
    private List<IImageWrapper> Images = new List<IImageWrapper>();

    public void AddImage(IImageWrapper image)
    {
        Images.Add(image);
    }

    private void AddImageToContainer(IImageWrapper image)
    {
        object rawImage = image.RawImage;

        if (rawImage is PictureBox)
            AddImageToContainerImpl((PictureBox)rawImage);
        else if (rawImage is DataGridViewImageCell)
            AddImageToContainerImpl((DataGridViewImageCell)rawImage);
        else
            throw new NotSupportedException();
    }

    private void AddImageToContainerImpl(PictureBox image)
    {
        //add to container
    }

    private void AddImageToContainerImpl(DataGridViewImageCell image)
    {
        //add to container
    }
}

一些示例用法:

PictureBox myImage = ...
MyDisplayClass myView = ...

myView.AddImage(ImageWrapperFactory.Create(myImage));

事实上,图像的基础类型并没有被强制执行。。如果您愿意,您可以更新工厂以返回强类型 IImageWrapper对象为 PictureBoxImageWrapper反过来,让显示类针对它支持的类进行强类型化,但这有点违背了目的(您也可以针对 PictureBox/DataGridViewImageCell 进行强类型化,就像我的第一个答案中那样。

编辑:另一种方法是为您的“工厂”利用隐式运算符。这样,您的 API 只是“传递”原始图像对象,如果它们受支持,则会找到隐式运算符。如果不是,那么您将收到编译时异常:

public sealed class ImageWrapper
{
    public object RawData { get; private set; }

    private ImageWrapper(object rawData)
    {
        this.RawData = rawData;
    }

    public static implicit operator ImageWrapper(PictureBox image)
    {
        return new ImageWrapper(image);
    }

    public static implicit operator ImageWrapper(DataGridViewImageCell image)
    {
        return new ImageWrapper(image);
    }
}


PictureBox myImage = ...
ImageControl unsupportedImage = ... 
MyDisplayClass myView = ...

myView.AddImage(myImage); //OK!
myView.AddImage(unsupportedImage);// compile error!

关于c# - 同时接收 PictureBox 和 DataGridViewImageCell 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462919/

相关文章:

winforms - 如何强制垂直滚动条在 WinForms 中的 AutoScroll 中始终可见?

C# 用组合框替换 DataGridView 中的默认文本框

C# 将 DataTable 绑定(bind)到现有的 DataGridView 列定义

c# - 如何确定哪个 DataRow 绑定(bind)到 DataGridViewRow

C#应用程序关闭问题

c# - 什么是定义站点中的引用结构

c# - 如何针对 mongodb 实现通用存储库?

c# - 如何像在 NoSQL 中那样实现 select ...?

c# - 如何异步这个长时间运行的方法?

c# - 在 C# 中向图像添加 EXIF 信息