0

伙计们,

我正在用自定义控件度过一段美好的时光。该控件非常简单——它只显示一个“StepItems”列表(呈现为表格行),每个都有一个图标。当我第一次将它拖到页面上并将 StepItems 添加到它的集合时,它会完美呈现。如果我为其 Header 属性提供一些文本,那也可以完美呈现。

如果我然后查看 HTML 源视图,然后返回设计视图,我会收到一个错误,我的控件应该在哪里。有两种错误:

  • 如果我设置 .Header 属性,错误显示为“StepProgressControl1:'someheadertext' 无法在属性'Header' 上设置。

  • 如果我不设置 .Header,但将 StepItems 添加到集合中,我会得到:“ErrorStepProgressControl1:'StepItems' 无法初始化。详细信息:找不到方法:'System.Collections.Generic.List`1 StepProgressControl。 TKC.Experiment.StepProgressControl.get_StepItems()'。”

我的自定义控件的完整代码如下。如果您能提供任何帮助,非常感谢您!

  • 汤姆

'=================================

导入 System 导入 System.Collections 导入 System.Web 导入 System.Web.UI 导入 System.Web.UI.WebControls 导入 System.Security.Permissions 导入 System.ComponentModel

命名空间 TKC.Experiment

' THIS IS THE INTERNAL "CHILD" ELEMENT
< _
    PersistenceMode(PersistenceMode.InnerProperty), _
    TypeConverter(GetType(StepItemConverter)) _
   > _
Public Class StepItem

    Private _name As String

    Public Sub New()
        Me.New("")
    End Sub


    Public Sub New(ByVal name As String)
        Me._name = name
    End Sub

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
End Class

'=====================================================================

' THIS IS THE ACTUAL "PARENT" WEB CONTROL
< _
   ParseChildren(True, "StepItems"), _
   PersistChildren(False) _
> _
Public NotInheritable Class StepProgressControl
    Inherits WebControl


    Private _header As String = String.Empty
    Private _stepItems As New List(Of StepItem)

    Public Sub New()
        Me.Header = "StepProgressControl"
    End Sub



    < _
        PersistenceMode(PersistenceMode.Attribute) _
    > _
    Public Property Header() As String
        Get
            Return _header
        End Get
        Set(ByVal value As String)
            _header = value
        End Set
    End Property


    < _
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
        PersistenceMode(PersistenceMode.InnerProperty) _
    > _
    Public ReadOnly Property StepItems() As List(Of StepItem)
        Get
            If _stepItems Is Nothing Then
                _stepItems = New List(Of StepItem)
            End If
            Return _stepItems
        End Get
        'Set(ByVal value As List(of stepitem))
        '    _stepItems = value
        'End Set
    End Property


    Public Overrides Sub RenderControl(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.RenderControl(writer)

        Dim label As New Label()
        label.Text = Header

        label.RenderControl(writer)

        Dim table As New Table()
        Dim htr As New TableRow()

        Dim hcell1 As New TableHeaderCell()
        hcell1.Text = "Name"
        htr.Cells.Add(hcell1)

        Dim hcell2 As New TableHeaderCell()
        hcell2.Text = "Title"
        htr.Cells.Add(hcell2)


        table.BorderWidth = Unit.Pixel(0)

        Dim stepItem As StepItem

        For Each stepItem In StepItems
            Dim tr As New TableRow()

            Dim cell1 As New TableCell()
            Dim img As New HtmlImage
            img.Src = ""
            img.Alt = ""
            cell1.Controls.Add(img)
            tr.Cells.Add(cell1)

            Dim cell2 As New TableCell()
            cell2.Text = stepItem.Name
            tr.Cells.Add(cell2)

            table.Rows.Add(tr)
        Next stepItem

        table.RenderControl(writer)


    End Sub

End Class


'========================================

'THIS IS A "TYPE CONVERTER" - JUST A COSMETIC THING, NOT CAUSING TROUBLE...
Public Class StepItemConverter
    Inherits TypeConverter
    Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
        Dim obj As StepItem = DirectCast(value, StepItem)
        Return obj.Name
    End Function
End Class

结束命名空间

4

1 回答 1

0

您将需要实现自己的 Collection 对象来表示列表 - 否则设计器将无法正确显示它。

请参阅 ICollection、IEnumerable 等接口。

于 2009-02-18T01:47:17.567 回答