DataGridView控件中顯示圖片及其注意事項

windows Forms編程裏面有一個DataGridView控件,它不光是可以顯示數據,可以顯示按鈕,複選框,甚至還可以顯示圖片。這些圖片可以來自於數據庫(用二進制的方式存儲的),也可以來自文件系統。下面是一個例子

【假設你有一個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>
/// 這個事件就在嘗試對單元格進行格式化的時候觸發。在這裏設置真正的圖片
/// </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);
}

以上的代碼確實可以實現我們的目的,就是從一個目錄中把所有的gif圖片讀取出來,然後顯示在DataGridView上面。如下圖所示

image

但是用Image.FromFile這個語法加載圖片有一個很大的問題:該文件就被我們當前進程鎖定了。不光是別的程序無法使用它,如果當前程序需要將其刪除(例如我們想刪除某行數據的同時把圖片也刪除掉),都會報告一個錯誤

image

爲了解決這個問題,可以修改一下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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章