C#如何在DataGridView列展示图片并解决列宽适配与空引用报错问题
问题解决方法
1. 空引用报错修复
出现空报错的根本原因是访问foto列的时机早于DataGridView绑定数据源的时机:
你在执行dtgvOfertas.DataSource = dt之前就尝试获取dtgvOfertas.Columns["foto"],此时DataGridView还未根据DataTable的结构生成对应列,拿到的是null值,调用属性就会触发空引用异常。
只需要调整代码顺序,把操作foto列的代码放到绑定数据源之后即可。
2. 列宽布局问题修复
图片列尺寸适配
要求图片列尺寸不小于图片本身大小,只需要给图片列设置MinimumWidth属性为你图片的宽度(300),再搭配合适的自适应模式即可。
其余列宽冗余修复
将其余列的自适应模式设置为DataGridViewAutoSizeColumnMode.AllCells,即可让列宽自动匹配内容实际宽度,不会出现冗余空白。
修正后完整代码
private void cargadatos() { try { conectar(); MySqlCommand cmd = new MySqlCommand("SELECT codigo," + " nombre, Id_Familia, precio" + " from OFERTAS ORDER BY Id_Familia, codigo asc;", conn); MySqlDataAdapter da = new MySqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); dt.Columns.Add("foto", Type.GetType("System.Byte[]")); foreach (DataRow drow in dt.Rows) { try { WebClient wc = new WebClient(); byte[] bytes = wc.DownloadData("http://encuadernadores4.synology.me/somisata/fotos_articulos/"+drow["codigo"].ToString()+".jpg"); MemoryStream ms = new MemoryStream(bytes); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); Bitmap bitmap=new Bitmap(img); Image resizedImage = resizeImage(bitmap, new Size(300, 300)); drow["foto"] = imageToByteArray(resizedImage); } catch (Exception ex) { MessageBox.Show(ex.Message); } } dtgvOfertas.RowTemplate.Height = 300; dtgvOfertas.DefaultCellStyle.WrapMode = DataGridViewTriState.True; // 先绑定数据源 dtgvOfertas.DataSource = dt; // 绑定完成后再操作列属性 dtgvOfertas.Columns["foto"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dtgvOfertas.Columns["foto"].MinimumWidth = 300; // 其他列自适应内容宽度 for (int i = 0; i < dtgvOfertas.ColumnCount; i++) { if (dtgvOfertas.Columns[i].Name != "foto") { dtgvOfertas.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; } dtgvOfertas.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dtgvOfertas.Columns[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; } } catch (Exception ex) { MessageBox.Show(ex.Message); } desconectar(); }
内容的提问来源于stack exchange,提问作者alexgmp6
相关产品推荐
相关产品推荐

