如何获取DataGridViewImageColumn中图片的本地文件路径?
解决DataGridViewImageColumn保存图片本地路径的问题
你现在的问题是因为DataGridView的Image单元格里存的是Bitmap对象,直接取Cells[2].Value得到的是对象的字符串表示System.Drawing.Bitmap,而非图片路径。要解决这个问题,核心思路是把图片路径和图片一起存储,下面给你几个实用的方案:
方案1:添加隐藏列存储路径
这是最简单直接的方法,给DataGridView加一个不可见的文本列专门存路径:
- 先在DataGridView初始化时添加隐藏列:
// 假设你的DataGridView叫dataGridView_AbilityInfo_ClassAbllityInformation DataGridViewTextBoxColumn pathColumn = new DataGridViewTextBoxColumn(); pathColumn.Name = "IconPath"; pathColumn.Visible = false; // 设置为隐藏 form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Columns.Add(pathColumn);
- 当用户选择图片并添加到DataGridView时,除了设置Image列的Bitmap,同时把路径存入隐藏列:
// 假设你已经选好图片,pictureBox_AbilityInfo_Icon.ImageLocation是路径 Bitmap bmp = (Bitmap)Bitmap.FromFile(pictureBox_AbilityInfo_Icon.ImageLocation); // 添加新行或更新现有行 int newRowIndex = form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Rows.Add(); var row = form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Rows[newRowIndex]; row.Cells[2].Value = bmp; // 设置图片 row.Cells["IconPath"].Value = pictureBox_AbilityInfo_Icon.ImageLocation; // 存路径
- 保存时直接取隐藏列的值:
doc.Element("AbilityInformation").Element(abilityName).Add( new XAttribute("Icon", form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Rows[i].Cells["IconPath"].Value.ToString()) );
方案2:用自定义类作为数据源
如果你的DataGridView本来就用数据源绑定,推荐用这种方式,更规范:
- 定义一个包含图片和路径的类:
public class AbilityInfo { public Bitmap Icon { get; set; } public string IconPath { get; set; } // 其他属性比如能力名称等 }
- 初始化DataGridView的数据源为
List<AbilityInfo>:
List<AbilityInfo> abilityList = new List<AbilityInfo>(); form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.DataSource = abilityList; // 确保Image列绑定到Icon属性,不需要额外处理路径列(如果不需要显示可以设为隐藏)
- 添加图片时,直接往列表里加对象:
string imgPath = pictureBox_AbilityInfo_Icon.ImageLocation; Bitmap bmp = (Bitmap)Bitmap.FromFile(imgPath); abilityList.Add(new AbilityInfo { Icon = bmp, IconPath = imgPath }); // 刷新DataGridView(如果需要) form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Refresh();
- 保存时通过DataBoundItem获取路径:
var ability = form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Rows[i].DataBoundItem as AbilityInfo; doc.Element("AbilityInformation").Element(abilityName).Add( new XAttribute("Icon", ability.IconPath) );
方案3:利用Cell的Tag属性存路径
如果不想加新列或改数据源,可以把路径存在单元格的Tag属性里:
- 添加图片时:
Bitmap bmp = (Bitmap)Bitmap.FromFile(pictureBox_AbilityInfo_Icon.ImageLocation); var cell = form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Rows[i].Cells[2]; cell.Value = bmp; cell.Tag = pictureBox_AbilityInfo_Icon.ImageLocation; // 把路径存到Tag里
- 保存时取Tag的值:
doc.Element("AbilityInformation").Element(abilityName).Add( new XAttribute("Icon", form_MainUI.dataGridView_AbilityInfo_ClassAbllityInformation.Rows[i].Cells[2].Tag.ToString()) );
不管用哪种方案,后续加载数据时,只需要读取保存的路径,再用Bitmap.FromFile(路径)加载图片到DataGridView的Image列即可。
内容的提问来源于stack exchange,提问作者bjcasey
相关产品推荐
相关产品推荐

