使用 List的 ASP.NET v2.0 自定义控件的设计时问题 用于儿童用品

发布于 2024-07-14 07:31:20 字数 4218 浏览 9 评论 0原文

各位,

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

如果我随后查看 HTML 源视图,然后返回到设计视图,我会在控件应在的位置出现错误。 有两种错误:

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

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

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

  • 汤姆

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

导入系统 导入系统.集合 导入系统.Web 导入 System.Web.UI 导入 System.Web.UI.WebControls 导入系统.安全.权限 导入 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

End 命名空间

Folks,

I am having a devil of a time with a custom control. The control is very simple - it just displays a list of "StepItems" (rendered as table rows), each with an icon. When I first drag it onto a page, and add StepItems to its collection, it renders perfectly. If I provide some text for its Header property, that also renders perfectly.

If I then look at the HTML source view, and then back to the design view, I get an error where my control should be. There are two kinds of errors:

  • If I set the .Header property, the error reads "StepProgressControl1:'someheadertext' could not be set on property 'Header'.

  • If I don't set the .Header, but add StepItems to the collection, I get this: "ErrorStepProgressControl1:'StepItems' could not be initialized. Details: Method not found: 'System.Collections.Generic.List`1 StepProgressControl.TKC.Experiment.StepProgressControl.get_StepItems()'."

The complete code for my custom control is below. If you can provide any help, thank you a great deal!

  • Tom

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

Imports System
Imports System.Collections
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Security.Permissions
Imports System.ComponentModel

Namespace 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

End Namespace

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

九厘米的零° 2024-07-21 07:31:20

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

请参阅 ICollection、IEnumerable 等接口。

You will want to implement your own Collection object to represent the list - otherwise the designer will not display it properly.

See the ICollection, IEnumerable, etc. interfaces.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文