【问题标题】:DataGridView not showing .bmpDataGridView 不显示 .bmp
【发布时间】:2018-05-23 13:26:57
【问题描述】:

我有 sn-p 代码来执行以下操作:

- 两个 ListBox 绑定在一起。第一个显示目录,第二个显示子文件夹。
-DataGridView 显示 .bmp 文件。

我只需要设置一个名为(Blocks)的列,并添加双击事件以插入dwg文件。

public partial class Form1 : Form
{
    private string rootDirectory = @"D:\test\Blocks";


    public Form1()
    {
        InitializeComponent();

    }


    private void Form1_Load(object sender, EventArgs e)
    {
        listBox1.DataSource = Directory.GetDirectories(rootDirectory).Select(Path.GetFileName).ToList();
        listBox1.SelectedIndexChanged += ListBox1_SelectedIndexChanged;
        listBox2.SelectedIndexChanged += ListBox2_SelectedIndexChanged;

        DataGridViewImageColumn dgvimgcol = new DataGridViewImageColumn();
        dgvimgcol.ImageLayout = DataGridViewImageCellLayout.Stretch;
        dgvimgcol.Width = 250;
        dgvimgcol.HeaderText = "Blocks";
        dgvimgcol.Image = null;
        dataViewImages.RowTemplate.Height = 300;
        dataViewImages.Columns.Add(dgvimgcol);
        dataViewImages.AllowUserToAddRows = false;
        dataViewImages.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    }


    private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // When an item changes in the first listbox, update the second listbox datasource
        var parentDir = Path.Combine(rootDirectory, listBox1.SelectedItem.ToString());
        listBox2.DataSource = Directory.GetDirectories(parentDir).Select(Path.GetFileName).ToList();
    }

    private void ListBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        // When an item changes in the second listbox, update the datagridview datasource
        var parentDir = Path.Combine(rootDirectory, listBox1.SelectedItem.ToString(),
        listBox2.SelectedItem.ToString());
        dataViewImages.DataSource = Directory.GetFiles(parentDir).Select(f => new { FileName = Path.GetFileName(f) }).ToList();
    }
}

【问题讨论】:

  • 您正在绑定一个恰好是文件名的字符串列表。网格不会知道您希望它读取这些图像并将它们显示在另一列中。您的数据源还应包含 Image 属性。
  • 感谢@Crowcoder 重播。可以举个例子吗

标签: c# datagridview


【解决方案1】:

Here is a demo I created for you on Github

为简单起见,我只演示了如何创建自定义类型的绑定列表,其中包含网格将知道如何显示的Image 类型的属性。图像存储在项目中。

视图模型有两个属性:

using System.Drawing;

namespace ImageGrid
{
    class FilesViewModel
    {
        public string FileName { get; set; }
        public Image Picture { get; set; }
    }
}

表单具有创建视图模型列表(具体来说,我使用的是 BindingList)的代码。它读取“images”文件夹中的所有文件并为每个文件构建一个新实例,为Picture 属性创建一个System.Drawing.Image。 最后,它将网格的DataSource 设置为列表:

private void Form1_Load(object sender, EventArgs e)
{
    BindingList<FilesViewModel> vmList = new BindingList<FilesViewModel>();

    string[] theFiles = Directory.GetFiles(Path.Combine(Environment.CurrentDirectory, "images"));

    foreach (string f in theFiles)
    {
        Image img = Image.FromFile(f);
        vmList.Add(new FilesViewModel { FileName = Path.GetFileName(f), Picture = img });
    }

    dataGridView1.DataSource = vmList;
}

【讨论】:

  • 它工作得很好,但我有一个问题。当我添加 .dwg 文件时,我在 DataGridView (.bmp + .dwg) 中显示的文件夹中添加了两个扩展文件它崩溃了跨度>
  • 我认为.dwg 不是Image 的有效格式。我只看了at this,但看起来 AutoCad 有一个可以将绘图转换为图像的 API,所以如果你想显示这些文件,你还有更多工作要做。
  • 是的,我知道我想知道是否有办法只在 DataGridView 中显示 .bmp 扩展名
  • 是的,您可以在if 块中检查文件名是否以“.bmp”结尾。您可能还应该使用异常处理,以实现一般的鲁棒性,以防某些小丑将非图像文件命名为 .bmp 扩展名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多