ASP.NETでWebユーザーコントロールを拡張する方法

このQ&Aのポイント
  • ASP.NETでWebユーザーコントロールを作成していますが、Webカスタムコントロールであれば派生クラスを作成して追加できますが、ユーザーコントロールでは同じことができないようです。
  • Visual Studio 2005環境では、Webカスタムコントロールの開発がデザイナ上でできないため、DLLにコンパイルしてaspxページに埋め込む必要があります。一方、ユーザーコントロールはデザイナを使用して直感的に開発できます。
  • ASP.NETでWebユーザーコントロールを作成していますが、Webカスタムコントロールとユーザーコントロールでは派生クラスの作成方法が異なります。Webカスタムコントロールではクラスの継承を使用して派生クラスを作成し、追加したいコントロールやフィールドを追加します。一方、ユーザーコントロールでは同じ方法が使用できません。
回答を見る
  • ベストアンサー

ASP.NETでWebユーザーコントロールを作成していますが、あるユー

ASP.NETでWebユーザーコントロールを作成していますが、あるユーザーコントロールを拡張して別のユーザーコントロールを作成したいと思っています。 Webカスタムコントロールであれば、クラスの継承の概念を使って派生クラスを作成し、追加したいコントロールやフィールドを派生クラスで追加するのですが、ユーザーコントロールでこれと同じ事はできないものでしょうか? Visual Studio 2005環境ですが、Webカスタムコントロールはデザイナを使った開発ができず、わざわざDLLにコンパイルした後aspxページに埋め込んでやらないと見た目を確認できません。その点、ユーザーコントロールは通常のWindowsフォームアプリケーションのように、デザイナ上でコントロールをD&Dし、プロパティエディタでプロパティの設定もできます。 下記に試してみたコードを示します。 [WebUserControl1.ascx] <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.WebUserControl1" %> <%@ Register Assembly="WebBaseFormLib" Namespace="WebBaseFormLib" TagPrefix="cc1" %> <asp:Button ID="Button1" runat="server" Text="Button1" /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> [WebUserControl1.ascx.cs] namespace WebApplication1 { public partial class WebUserControl1 : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } } } [WebUserControl2.ascx] <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl2.ascx.cs" Inherits="WebApplication1.WebUserControl2" %> <%@ Reference Control="~/WebUserControl1.ascx" %> <asp:Button ID="Button2" runat="server" Text="Button2" /> [WebUserControl2.ascx.cs] namespace WebApplication1 { public partial class WebUserControl2 : WebUserControl1 //WebUserControl1を継承 { protected void Page_Load(object sender, EventArgs e) { } } } こうした場合に、WebUserControl2をaspxページで使用してもButton2しか表示されません。 期待する動きとしては、WebUserControl1に配置したButton1とtextbox1が透過的に表示して欲しかったのですが。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

クラスが継承されているだけで、ページ内のHTML要素タグが埋め込まれるわけではありません。 2.ascxで1.ascxを引き込む必要があります。 それにより2のコントロールは1のコントロールを継承するのではなく埋め込むわけですから、 >public partial class WebUserControl2 : WebUserControl1 という発想は、根本的に違います。 1aspxに対し、2.aspxはマスタページ的な存在となります。 テキストボックス・リストなどの継承コントロールと、Webユーザコントロールは、全く違う代物です。 [WebUserControl1.ascx] <%@ Control Language="C#" AutoEventWireup="true" Codebehind="WebUserControl1.ascx.cs" ~略~ %> <asp:Button ID="Button1" runat="server" Text="Button1" /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> [WebUserControl2.ascx] <%@ Control Language="C#" AutoEventWireup="true" Codebehind="WebUserControl2.ascx.cs" ~略~ %> <%@ Register TagPrefix="wuctrl" TagName="WebUserControl1" Src="~/WebUserControl1.ascx" %> <!--ここにWebUserControl1を配置 --> <wuctrl:WebUserControl1 ID="wuctrl1" runat="server" /> <asp:Button ID="Button2" runat="server" Text="Button2" /> [WebForm1.aspx] <%@ Page Language="C#" AutoEventWireup="true" Codebehind="WebForm1.aspx.cs" ~略~ %> <!DOCTYPE html PUBLIC ~略~> <%@ Register TagPrefix="wuctrl" TagName="WebUserControl2" Src="~/WebUserControl2.ascx" %> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">  <title>無題のページ</title> </head> <body>  <form id="form1" runat="server">   <div>    <wuctrl:WebUserControl2 ID="wuctrl2" runat="server" />   </div>  </form> </body> </html> ----------- おまけ ----------- ※ページからWebUserControl2の中のWebUserControl1にアクセスする単純改造方法 [WebUserControl1.ascx.designer.cs] protected ::System.Web.UI.~ を public ::System.Web.UI.~ [WebUserControl2.ascx.designer.cs] protected ::WebApplication1.WebUserControl1 wuctrl1; を public global::WebApplication1.WebUserControl1 wuctrl1; [WebForm1.aspx.vb] protected void Page_Load(object sender, EventArgs e) {  this.wuctrl2.wuctrl1.TextBox1.Text = "テスト"; } 単純改造方法はprotected→publicです。 各クラス毎にプロパティを作成し、そのプロパティ内部で、埋め込まれているユーザコントロールに値をセットするのが、正統な作りだと思います。

katorea21
質問者

お礼

回答ありがとうございます。 なるほど、やはりマークアップとして埋め込まれたコントロールを継承することはできないのですね。 ご提示頂いた方法では、クラスの継承を行った場合と同じように、WebUserControl2で継承元のWebUserControl1のコントロールのプロパティを透過的に操作することはできないですね。 マスターページと同じ、入れ子にすると言うイメージでしょうか。 基本コントロールから継承して派生コントロールを作成するには、やはりカスタムコントロールにするしかないようですね。

関連するQ&A

  • ASP.NET web アプリケーションでの入力検証に関して質問です

    ASP.NET web アプリケーションでの入力検証に関して質問です 当方.NET、オブジェクト指向言語初心者です 検討違いなことを質問しているかもしれませんが 回答いただけたら幸いです 以下を使用しています visual studio 2008 .NET Framework 3.5 C# 新規プロジェクト作成時に ASP.NET web アプリケーションを選択し、 (ASP.NET MVC等ではなく) TextBox Button を配置し Buttonを押下した時に TextBoxに何も入力されていなかった場合 エラーメッセージを表示するような入力検証を System.ComponentModel.DataAnnotations を用いて行いたいと考えています (RequiredFieldValidatorではなく) Q1 新規プロジェクト作成時にASP.NET web アプリケーションを選択した場合 System.ComponentModel.DataAnnotations を用いて入力検証はおこなえるのでしょうか? (webで検索したところASP.NET MVCやSilverlightのサンプルはあったのですが・・・) Q2 Q1がYESの場合 具体的にはどう実装すればよいのでしょうか? 以下にソースを記載します ■Defaoult.Aspx <%@ Page Title="ホーム ページ" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2._Default" %> <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator> <br /> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> </asp:Content> ■Default.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel.DataAnnotations;  //←※ namespace WebApplication2 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { } } } ※ 参照の追加で System.ComponentModel.DataAnnotations を追加して usingで定義するところまでは検討がつきました 以上、宜しくお願い致します

  • ASP.NETでTimerコントロールを使用したい

    ASP.NETWebアプリケーションについての質問です。 ajaxのTimerコントロールでイベントを発生させ、画面の再描画をしようとしています。 コードは以下のような感じで、OnPreRenderイベント内で描画処理を行います。 Partial Public Class _Default Inherits System.Web.UI.Page Private str As String = "" Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load str = CStr(Date.Now) End Sub Protected Overrides Sub OnPreRender( _ ByVal e As System.EventArgs _ ) Label1.Text = str End Sub End Class Timerコントロールを配置して実行したところ、 Script controls may not be registered before PreRender. というエラーが出てしまいます。 調べてみたのですが原因がわかりません。 何かプロパティの設定などが必要なのでしょうか? aspx のコードは以下のとおりです。 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication5._Default" %> <%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" ></asp:ScriptManager> <asp:Timer ID="Timer1"runat="server"></asp:Timer> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Labe> l </form> </body> </html> 回答よろしくお願いいたします。

    • ベストアンサー
    • AJAX
  • ASP.NET WEBアプリケーションで作成されたページより他の既存ペ

    ASP.NET WEBアプリケーションで作成されたページより他の既存ページへデータを投げたいと考えているのですがセキュリティ上難しいのでは?と考えています。しかし、なんとか代替案がないかと思っておりどなたかヒントをいただけないでしょうか? <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> <asp:TextBox ID="TextBox3" runat="server" Height="72px" TextMode="MultiLine" Width="651px"></asp:TextBox> <br /> <asp:Button ID="Button1" runat="server" Text="Button" />&nbsp;&nbsp; <asp:Button ID="Button2" runat="server" Text="Button" /> <br /> <br /> <asp:Label ID="Label1" runat="server"></asp:Label> 例えばこんな簡単なaspxのページで構成されているとします。 テキストボックスに入れた値を既存のWEBページ(Yahooへのログインだとか)へ入れ込みたいのですが・・・クライアントにスクリプトで作ってとかなら余裕で出来ると思うのですがサーバサイドで仕込むことは難しいでしょうか?回避策とかもあるとなおうれしいのですが・・・よろしくお願いします。

  • VB.net Webアプリケーションでのユーザーコントロール(DLL)の作り方

    VB.netでWebアプリケーションでのユーザーコントロール(DLL)を試しに作ったのですが(テキストボックスを張り付けただけのもの)、WebアプリケーションにそのDLLを張り付けてもテキストボックスがでてきません。なぜでしょうか? DLL側のソース(一部)  Inherits System.Web.UI.UserControl'ユーザーコントロールと定義  Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox'テキストボックスはりつけ

  • ASP.net

    asp:Textboxなどのサーバコントロールについて質問です。 質問(1)サーバコントロールには、runat=Serverと記載しますが、これはサーバにリクエストが走っているということなのでしょうか? 質問(2)それらのコントロールに対して、CSS3のプロパティは指定可能なのでしょうか? 質問(3)JQUERYの、DOCUMENT.READYや、#Button.clickは、使用可能でしょうか?また、JQUERY Mobileは使用可能でしょうか? ◆補則 (1)VBの部品を、ブラウザ上で動かすようなケースであれば、クライアントにダウンロードをさせずに動かすために、サーバで動くということもあるのでしょうが、asp:Textboxなどであれば、内部的にはHTMLのタグなのでしょうか? だとしたらリクエストはしないのですよね? (2)動的に、page.UI.textboxなどを作成すると、HTMLタグが持っている要素をプロパティとして持っていますが、ユーザコントロールは、もしHTMLとして作成されているtextboxならCSSプロパティを指定できそうですが、VBの部品なら操作できるのはVBのコントロールのプロパティですよね? (3)AJAXの考え方は、DOMだけ書き換えようとするのにたいし、ASPでは、FormをSubmitしてリクエストしますよね。 どうやって共存しているのでしょうか?

  • マスターページからコンテンツページのメソッドを実行したい

    お世話になります。 マスターページからコンテンツページのメソッドを実行したいです。 よろしくおねがいします。 ********************************** マスタページ:Site1 ********************************** [Site1.Master] <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="Site1" %> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> [Site1.Master.cs] public partial class Site1 : System.Web.UI.MasterPage { ここで、コンテンツページのメソッドを実行 } ********************************** コンテンツページ:WebForm1 ********************************** [WebForm1.aspx] <%@ Page Language="C#" MasterPageFile="Site1.Master" Codebehind="WebForm1.aspx.cs" Inherits="WebForm1" %> <asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1"> </asp:Content> [WebForm1.aspx.cs] public partial class WebForm1 : System.Web.UI.Page {  protected void Page_Load(object sender, EventArgs e)  {  }  //このメソッドをマスターページで実行したい  public string メソッド()  {   return "XXXXXXX";  } }

  • 【ASP.NET】フォームの継承は出来ますか?

    ASP.NETで似たような画面を複数作るにあたって、 フォーム(デザイン?)の継承が出来たらなぁと思っています。 C#(当方、C#の経験しかありません(--;) )ですと Form1にButtonコントロールを貼り付けて、Form2からForm1を継承すると Form1のButtonコントロールを継承出来ますよね。(デザイナ上も表示される) ASP.NETでもそういったことが出来ないでしょうか? 現在、下のような状態です。 no2からno1を継承しようとしています。 違うんだろうなということは分るのですが インターネットで調べても分からないので 「こんな感じだろ!」という独断と偏見で作りました…^^; ======================================= 【 no1.aspx 】 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="no1.aspx.cs" Inherits="xxx.no1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <div> <!-- ボタンを貼ってみました --> <asp:Button ID="Button1" runat="server" BackColor="#FFC0FF" BorderColor="Blue" Text="Button" /> </div> </form> </body> </html> 【 no2.aspx 】 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="no2.aspx.cs" Inherits="xxx.no1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <div> <!-- Inheritsに"xxx.no1"と記述したので、no1で貼ったボタンが表示されたら嬉しい… --> </div> </form> </body> </html> ======================================= えー…、no2を実行しても真っ白画面でした。 出来れば継承したものがno2のデザイナ上にも表示されて欲しいのですが…。 また 「そういう方法はないけど、こういう方法ならあるよ」 や 「ASP.NETで似たような画面を複数作る場合は普通こうするんだよ」 ということがあれば教えて頂けたらなと思います。 よろしくお願い致します。

  • ユーザーコントロール内の検証

    いつもお世話になっております。 環境:ASP.NET、C#、Web Label+TextBoxのような.ascxを作った場合、こっちのUserControlでは文字数制限、あっちのUserControlでは半角制限をするやり方を教えてください。

  • MsgBoxをASP.NETで表示したいのですが・・・WEBなどで検索

    MsgBoxをASP.NETで表示したいのですが・・・WEBなどで検索した内容が理解できずに困っています。 VWD2008を使ってページを作成しています。言語はVB.NETです。 ASP.NETではメッセージボックスを使えないことを承知しています。 ただし手段によって可能ということはこのサイトで知りました。 まだ、初心者でハチャメチャなことを書いてあるかも知れませんがご教示いただけないでしょうか? http://www.atmarkit.co.jp/fdotnet/dotnettips/015confirm/confirm.html このページを参考にしてみたのですが・・・ aspx上に配置したボタンのプロパティにAttributesという項目がありません。 また、 private void Page_Load(object sender, System.EventArgs e) { // ページを初期化するユーザー コードをここに挿入します。 Button1.Attributes["onclick"] = "return confirm('本当に移動しますか?');"; はどこに書いてあげたらいいのでしょうか? よろしくお願いします。 Imports System.IO Imports System.IO.Path Imports System.Text Imports System.Web.UI.HtmlControls Imports System.Diagnostics Imports System.Xml Partial Public Class _Default Inherits System.Web.UI.Page ' ' Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click ' '

  • <ASP>にTextBoxの値を設定する方法

    TextBoxに記述されたDB接続文字列を<ASP>内で設定しようと試みておりますが、失敗します。どのように記述を改めればよろしいでしょうか? ----------------- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" %> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { TextBox1.Text = Application["DB_CON_STRING"].ToString(); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <div> </div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" /> <asp:BoundField DataField="DATETIME" HeaderText="DATETIME" SortExpression="DATETIME" /> <asp:BoundField DataField="MESSAGE" HeaderText="MESSAGE" SortExpression="MESSAGE" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="form1.TextBox1.Text"★ここがうまくいかない★ SelectCommand="SELECT * FROM TEST ORDER BY ID DESC"></asp:SqlDataSource> </form> </body> </html>

専門家に質問してみよう