- PR -

カスタムコントロールでコレクションのプロパティを追加したい

1
投稿者投稿内容
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-09-11 11:59
ASP.NET(VB)を使用してカスタムコントロールを作成中なのですが、
自前クラスのコレクションをプロパティとして追加したいのです。

DropDownListコントロールのItemsプロパティのようなものをイメージ
しています。

これを実現するには、まずコレクションクラスを作成する必要がある
のでしょうか?
FOX
ベテラン
会議室デビュー日: 2002/04/08
投稿数: 63
お住まい・勤務地: いなか
投稿日時: 2003-09-11 13:18
こんにちは。

以前勉強がてらに作ったドロップダウンリストの自作版があります。
#C#ですいません。C#をVB.NETに読み替えてください。
かなり機能を削った感じになっています。

コード:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;

namespace myWebControls {
    /// <summary>
    /// サンプルコントロール
    /// 子としてChildItem要素を持つ
    /// </summary>
    [ControlBuilder(typeof(ChildControlBuilder))]
    public class SampleList : Control {
        //子供の要素のCollection
        private ArrayList childItems_ = new ArrayList();

        protected override void AddParsedSubObject(object obj) {
            //子供の要素の追加
            if (obj is ChildItem) {
                childItems_.Add(obj);
            }
        }

        protected override void Render(HtmlTextWriter render) {
            // コントロールの描画
            render.WriteLine("<select name=\"{0}\" id=\"{0}\" >",this.UniqueID);
            render.Indent++;
            foreach(ChildItem item in childItems_) {
                render.WriteLine("<option value=\"{0}\">{1}</option>",item.Value,item.Text) ;
            }
            render.Indent--;
            render.WriteLine("</select>");
        }
    }

    /// <summary>
    /// 子供のコントロール
    /// 子はText要素しか持たない
    /// その子の要素をTextとして保持する
    /// </summary>
    [ControlBuilder(typeof(LiteralControlBuilder))]
    public class ChildItem : Control {
        protected override void AddParsedSubObject(object obj) {
            //子要素を取得
            if (obj is LiteralControl) {
                text_ = ((LiteralControl)obj).Text;
            }
        }

        /// <summary>
        /// Text保持するメンバ
        /// </summary>
        private string text_;

        /// <summary>
        /// Value保持するメンバ
        /// </summary>
        private string value_;

        /// <summary>
        /// Value属性から値を取得する
        /// </summary>
        public string Value {
            get { return value_; }
            set { value_ = value; }
        }
        
        /// <summary>
        /// テキストを公開するためのプロパティ
        /// </summary>
        public string Text {
            get { return text_; }
        }
    }

    /// <summary>
    /// 子供のコントロールを作成するクラス
    /// </summary>
    public class ChildControlBuilder : ControlBuilder {
        public override Type GetChildControlType(string tagName, IDictionary attribs) {
            // SampleControlの子供はすべてChildItemコントロールとなる
            return typeof(ChildItem);
        }
    }
}

なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-09-11 14:23
FOXさん、こんにちは。

提示していただいたC#のコードをVBに焼きなおしてみました。
コード:
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Collections

<ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>"), _
ControlBuilder(GetType(ChildControlBuilder))> _
Public Class WebCustomControl1
    Inherits WebControl

    ' //子供の要素のCollection
    Private childItems_ As New ArrayList()

    Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
        ' 子要素の追加
        childItems_.Add(obj)
    End Sub

    Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
        ' とりあえず保留
        output.Write("")
    End Sub

End Class

' 子供のコントロール
' 子はText要素しか持たない
' その子の要素をTextとして保持する
<ControlBuilder(GetType(LiteralControlBuilder))> _
Public Class ChildItem
    Inherits Control

    Private text_ As String
    Private value_ As String

    Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
        text_ = CType(obj, LiteralControl).Text
    End Sub

    ' Value属性から値を取得する
    Public Property Value() As String
        Get
            Return value_
        End Get
        Set(ByVal Value As String)
            value_ = Value
        End Set
    End Property

    ' テキストを公開するためのプロパティ
    Public ReadOnly Property Text() As String
        Get
            Return text_
        End Get
    End Property

End Class

' 子供のコントロールを作成するクラス
Public Class ChildControlBuilder
    Inherits ControlBuilder

    Public Overrides Function GetChildControlType(ByVal tagName As String, ByVal attribs As IDictionary) As Type
        Return GetType(ChildItem)
    End Function
End Class



実際にFormに配置してみたのですが、通常のDropDownListのようにItemsプロパティを
編集したりするのはどうすればよいのでしょうか?

ControlBuilderなるものがイマイチよくわかっていませんが…。
1

スキルアップ/キャリアアップ(JOB@IT)