在我的数据网格视图上显示照片时出错

Error while displaying photo on my datagridview

我无法在我的数据网格视图中显示来自 heidiSQL 的照片。有一个错误,我不知道如何处理它,因为我的源代码和我一起学习的人完全一样。唯一不同的是他使用的是phpmyadmin。

Student student = new Student();
private void StudentsList_Load(object sender, EventArgs e)
{
    // populate the datagridview with students data

    MySqlCommand command = new MySqlCommand("SELECT * FROM `students`");
    dataGridView1.ReadOnly = true;
    DataGridViewImageColumn picCol = new DataGridViewImageColumn();
    dataGridView1.RowTemplate.Height = 80;
    dataGridView1.DataSource = student.getStudents(command);
    picCol = (DataGridViewImageColumn)dataGridView1.Columns[7];
    picCol.ImageLayout = DataGridViewImageCellLayout.Stretch;
    dataGridView1.AllowUserToAddRows = false;
}

https://i.stack.imgur.com/Kilx0.png 我得到的错误

首先,我会使用列 Name 而不是 Index;这是它很容易混合的地方。我认为应该是:

picCol = (DataGridViewImageColumn)dataGridView1.Columns["ImageDBColumnName"];

这也适用于您的 DataSourceSELECT * 是一种不好的做法。您应该列出您的数据列并通过它们的名称进行引用。

那么,你的图片文件type是什么?你没有提到那个。

但我也会关注定义的顺序。您非常随机地设置属性,我建议先定义 DataGridView 属性,例如 Columns(最重要的是确保预期的图像列是 DataGridViewImageColumn 类型)并且仅在最后一刻,设置 DataGridView.DataSource。具体在这里我看到一个潜在的问题:

dataGridView1.DataSource = student.getStudents(command);
picCol = (DataGridViewImageColumn)dataGridView1.Columns[7];

我个人更喜欢使用 GUI 来设置 DataGridView 列,因为它从解决方案中卸载了大量代码,而且您可以肯定,它们是在您的代码执行之前设置的。但是,如果您的数据源恰好为空,您将失去这些定义。一个简单的解决方案是使用 DataTable 作为数据中介。

我已经解决了这个问题。当我将它转换为参数时,我需要将 .ToArray() 添加到我的图片变量中。

MySqlCommand command = new MySqlCommand();
String editQuery = "sql query";
command.CommandText = editQuery;
command.Connection = conn.getConnection();

command.Parameters.Add("@pic", MySqlDbType.Blob).Value = picture.ToArray();