需求如下,在DEV框架項目中,需要在表格中增加一列顯示圖片,並且能編輯該列圖片,然後進行保存等操作,最終效果如下 這裡使用的是PictureEdit控制項來實現,打開DEV GridControl設計器,在ColumnEdit選擇PictureEdit: 綁定圖片代碼如下: DataTable dtO ...
需求如下,在DEV框架項目中,需要在表格中增加一列顯示圖片,並且能編輯該列圖片,然後進行保存等操作,最終效果如下
這裡使用的是PictureEdit控制項來實現,打開DEV GridControl設計器,在ColumnEdit選擇PictureEdit:
綁定圖片代碼如下:
DataTable dtOutline = new DataTable("OutLine"); dtOutline.Columns.Add("outline", typeof(string)); dtOutline.Columns.Add("outline_pic", typeof(Image)); dtOutline.Columns.Add("cutspeed_min", typeof(float)); dtOutline.Columns.Add("cutspeed_max", typeof(float)); dtOutline.Columns.Add("cnt", typeof(float)); dtOutline.Rows.Add("", Properties.Resources.outline1, 200, 250, 100); dtOutline.Rows.Add("", Properties.Resources.outline2, 100, 120, 60); dtOutline.Rows.Add("", Properties.Resources.outline3, 150, 180, 100); dtOutline.Rows.Add("", Properties.Resources.outline4, 100, 120, 100); dgcOutline.DataSource = dtOutline;
編輯時,只需要點擊滑鼠右鍵--調用即可選擇圖片,由於本項目保存是將表格裡的數據存入本地.ini文件,因此我的方法是獲取到PictureEdit里的圖片然後存到本地的一個文件夾中,然後再將文件的路徑存入.ini文件,下次打開界面時先讀取.ini文件下對應的圖片路徑,再綁定到控制項,之所以這麼做是因為貌似PictureEdit無法像WEB端圖片控制項一樣直接獲取綁定的圖片路徑(如果大家知道怎麼獲取也可以留言告知)。
//保存圖片到文件夾 Bitmap outlinePic = null; if (dt.Rows[i]["outline_pic"] != DBNull.Value) outlinePic = (Bitmap)dt.Rows[i]["outline_pic"]; string picName = ""; if (outlinePic != null) { picName = $@"{Application.StartupPath}\Database\Files\CraftRecipe\outlinepic.png"; outlinePic.Save(picName); } //將圖片路徑存入ini以便讀取圖片並綁定 INI操作方法不再贅述自行實現 DesignSettings.INI.SetValue(sec, "outline_pic", outline_pic);
這裡有一點要註意,假如選擇的文件不是png格式,採用以上方式保存的圖片是無法正常打開的,可以限制PictureEdit文件選擇框的類型,在OpenFileDialogFilter輸入:圖片文件(*.png)|*.png即可,如圖:
讀取時不要使用Image.FromFile()的方式,該方法會使圖片文件被占用,當我們更換了圖片想要保存表格數據時,會報錯,這裡採用Image.FromStream()從流中綁定得以解決
public byte[] GetImageByte(String path) { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { BinaryReader br = new BinaryReader(fs); byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //將流讀入到位元組數組中 return imgBytesIn; } }
DataTable dtOutline = new DataTable("dtOutline"); dtOutline.Columns.Add("outline", typeof(string)); dtOutline.Columns.Add("outline_pic", typeof(Image)); dtOutline.Columns.Add("cutspeed_min", typeof(float)); dtOutline.Columns.Add("cutspeed_max", typeof(float)); dtOutline.Columns.Add("cnt", typeof(float)); string outline_pic = DesignSettings.INI.GetValue(sec, "outline_pic"); Image img = null; if (!string.IsNullOrEmpty(outline_pic)) { if (File.Exists(outline_pic)) { using (MemoryStream ms = new MemoryStream(GetImageByte(outline_pic))) { img = Image.FromStream(ms); } } } dtOutline.Rows.Add(outline, img, cutspeed_min, cutspeed_max, cnt); dgcOutline.DataSource = dtOutline;