2016-01-29 1 views
0

У меня есть элемент управления метками ссылок, хранящийся в SQL. Я выяснил, как их вытащить и создать метку ссылки, но когда я пытаюсь написать элемент управления lnk.Parent, я получаю «Невозможно наложить объект типа« system.string »на тип« system.windows.forms.control ». есть ли способ, чтобы преобразовать это?VB.Net: Написание поля таблицы SQL в Link Label Parent Control

Private Sub CreateLinkLabel(Lnk_DT As DataTable) 
    Try 
     For Each row As DataRow In Lnk_DT.Rows 
      lnk = New LinkLabel 
      lnk.Name = row("FLD_LnkName").ToString 
      lnk.Text = row("FLD_LnkName").ToString 
      lnk.Font = New Font("Sans Serif", 10, FontStyle.Bold) 
      lnk.Location = New Point(20, i) 
      lnk.Parent = row("FLD_LnkPanel") 
      lnk.Tag = row("Fld_LnkTag").ToString 
      lnk.AutoSize = True 
      AddHandler lnk.LinkClicked, AddressOf lnk_LinkClicked 
      i = i + 25 
     Next 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
    End Try 
+2

Свойство Parent должен быть назначен объект формы (или другой элемент управления контейнером), поэтому, я полагаю, вы должны написать _lnk.Parent = Me_, но в любом случае правильный способ добавления элементов управления в контейнер осуществляется с помощью метода Add для коллекции управления Controls – Steve

+0

Какое содержимое поля _row ("FLD_LnkPanel") _? – Steve

+0

@Steve: Это должен быть ответ, а не комментарий. – Heinzi

ответ

0

свойство Parent должен быть отнесен к форме объекта (или другого элемента управления контейнера), поэтому я полагаю, что вы должны написать lnk.Parent = Me, но в любом случае правильный способ добавления элементов управления контейнер находится через метод Add для коллекции управления Controls.

Например, чтобы добавить вновь созданный ярлык в текущую форму, вы пишете это внутри своей петли

Me.Controls.Add(lnk) 

Глядя на ваш код, кажется, что поле row("FLD_LnkPanel") - это имя панели управления в вашей форме. Если вы хотите добавить созданный ярлык на этой панели, то вы должны написать

Private Sub CreateLinkLabel(Lnk_DT As DataTable) 
    Try 
     For Each row As DataRow In Lnk_DT.Rows 
      ' Get the panel name ' 
      Dim panelName = row("FLD_LnkPanel") 

      ' Search the panel between the Form controls' 
      Dim panel = Me.Controls.OfType(Of Panel) 
            .FirstOrDefault(Function(x) x.Name = panelName) 
      ' If you got it, then proceed with the label creation 
      if panel IsNot Nothing Then 
       lnk = New LinkLabel 
       lnk.Name = row("FLD_LnkName").ToString 
       lnk.Text = row("FLD_LnkName").ToString 
       lnk.Font = New Font("Sans Serif", 10, FontStyle.Bold) 
       lnk.Location = New Point(20, i) 
       ' lnk.Parent = row("FLD_LnkPanel")' 
       lnk.Tag = row("Fld_LnkTag").ToString 
       lnk.AutoSize = True 
       AddHandler lnk.LinkClicked, AddressOf lnk_LinkClicked 
       i = i + 25 

       ' Add the label to the panel child controls 
       panel.Controls.Add(lnk) 
      End If 
     Next 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
    End Try 
End Sub 
0

попробовать это:

For Each c As Control In Me.Controls 
    If TypeOf c Is Panel Then 
     If c.Name = row("FLD_LnkPanel") Then 
      lnk.Parent = c 
     End If 
    End If 
0

Рассмотрим что-то вроде этого:

Private Sub CreateUIControls(Lnk_DT As DataTable)  
     For Each row As DataRow In Lnk_DT.Rows 
      Dim isPanelNew As Boolean 
      Dim pnl As Panel = GetPanel(row, isPanelNew) 
      CreateLink(row, pnl) 

      If isPanelNew Then 
       pnl.Location = New Point(10, 20) ' whatever logic 
      End If 
     Next 
    End Sub 

    Private Function GetPanel(item As DataRow, ByRef isNew As Boolean) As Panel 
     isNew = False 

     Dim pnlItem As Panel = Nothing 
     Dim pnlName As String = item.Field(Of String)("FLD_LnkPanel") 

     ' check if panel already exists on form. 
     Dim pnl As Panel = (From p In Controls.OfType(Of Panel)() 
          Where p.Name = pnlName 
          Select p).SingleOrDefault() 

     If pnl Is Nothing Then 
      pnlItem = New Panel 
      pnlItem.Width = 200 ' whatever logic 
      isNew = True 
     Else 
      pnlItem = pnl 
     End If 

     Return pnlItem 
    End Function 

    Private Sub CreateLink(item As DataRow, parentControl As Panel) 
     ' get how many links are in the panel. 
     Dim linksCount = parentControl.Controls.OfType(Of LinkLabel).Count() 
     Dim lnk As New LinkLabel 

     With lnk 
      .Name = item.Field(Of String)("FLD_LnkName") 
      .Text = item.Field(Of String)("FLD_LnkName") 
      .Font = New Font("Sans Serif", 10, FontStyle.Bold) 
      .Tag = item.Field(Of String)("Fld_LnkTag") 
      .AutoSize = True 

      ' increase panel height to fit the new link. 
      parentControl.Height = ((linksCount + 1) * 25) + 10 
      .Parent = parentControl 

      .Location = New Point(20, (linksCount * 25) + 3) 
      AddHandler .LinkClicked, AddressOf lnk_LinkClicked 
     End With 
    End Sub 

 Смежные вопросы

  • Нет связанных вопросов^_^