- PR -

ユーザーコントロールの継承

投稿者投稿内容
麒麟
会議室デビュー日: 2004/05/11
投稿数: 10
投稿日時: 2004-05-11 14:23
ASP.NETでユーザーコントロールを作成し、さらにそれを別のユーザーコントロールで継承させようと思いましたがうまくいきません。

Inherits 継承元のユーザーコントロール

をではうまく継承できないのです。いろいろ調べてみましたが、めぼしい資料もありません。
どなたか相談に乗っていただけないでしょうか。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-11 14:55
引用:

麒麟さんの書き込み (2004-05-11 14:23) より:
ASP.NETでユーザーコントロールを作成し、さらにそれを別のユーザーコントロールで継承させようと思いましたがうまくいきません。

Inherits 継承元のユーザーコントロール

をではうまく継承できないのです。いろいろ調べてみましたが、めぼしい資料もありません。
どなたか相談に乗っていただけないでしょうか。


ツッコミどころはいろいろあるのですが、一つだけ。

1.やりたいこと
2.やったこと
3.具体的なその結果

を最初に書くと、具体的な回答が得やすいです。
たとえば「レジストリへの保存方法」なんかは、具体的な質問事項がわからず、紆余曲折の末、解決まで5日かかっています。
たとえば「子フォームから別の子フォームを開く」なんかは、2つめの投稿で具体的なことが書かれているのでその日の内に解決しています。


 ご提示の情報だけでは色々な解釈ができるので、回答しにくいし、まして「相談に乗っていただけないでしょうか」となると、いつまでつきあわなければならないのかという不安から、レスも付けにくいです。

 一応、 http://quick-tips.hp.infoseek.co.jp/pg/tip.html こんなものをまとめていますので、参考にして、具体的に示してください。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-05-11 14:57
私がのりましょう。

ではまず、どのようにうまくいかなかったのか書いていただけますか。

1.どういうコードを書いたら(要点の部分だけを抜き出しあるいは加工して)
2.どうなると思ったが
3.実際はどうなった(コンパイルが通らない、例外が発生する等起きた現象を細かく)

を教えてください。
麒麟
会議室デビュー日: 2004/05/11
投稿数: 10
投稿日時: 2004-05-11 15:49
内容薄で申し訳ありませんでした。

今回の開発はASP.NETでやっておりますが、ユーザーコントロールを作成することにあたって
調べていました。


一郎さんからの要点をモデルにするところ、以下の要点を上げます。

要点:1 ソース

--------------1つめのユーザーコントロール(継承元)--------------
Public Class UC_1
Inherits System.Web.UI.UserControl

  コードはありません。

end class


--------------2つめのユーザーコントロール(継承先)--------------
Public Class UC_2
Inherits UC_1 ← これで1つ目のユーザーコントロールを継承できないのでしょうか?

   同じくコードはありません

End Class

要点2:やりたかったが

1つめのユーザーコントロールのデザインでサーバーコントロールのテキストとボタンを張りました。
これを2つめのユーザーコントロールで継承すれば、1つめを基準として拡張したユーザーコントロールが作成できると思いました。

要点3:実際はどうなった

実際は2つめのユーザーコントロールのデザインに何も表示されず、二つ目のユーザーコントロールを貼り付けたWEBページは何も表示されない状態になりました。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-11 16:30
 System.Web.UI.UserControlかぁ。。。これ、「見た目」を決定するファイルと、「動作」を決定するファイルが分かれています。それで、「動作」の方だけ“継承”しているので、何も表示されないのです。

 .ascxファイルがありますよね。それをコピーして、<%@ Control・・・の行を書き換えれば何とかなるかもしれないし、コードをこっちに埋め込んでしまえば何とかなるかもしれませんが、「見た目」、つまりHTMLに解釈されるところを“継承”するすべがないように思います。あるいは、そのユーザコントロールを含むページを、ユーザコントロールに変換することで、擬似的に“継承”するか。。。
麒麟
会議室デビュー日: 2004/05/11
投稿数: 10
投稿日時: 2004-05-11 17:45
ご返答ありがとうございます。
ほぼ今日一日調べております。
Jittaさんどうもありがとうございます。大変感謝しております。


<%@ Control・・・の行を書き代えてみたのですがやはり表示はされませんでした。

やはり、そのユーザコントロールを含むページを、ユーザコントロールに変換することで、擬似的に“継承”するしかないんでしょうか。







一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-05-11 18:01
Pageクラスでもそうだと思いますが、ユーザーコントロールはコンパイルされてdllの一部になる部分(.ascx.vb)とIISで動的に解析される部分(.ascx)に分かれています。dllの一部になっている.NETとしてのクラスは継承できます。
しかし、IISで動的に解析される部分は継承できません。

見た目は継承できませんが、「動作」だけなら継承できます。
見た目は継承先で定義するしかありません。

ちょっと実験してみました。
コード:

------WebControl1.ascx.vb
Public Class WebUserControl1
Inherits System.Web.UI.UserControl
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button1 As System.Web.UI.WebControls.Button

Protected Overridable Sub Button1_Click(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = "押した"
End Sub

------WebControl2.ascx.vb
Public Class WebUserControl2
Inherits WebUserControl1
Protected Shadows WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected Shadows WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox

Private Sub Page_Init(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles MyBase.Init
' CODEGEN: このメソッド呼び出しは Web フォーム デザイナで必要です。
' コード エディタを使って変更しないでください。
InitializeComponent()

MyBase.TextBox1 = TextBox1
MyBase.Button1 = Me.Button1
End Sub

Protected Overrides Sub Button1_Click(ByVal sender As System.Object _
, ByVal e As System.EventArgs)
MyBase.Button1_Click(sender, e)

Me.TextBox1.Text += "押した2"
Me.TextBox2.Text = "押した2"
End Sub

------WebControl1.ascx
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="WebUserControl1.ascx.vb"
Inherits="WebApplication1.WebUserControl1"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>

------WebControl2.ascx
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="WebUserControl2.ascx.vb"
Inherits="WebApplication1.WebUserControl2"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:textbox id="TextBox1" runat="server"></asp:textbox>
<asp:textbox id="TextBox2" runat="server"></asp:textbox>
<asp:button id="Button1" runat="server" Text="Button"></asp:button>


必要な部分だけ抜粋してあります。
一応思った通りには動きました。
ボタンを押すとTextBox1には"押した押した2"と表示されました。

まぁ・・・まねしない方が良いかも。

[ メッセージ編集済み 編集者: 一郎 編集日時 2004-05-11 18:12 ]
麒麟
会議室デビュー日: 2004/05/11
投稿数: 10
投稿日時: 2004-05-11 18:35
一郎さん、大変ありがとうございました。できました。
わたし達にとって、とてもわかりやすく教えていただき感謝しております。

今日はじめての@ITデビューで、こんなにも早くご返事をいただき、また問題点においても
解決の糸口を与えていただいて、とても感激しております。
これからもこちらを利用するにあたって、私自身も誰かの役に立てればと考えております。

今回協力してくださった、Jittaさん、一郎さん、ありがとうございました。

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