首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想将动态图片盒与动态标签对齐。

我想将动态图片盒与动态标签对齐。
EN

Stack Overflow用户
提问于 2017-05-10 07:27:52
回答 1查看 26关注 0票数 0

这是我的函数,它允许我从网页中获取PictureBoxs的图像链接和标签的标题

代码语言:javascript
复制
Public Shared Function getPics(website As String, pattern As String)

    Dim tempTitles As New List(Of String)()
    Dim tempTitles2 As New List(Of String)()
    Dim lestitres As New List(Of titlesclass)

    Dim webClient As New WebClient()
    webClient.Headers.Add("user-agent", "null")
    Dim counter As Integer = 0
    Dim counter2 As Integer = 0
    Dim counter3 As Integer = 0
    Dim counter4 As Integer = 1
    Dim counter5 As Integer = 0
    Dim counter6 As Integer = 0
    'If the website happens to go offline, at least your application wont crash.
    Dim content As String = webClient.DownloadString(website)
    Dim query = From title In Regex.Matches(content, pattern).Cast(Of Match)
                Select New With {Key .Link = String.Concat("http://www.gamestop.com", title.Groups("Data").Value),
                         Key .Title = title.Groups("Dataa").Value}
    For Each letitre In query.Distinct
        'MsgBox(letitre.Link & " ======= " & letitre.Title)
    Next
    'For Each title As Match In (New Regex(pattern).Matches(content)) 'Since you are only pulling a few strings, I thought a regex would be better.
    '    Dim letitre As New titlesclass
    '    letitre.Link = title.Groups("Data").Value
    '    letitre.Title = title.Groups("Dataa").Value
    '    lestitres.Add(letitre)
    '    'tempTitles2.Add(title.Groups("Dataa").Value)
    'Next
    Dim titles = tempTitles.Distinct().ToArray() 'remove duplicate titles
    'Dim titles2 = tempTitles2.Distinct().ToArray()
    Dim titles2 = lestitres.Distinct().ToArray()
    lestitres.Clear()

    'For Each title As titlesclass In titles2
    For Each letitre In query.Distinct
        'ListBox.Items.Add(title) 'what you do with the values from here is up to you.
        Dim ImageInBytes() As Byte = webClient.DownloadData(letitre.Link)
        Dim ImageStream As New IO.MemoryStream(ImageInBytes)
        Dim MyPic As New PictureBox
        Dim MyLab As New Label


        If (counter2 > 0 AndAlso ((counter2 Mod 4 = 0) OrElse counter3 = 1)) Then

            counter3 = 1
            counter4 += 1
            If (counter2 Mod 4 = 0) Then
                counter5 = 0
                counter6 += 170
            End If
            MyPic.Location = New Point(counter5, MyPic.Location.Y + counter6)
            MyLab.Location = New Point(counter5, MyPic.Location.Y + counter6)
            If counter4 = 4 Then
                counter3 = 0
            End If


            counter5 += 200
        Else
            MyPic.Location = New Point(counter, MyPic.Location.Y)
            MyLab.Location = New Point(counter, MyPic.Location.Y)
        End If
        counter += 200
        counter2 += 1
        MyPic.SizeMode = PictureBoxSizeMode.AutoSize
        MyLab.Text = letitre.Title
        MyPic.Image = New System.Drawing.Bitmap(ImageStream)
        Form2.Controls.Add(MyPic)
        Form2.Controls.Add(MyLab)

    Next


End Function

名为titlesclass的类包含两个元素,我将将链接和标题存储在:

代码语言:javascript
复制
Public Class titlesclass
Public Property Link As String
Public Property Title As String
End Class

所有的工作都是我的小按钮

代码语言:javascript
复制
Dim websiteURL1 As String = "http://www.gamestop.com/collection/upcoming-video-games"
    Class1.getPics(websiteURL1, "<img src=""(?<Data>[^>]*)""><p>(?<Dataa>[^>]*)<br>")

我想要做的是,每行显示4个图片盒,每一张图片的标签都是右吼叫,因为现在有些标签没有显示,有些显示在正确的地方,有些则显示得非常低!我用一个Message Box测试了我得到的值,它按照我需要的顺序显示信息,我不确定我是否搞砸了x,y值,或者是其他什么东西.

编辑:我已经可以显示每行4个图片框,标签也一样,但一些标签的Y没有很好地调整,它可以远低于!

这里有一些图片可以帮助你理解我的情况--不要介意按钮和列表框,这只是为了测试:我的列表包含了很多图片,所以我只是给您展示了一些东西正常工作的时候,当它显示离设计的图片很远的几行时

代码语言:javascript
复制
http://img110.xooimage.com/files/f/a/d/picture1-5239f7c.png
http://img110.xooimage.com/files/8/f/8/picture-2-5239f7e.png
http://img110.xooimage.com/files/4/7/b/picture-3-5239f80.png
http://img110.xooimage.com/files/f/0/f/picture4-5239f82.png
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-10 09:12:43

因此,我用一个PictureBox原理和增量来清理您生成row位置的方式:

注:

  • 如果您需要顶部的空间来添加信息,请在1而不是0 row上启动计数

Note 2:

  • 在这里,图像尺寸被重新编码,但是您可以使用动态的,这将是更多的流动性。我只是清理了定位代码,而不是剩下的.

将您的功能替换为以下功能:

代码语言:javascript
复制
Public Shared Sub getPics(website As String, pattern As String)
    Dim tempTitles As New List(Of String)()
    Dim tempTitles2 As New List(Of String)()
    Dim lestitres As New List(Of titlesclass)
    Dim webClient As New WebClient()
    webClient.Headers.Add("user-agent", "null")
    Dim counter As Integer = 0
    Dim counter2 As Integer = 0
    Dim counter3 As Integer = 0
    Dim counter4 As Integer = 1
    Dim counter5 As Integer = 0
    Dim counter6 As Integer = 0
    'If the website happens to go offline, at least your application wont crash.
    'Handle default proxy
    Dim proxy As IWebProxy = WebRequest.GetSystemWebProxy()
    proxy.Credentials = CredentialCache.DefaultCredentials
    webClient.Proxy = proxy
    Dim content As String = webClient.DownloadString(website)
    Dim query = From title In Regex.Matches(content, pattern).Cast(Of Match)
                Select New With {Key .Link = String.Concat("http://www.gamestop.com", title.Groups("Data").Value),
                         Key .Title = title.Groups("Dataa").Value}

    Dim titles = tempTitles.Distinct().ToArray() 'remove duplicate titles
    Dim titles2 = lestitres.Distinct().ToArray()
    lestitres.Clear()
    'Count Items
    Dim item As Integer = 0
    'Count Row
    Dim row As Integer = 0
    'image: 222*122
    For Each letitre In query.Distinct
        Dim ImageInBytes() As Byte = webClient.DownloadData(letitre.Link)
        Dim ImageStream As New IO.MemoryStream(ImageInBytes)
        Dim MyPic As New PictureBox
        Dim MyLab As New Label
        'x = numéro item fois largeur image
        'y = numéro de ligne fois hauteur image
        MyPic.Location = New Point(item * 222, row * 122)
        MyLab.Location = New Point(item * 222, row * 122)
        MyPic.SizeMode = PictureBoxSizeMode.AutoSize
        MyLab.Text = letitre.Title
        MyPic.Image = New System.Drawing.Bitmap(ImageStream)
        Form1.Controls.Add(MyPic)
        Form1.Controls.Add(MyLab)
        'Bring Labels to front
        For Each ctrl As Control In Form1.Controls
            'If the control is of type label
            If TypeOf ctrl Is Label Then
                'Then bring to front 
                ctrl.BringToFront()
            End If
        Next
        'Increment the item count
        item = item + 1
        'If item is multiple of 4 or could check 4 then
        If item Mod 4 = 0 Then
            'Reset counter
            item = 0
            'Increment Row
            row = row + 1
        End If
    Next
End Sub

示例返回:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43886063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档