将图像添加到下一个可用的图片框

时间:2019-04-08 01:26:01

标签: vb.net

我正在通过卡片数据库进行甲板制造商项目,到目前为止,当我单击一行(使用datagridview)时,“ image_url”列中包含的值被打印到一个不可见的文本框中,然后用于下载该图像并将其显示在图片框中。

现在,一切正常,但是卡座最多可以容纳60张卡片,因此我将使用60个图片框打印用户选择的卡片。我一直试图做的是像设置图片计数一样,当他们选择一列时,数字会像这样增加一个:

picturebox(picturecount) = textbox4.text

但是我遇到了太多错误。您知道在下一个可用的图片框中显示用户选择的卡片的方法吗?例如,如果他们三次选择“黑暗魔术师”,则“黑暗魔术师”的图像会打印在前三个可用的图片框中

VB.NET:

Private Async Sub PictureLoader()
    Dim imageURL As String

    If TextBox4.Text = "" Then
        imageURL = dataSet.Tables("YGO cards").Rows(row_count).Item(7)
    Else
        imageURL = TextBox4.Text
    End If

    Dim client As Net.WebClient = New Net.WebClient()
    Dim ms As MemoryStream = New MemoryStream(Await client.DownloadDataTaskAsync(New Uri(imageURL)))

    Using image As Image = Image.FromStream(ms)
        PictureBox1.Image?.Dispose()
        PictureBox1.Image = DirectCast(image.Clone(), Image)
    End Using

    ms.Dispose()
    client.Dispose()
End Sub

这是在数据网格中选择一列时的事件!

Dim index As Integer
        index = e.RowIndex
        Dim selectedrow As DataGridViewRow
        selectedrow = DataGridView1.Rows(index)
' selectedrow.Cells(1) is the image_Url column        
TextBox4.Text = selectedrow.Cells(1).Value.ToString()

        If TextBox4.Text = "" Then
            PictureBox1.Image = Nothing
            ' imageURL = dataSet.Tables("YGO cards").Rows(row_count).Item(7)
        Else
            PictureLoader()
        End If

1 个答案:

答案 0 :(得分:1)

暂时忽略特定问题的细节,并将其分解为一般性陈述。您的意思是您有一个集合,并且集合的大小可以根据用户输入而增大或缩小。对于List(Of T)而言,这是一个理想的情况,您可以通过指定列表将保留的项目的数据类型来声明列表,然后根据需要添加项目。因为要存储卡的URL,所以需要创建一个新的List(Of String):

Dim cards As List(Of String) = New List(Of String)

现在,每当需要将URL添加到列表中时,如果是单个URL,则将调用Add方法;如果是多个URL,则将调用AddRange:

cards.Add(TextBox1.Text)
'Or
cards.AddRange({TextBox1.Text, TextBox2.Text, TextBox3.Text})

就在PictureBox中显示图像而言,考虑到PictureBox类具有LoadLoadAsync(看起来像您想要的那样),实际上不需要创建MemoryStream并克隆Image。异步功能)方法。但是,如果您想为集合中的每个项目创建一个PictureBox,则需要遍历该集合,创建一个新的PictureBox,在当前迭代的URL上调用Load或Load Async方法,然后将其添加到Form(或一般的容器)。这可以使用传统的For / Each循环来完成:

'Create a placeholder variable
Dim cardPictureBox As PictureBox

'Loop through every selected card URL
For Each url As String In Cards
    'Create a new PictureBox
    cardPictureBox = New PictureBox() With {
        .Size = New Size(100, 100)
        .SizeMode = PictureBoxSizeMode.CenterImage
        .WaitOnLoad = False
    }
    'Add the PictureBox to the Form
    Me.Controls.Add(cardPictureBox)

    'Load the image asynchronously
    cardPictureBox.LoadAsync(url)
Next