none
LinkLabel控件如何能够控制其高度自动增长呢? RRS feed

  • 问题

  •  

    我知道,将其autosize属性设为false时,此控件显示的文本即可自动换行,

    现在问题是在动态增加LinkLabel控件时,发现无法控制LinkLabel控件的高度,因为控件显示的文本内容是不固定的,也是动态的

    或者说,怎么能够获取LinkLabel控件的Text有多少行呢?

     


    学无止境
    2011年6月1日 5:42

全部回复

  • 是我的问题没说清楚,还是各路高人不屑回复呢?
    学无止境
    2011年6月2日 10:25
  • 你好,

    当Label.AutoSize被设置为 true 时,LinkLabel 将自动调整其宽度以显示它的所有内容,这样可以用来显示各种不同长度的文本。可以用LinkLabel1.Size.Width获得LinkLabel1.Text的长度。假设动态增加的LinkLabel的宽度是30,请尝试下面的代码,得到的column的值即为LinkLabel的Text的行数。

      Dim fontlength As Integer
      Dim column As Integer
      Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Me.LinkLabel1.AutoSize = True
        Me.LinkLabel1.Text = "Label"
        fontlength = Me.LinkLabel1.Size.Width
        column = Math.Round(fontlength / 30 + 0.5)
        MessageBox.Show(column)
      End Sub
    

    Best regards


    Liliane Teng [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月8日 3:23
  • Liliane Teng 你好,谢谢你的回复。便貌似还是不能解决问题。

    下面代码在窗体上动态生成了四个LinkLabel控件,但无法让其行的间距保持相同。请问如何才能做到呢?

    Public Class Form1
      Dim fontlength As Integer
      Dim column As Integer
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim objFont As System.Drawing.Font = New System.Drawing.Font("宋体", 10)
        Dim a As String = "当Label.AutoSize被设置为 true 时,LinkLabel 将自动调整其宽度以显示它的所有内容。这样可以用来显示各种不同长度的文本。可以用LinkLabel1.Size.Width获得LinkLabel1.Text的长度。假设动态增加的LinkLabel的宽度是30,请尝试下面的代码,得到的column的值即为LinkLabel的Text的行数。"
        Dim List As New ArrayList
        For i As Integer = 0 To 4
          Dim ck As New LinkLabel
          Me.Controls.Add(ck)
          List.Add(ck)
          List.Item(i).name = "LinkLabel" & i.ToString
          List.Item(i).text = a.Split("。")(i)
          fontlength = List.Item(i).Size.Width
          column = Math.Round(fontlength / 14) 'LinkLabel的Text的行数。每行按14个汉字计算
          List.Item(i).AutoSize = False '禁止自动调整其宽度
          List.Item(i).width = 89 '设定宽度
          List.Item(i).height = column * Me.CreateGraphics.MeasureString("行高", objFont).ToSize.Height '计算LinkLabel高度
          If i = 0 Then
            List.Item(i).top = 3
          Else
            List.Item(i).top = List.Item(i - 1).top + List.Item(i - 1).height '+ 3
          End If
          List.Item(i).left = 5
          List.Item(i).tabindex = i
          List.Item(i).Visible = True
          AddHandler ck.Click, AddressOf LinkLabel1_Click
        Next
      End Sub
    
      Private Sub LinkLabel1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        MsgBox(sender.Text)
      End Sub
    End Class
    


    学无止境
    2011年6月8日 4:34
  • 你好,

    14个汉字的宽度应该是14 * Me.CreateGraphics.MeasureString("宽度", objFont).ToSize.Width) + 0.5。每行显示汉字的个数应该跟每个LinkLabel的宽度一样。这样的话行距就一样了。

    Public Class Form1
    
      Dim fontlength As Integer
      Dim column As Integer
    
      Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim objFont As System.Drawing.Font = New System.Drawing.Font("宋体", 10)
        Dim a As String = "当Label.AutoSize被设置为 true 时,LinkLabel 将自动调整其宽度以显示它的所有内容。这样可以用来显示各种不同长度的文本。可以用LinkLabel1.Size.Width获得LinkLabel1.Text的长度。假设动态增加的LinkLabel的宽度是30,请尝试下面的代码,得到的column的值即为LinkLabel的Text的行数。"
        Dim List As New ArrayList
        For i As Integer = 0 To 4
          Dim ck As New LinkLabel
          Me.Controls.Add(ck)
    
          List.Add(ck)
          List.Item(i).name = "LinkLabel" & i.ToString
          List.Item(i).text = a.Split("。")(i)
          fontlength = List.Item(i).Size.Width
    
          column = Math.Round(fontlength / (14 * Me.CreateGraphics.MeasureString("宽度", objFont).ToSize.Width) + 0.5) 'LinkLabel的Text的行数。每行按14个汉字计算
          List.Item(i).AutoSize = False '禁止自动调整其宽度
          List.Item(i).width = 14 * Me.CreateGraphics.MeasureString("宽度", objFont).ToSize.Width '设定宽度
          List.Item(i).height = column * Me.CreateGraphics.MeasureString("行高", objFont).ToSize.Height '计算LinkLabel高度
          If i = 0 Then
            List.Item(i).top = 3
          Else
            List.Item(i).top = List.Item(i - 1).top + List.Item(i - 1).height '+ 3
    
          End If
          List.Item(i).left = 5
          List.Item(i).tabindex = i
          List.Item(i).Visible = True
          AddHandler ck.Click, AddressOf LinkLabel1_Click
        Next
    
      End Sub
    
    
      Private Sub LinkLabel1_Click(sender As Object, e As System.EventArgs) Handles LinkLabel1.Click
        MsgBox(sender.Text)
      End Sub
    End Class
    

    Best regards


    Liliane Teng [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年6月8日 8:09
  • Liliane Teng版主, 你好

        上面的代码复制后运行的结果似乎没有效果。四个LinkLabel并不能显示全部的字符。我稍加修改后换行显示,但LinkLabel0-LinkLabel4之间的行距并不相同,布局很乱。

    烦请再度出手帮助解决。


    学无止境
    2011年6月9日 5:26
  • 你好,

    应该把ck.AutoSize设为True,要不然默认List.Item(i).Size.Width始终为100。另外可以适当把List.Item(i).Width设置的比每行要显示的字符大一些。大的比例可以根据每行要显示的字符数来决定。我觉得应该考虑字符间的间隔。设置的大一些可以把每行要显示的字符全部显示出来。你看下面的代码可以吗?

    Dim objFont As System.Drawing.Font = New System.Drawing.Font("宋体", 10)
        Dim a As String = "当Label.AutoSize被设置为 true 时,LinkLabel 将自动调整其宽度以显示它的所有内容。这样可以用来显示各种不同长度的文本。可以用LinkLabel1.Size.Width获得LinkLabel1.Text的长度。假设动态增加的LinkLabel的宽度是30,请尝试下面的代码,得到的column的值即为LinkLabel的Text的行数。"
        Dim List As New ArrayList
        For i As Integer = 0 To 4
          Dim ck As New LinkLabel
          Me.Controls.Add(ck)
          List.Add(ck)
          ck.AutoSize = True
          List.Item(i).name = "LinkLabel" & i.ToString
          List.Item(i).text = a.Split("。")(i)
          fontlength = List.Item(i).Size.Width
    
          column = Math.Round(fontlength / (5 * Me.CreateGraphics.MeasureString("宽度", objFont).ToSize.Width) + 0.5)
          List.Item(i).AutoSize = False '禁止自动调整其宽度
          List.Item(i).width = 5 * Me.CreateGraphics.MeasureString("宽度", objFont).ToSize.Width + 10 '设定宽度,根据每行显示的字符数自行调整
          List.Item(i).height = column * Me.CreateGraphics.MeasureString("行高", objFont).ToSize.Height '计算LinkLabel高度
          If i = 0 Then
            List.Item(i).top = 3
          Else
            List.Item(i).top = List.Item(i - 1).top + List.Item(i - 1).height '+ 3
    
          End If
          List.Item(i).left = 5
          List.Item(i).tabindex = i
          List.Item(i).Visible = True
          AddHandler ck.Click, AddressOf LinkLabel1_Click
        Next

    Best regards 


    Liliane Teng [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2011年6月10日 8:05
  • 首先非常感谢Liliane Teng版主的不厌其烦的解答。

    但仍不能实现高度自动增长的效果(就和EXCEL中单元格自动换行功能的效果一样),无法控制四个LinkLabel对象的行距想等。版主所给的代码中,当对象a的值发生变化,甚至例子中a值里的"。"位置发生变化后,布局就没法弄了。估计是没有好办法了。


    学无止境
    2011年6月10日 9:55
  • 贴子沉了,顶起
    学无止境
    2011年6月17日 5:27
  • 再顶一次
    学无止境
    2011年7月5日 4:51