我正在通过卡片数据库进行甲板制造商项目,到目前为止,当我单击一行(使用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
答案 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类具有Load和LoadAsync(看起来像您想要的那样),实际上不需要创建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