VB以编程方式拉伸DataGridViewImageColumn图像

时间:2018-07-30 06:22:07

标签: vb.net image datagridview

我在做什么

我正在开发一个VisualBasic应用程序,其中GUI与数据操作(前端和后端)分开。这段特殊的代码跟踪已测量的序列号,并在表格中将其显示为DGV,其中包含序列号和图像,也可以不显示图像。

我的代码

在GUI窗体实例化的类中,我的数据存储在具有BindingSource的DataTable中,当我在程序中告诉它时,第二列显示Image(开头没有内容):

Public SerialNumbersBindingSource As New BindingSource
Public SerialNumbersDataTable As New DataTable
(...)
SerialNumbersBindingSource.DataSource = SerialNumbersDataTable
SerialNumbersDataTable.Columns.Add("Serial", Type.GetType("System.String"))
SerialNumbersDataTable.Columns.Add("Pass", MyImage.GetType)

在我的GUI表单代码中,DataGridView的DataSource设置为以前的DataTable:

DataGridViewSerialNumber.DataSource = MyObject.SerialNumbersDataTable

通过仅更新类中的DataTable,DataGridView会自动更新以反映其当前状态。我这样做:

SerialNumbersDataTable.Add(CurrentSerial, MyImage)

我得到的结果

代码有效,因此我可以修改和访问DataTable和DataGridView自动更新。但是图像没有拉伸,所以我只能看到其中的一小部分。

我需要什么

我需要DataGridView中名为“ Pass”的第二列来拉伸图像。

我尝试了什么

如果我访问该列,则将其视为DGVColumn而不是DGVImageColumn,因此Layout操作将失败。

DataGridViewSerialNumber.Columns("Pass").DataGridViewImageCellLayout.Stretch

Microsoft的“文档”页面告诉我要执行此操作,该页面将DGVImageColumn之类的列视为“ Pass”传递给我。之所以失败,是因为第一列是文本列,而不是图像。

For Each column As DataGridViewImageColumn In DataGridViewSerialNumber.Columns("Pass")
    column.ImageLayout = DataGridViewImageCellLayout.Stretch
Next

我还尝试创建一个本地DGVImageColumn,对其进行修改并将其写到原始列上,但是它是只读的。

Dim imageColumn As DataGridViewImageColumn
imageColumn = DataGridViewSerialNumber.Columns("Pass")
imageColumn.ImageLayout = DataGridViewImageCellLayout.Stretch
DataGridViewSerialNumber.Columns("Pass") = imageColumn

我也试图从设计师那里做到这一点。如果单击DGV,向右箭头和“编辑列”,则可以创建两列,然后将“传递为带有扩展布局的ImageColumn”设置为“ Pass as ImageColumn”。但是,当我将DGVSerialNumbers.Datasource设置到DataTable时,它将DataTable的列添加到DGV的列中。

Failed DGV with columns added in designer


如果您能帮助我解决这个问题,我将非常高兴。预先感谢!

1 个答案:

答案 0 :(得分:0)

是时候该学习如何投射了。如果要访问一列,请不要使用循环。只需访问所需的列,然后将其强制转换为您要用作的类型。您实际上还需要为适当的属性分配适当的值。

DirectCast(DataGridViewSerialNumber.Columns("Pass"), DataGridViewImageColumn).ImageLayout = DataGridViewImageCellLayout.Stretch

如果您想将其分解以求清楚:

Dim imageColumn = DirectCast(DataGridViewSerialNumber.Columns("Pass"), DataGridViewImageColumn)

imageColumn.ImageLayout = DataGridViewImageCellLayout.Stretch

另外,请注意,Stretch不会保留原始的宽高比,因此您可能要改用Zoom