VB以编程方式拉伸DataGridViewImageColumn图像



我在做什么

我正在开发一个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

微软的Docs页面告诉我这样做,它将DGVImageColumn这样的列视为我需要"传递"的列。它失败了,因为第一列是文本列,而不是图像列。

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,向右箭头和"编辑列",我可以创建这两列,并设置Pass as ImageColumn with Stretched Layout。但是,当我在DataTable中设置DGVSerialNumbers.Datasource时,它会将DataTable的列添加到DGV中。

在设计器中添加列的DGV失败

是时候学习如何进行强制转换了。如果您想访问一列,那么不要使用循环。只需访问您想要的列,然后将其强制转换为您想要使用的类型。您还需要实际将适当的值分配给适当的属性。

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

如果你想把它分解清楚:

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

另外,请注意,Stretch将不会保留原始的纵横比,因此您可能需要使用Zoom

相关内容

  • 没有找到相关文章

最新更新