windows Forms編程里面有一個DataGridView控件,它不光是可以顯示數(shù)據(jù),可以顯示按鈕,復(fù)選框,甚至還可以顯示圖片。這些圖片可以來自于數(shù)據(jù)庫(用二進制的方式存儲的),也可以來自文件系統(tǒng)。下面是一個例子
【假設(shè)你有一個windows程序,并且窗體上有一個DataGridView控件,這個控件只有一個列(名稱為Image),類型為DataGridViewImageColumn】
public Form1()
{
InitializeComponent();
GetData();
}
private void GetData()
{
foreach (string s in Directory.GetFiles(@"E:\My Documents\圖片收藏\表情","*.gif"))
{
this.demoGrid.Rows.Add(s);//注意,雖然字段類型是Image,但我們這里只給它傳一個圖片路徑過去,真正讀取圖片是由下面的事件處理程序做的
}
}
/// <summary>
/// 這個事件就在嘗試對單元格進行格式化的時候觸發(fā)。在這里設(shè)置真正的圖片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void demoGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (demoGrid.Columns[e.ColumnIndex].Name.Equals("Image"))
{
string path = e.Value.ToString();
e.Value = GetImage(path);
}
}
public System.Drawing.Image GetImage(string path)
{
return System.Drawing.Image.FromFile(path);
}
以上的代碼確實可以實現(xiàn)我們的目的,就是從一個目錄中把所有的gif圖片讀取出來,然后顯示在DataGridView上面。如下圖所示
但是用Image.FromFile這個語法加載圖片有一個很大的問題:該文件就被我們當(dāng)前進程鎖定了。不光是別的程序無法使用它,如果當(dāng)前程序需要將其刪除(例如我們想刪除某行數(shù)據(jù)的同時把圖片也刪除掉),都會報告一個錯誤
為了解決這個問題,可以修改一下GetImage方法。如下面所示
public System.Drawing.Image GetImage(string path)
{
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open);
System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
fs.Close();
return result;
}