You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataGridView中通过获取的图片URL显示图片

如何在DataGridView中通过URL显示图片?

我已经完成从SQL表中获取信息的全部代码,当前仅需将获取到的图片URL转换为图片并显示在DataGridView中。

当前应用截图:
应用截图

以下是我正在使用的代码:

FormOrders代码

namespace LamasoDemo
{
    public partial class FormOrders : Form
    {
        public FormOrders()
        {
            InitializeComponent();
            FillGridView();
        }

        void FillGridView()
        {
            List<Products> productsList = new List<Products>();
            Products products = new Products();
            productsList = products.GetProducts();
            dataGridViewProducts.DataSource = productsList;
        }
    }
}

Products类代码

public class Products
{
    public string? Image { get; set; }

    string connectionString = "Data Source=AHMEDBABAJAN;Initial Catalog=Lamaso1;Integrated Security=True;Trust Server Certificate=true";

    public List<Products> GetProducts()
    {
        List<Products> ProductsList = new List<Products>();
        SqlConnection con = new SqlConnection(connectionString);

        string selectSQL = "select  Image Status From GetProductsData";
        con.Open();

        SqlCommand cmd = new SqlCommand(selectSQL, con);
        SqlDataReader dr = cmd.ExecuteReader();

        if (dr != null)
        {
            while (dr.Read())
            {
                Products Products = new Products();
                Products.Image = dr["Image"].ToString();
                ProductsList.Add(Products);
            }
        }

        return ProductsList;
    }
}

先修正SQL语句错误

你的SQL查询语句存在语法问题:select Image Status From GetProductsData中Image和Status字段之间缺少逗号,会导致查询失败,需要改为:

select Image, Status From GetProductsData

解决方案:两种实现方式

方式一:通过DataGridView的CellFormatting事件动态加载图片

这种方式适合不想修改实体类结构的场景,在单元格渲染时自动从URL加载图片:

  1. 打开FormOrders的代码,添加CellFormatting事件绑定和处理逻辑,同时添加必要的命名空间引用:
using System.Net;
using System.IO;

namespace LamasoDemo
{
    public partial class FormOrders : Form
    {
        public FormOrders()
        {
            InitializeComponent();
            // 绑定单元格格式化事件
            dataGridViewProducts.CellFormatting += DataGridViewProducts_CellFormatting;
            FillGridView();
        }

        void FillGridView()
        {
            List<Products> productsList = new List<Products>();
            Products products = new Products();
            productsList = products.GetProducts();
            dataGridViewProducts.DataSource = productsList;
            
            // 配置图片列的显示样式
            if (dataGridViewProducts.Columns["Image"] != null)
            {
                dataGridViewProducts.Columns["Image"].Width = 120;
                ((DataGridViewImageColumn)dataGridViewProducts.Columns["Image"]).ImageLayout = DataGridViewImageCellLayout.Zoom;
            }
        }

        private void DataGridViewProducts_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            // 确认当前列是Image列,且单元格值为有效URL
            if (dataGridViewProducts.Columns[e.ColumnIndex].Name == "Image" && e.Value != null && !string.IsNullOrWhiteSpace(e.Value.ToString()))
            {
                try
                {
                    // 从URL下载图片并转换为Image对象
                    using (WebClient webClient = new WebClient())
                    {
                        byte[] imageBytes = webClient.DownloadData(e.Value.ToString());
                        using (MemoryStream ms = new MemoryStream(imageBytes))
                        {
                            e.Value = Image.FromStream(ms);
                        }
                    }
                }
                catch (Exception)
                {
                    // 加载失败时设置为空,也可以替换为默认占位图
                    e.Value = null;
                }
            }
        }
    }
}

方式二:在实体类中提前加载图片

如果希望在获取数据时就完成图片加载,可以修改Products类的Image属性类型为Image,在GetProducts方法中直接处理:

  1. 修改Products类代码,添加必要的命名空间:
using System.Net;
using System.IO;
using System.Drawing;

public class Products
{
    public Image? Image { get; set; }

    string connectionString = "Data Source=AHMEDBABAJAN;Initial Catalog=Lamaso1;Integrated Security=True;Trust Server Certificate=true";

    public List<Products> GetProducts()
    {
        List<Products> ProductsList = new List<Products>();
        SqlConnection con = new SqlConnection(connectionString);

        // 修正后的SQL语句
        string selectSQL = "select Image, Status From GetProductsData";
        con.Open();

        SqlCommand cmd = new SqlCommand(selectSQL, con);
        SqlDataReader dr = cmd.ExecuteReader();

        if (dr != null)
        {
            while (dr.Read())
            {
                Products product = new Products();
                string imageUrl = dr["Image"].ToString();
                
                if (!string.IsNullOrWhiteSpace(imageUrl))
                {
                    try
                    {
                        using (WebClient webClient = new WebClient())
                        {
                            byte[] imageBytes = webClient.DownloadData(imageUrl);
                            using (MemoryStream ms = new MemoryStream(imageBytes))
                            {
                                product.Image = Image.FromStream(ms);
                            }
                        }
                    }
                    catch (Exception)
                    {
                        product.Image = null;
                    }
                }
                
                ProductsList.Add(product);
            }
        }

        return ProductsList;
    }
}
  1. FormOrders的代码无需修改,绑定数据源后,DataGridView会自动识别Image类型并显示图片,同样可以在FillGridView方法中配置图片列的宽度和布局。

注意事项

  • 确保程序有访问图片URL的网络权限
  • 异常处理很重要,避免因无效URL、网络问题导致程序崩溃
  • 可以添加本地缓存逻辑,重复下载相同图片会浪费资源,比如用字典存储已加载的图片
  • 根据需求调整图片列的宽度和布局模式(Zoom、Stretch等)

内容的提问来源于stack exchange,提问作者Ahmed Babajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:45:58