zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    Flash中先获取flv的尺寸然后再显示的方法
    雕虫小艺:Slider控件的制作(Flash)
    用几十行代码写一个可以在PC Web,PC桌面,安卓,iOS上运行的程序
    仰望星空,结果南辕北辙
    Flash播放mp4的两个问题:编码问题和需要下载完后才能播放的问题
    只学一点点:我的技术学习策略
    2012年计划
    提高ipad浏览器下大尺寸xml文件解析的性能
    html5/haXe开发偶感
    支点:技术选择的精髓
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1238571.html
Copyright © 2011-2022 走看看