- PR -

WEBカスタムコントロールのデザイナについて

1
投稿者投稿内容
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-25 17:47
vb.netでDBから動的にコントロールを作成するWEBカスタムコントロールを作成しました。デザイン時に何も表示されないため、デザイナを追加しようとするのですが、「コントロールの作成エラー」が表示されてうまくいきません。コントロールがあることを示す文字だけ出ていればいいのですが、デザイナの適用の仕方が間違っているのでしょうか?デザイナのクラスの書き方がおかしいのでしょうか?

<カスタムコントロールのコード>
Imports System.ComponentModel
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Drawing
Imports System.Text
Imports Oracle.DataAccess.Client

<Designer("DataEntryControlDesigner"), _
ToolboxData("<{0}ataEntryControl runat=server></{0}ataEntryControl>")> _
Public Class DataEntryControl
Inherits System.Web.UI.WebControls.WebControl
Implements INamingContainer
以下略

<デザイナのコード>
Imports System
Imports System.text
Imports System.Web.UI
Imports System.Web.UI.Design
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.ComponentModel.Design

Public NotInheritable Class DataEntryControlDesigner
Inherits ControlDesigner

Private ctrl As DataEntryControl

Public Sub New()
ctrl = CType(Component, DataEntryControl)
End Sub

Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent)
If Not (component Is ctrl) Then
Throw New ArgumentException( _
"コンポーネントは入力用カスタムコントロールを指定してください", _
"component")
End If
MyBase.Initialize(component)
End Sub

Public Overrides Function GetDesignTimeHtml() As String
Dim stb As New StringBuilder
Try
stb.Append("<span style=""font-size:18pt;font-weight:bold;""> " & vbLf)
stb.Append("<入力用コントロール></span> " & vbLf)
Return stb.ToString()
Catch ex As Exception
Return String.Concat("<h3>Error</h3>スタックトレース<br>", ex.StackTrace)
End Try
End Function
#End Region

End Class
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-26 15:51
ゆっきーさん、こんにちは。

以下、全くの未確認ですが。

↓Component が null 参照で例外発生、の様な気がします。

コード:
    Private ctrl As DataEntryControl

    Public Sub New()
        ctrl = CType(Component, DataEntryControl)
    End Sub



なので、コンストラクタをコメントアウトして、こんな感じ↓にしてみると動きませんか?

コード:
    Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent)
        If (TypeOf component Is DataEntryControl) Then
            ctrl = CType(component, DataEntryControl)
        Else
            Throw New ArgumentException( _


というか、そうすると ctrl 変数自体が必要ないのかな?
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-26 18:27
きくちゃんさん回答ありがとうございます。

コンストラクタをコメントアウトしてみたところ、「GetDesignTimeHtml」で書いているHTMLはでませんでしたが、とりあえずコントロール名は出るようになりました。
なぜ「GetDesignTimeHtml」の内容が出ないかは不明ですが・・・。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-26 19:03
ゆっきーさん、こんばんは。

引用:

なぜ「GetDesignTimeHtml」の内容が出ないかは不明ですが・・・。


もしかして、こういう事↓かな…?

コード:
<Designer(GetType(DataEntryControlDesigner)), _
ToolboxData("<{0}:DataEntryControl runat=server></{0}:DataEntryControl>")> _
Public Class DataEntryControl

1

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