如何在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加载图片:
- 打开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方法中直接处理:
- 修改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; } }
- FormOrders的代码无需修改,绑定数据源后,DataGridView会自动识别
Image类型并显示图片,同样可以在FillGridView方法中配置图片列的宽度和布局。
注意事项
- 确保程序有访问图片URL的网络权限
- 异常处理很重要,避免因无效URL、网络问题导致程序崩溃
- 可以添加本地缓存逻辑,重复下载相同图片会浪费资源,比如用字典存储已加载的图片
- 根据需求调整图片列的宽度和布局模式(Zoom、Stretch等)
内容的提问来源于stack exchange,提问作者Ahmed Babajan
相关产品推荐
相关产品推荐

