0

リンクボタンをパネルのデフォルトボタンとして設定する機能があります。

protected void Page_PreRender(object sender, EventArgs e)
    {
        string addClickFunctionScript = @"function addClickFunction(id) {
               var b = document.getElementById(id);
               if (b && typeof(b.click) == 'undefined')
                 b.click = function() {
                   var result = true;
                   if (b.onclick) result = b.onclick();
                   if (typeof(result) == 'undefined' || result)
                     eval(b.getAttribute('href'));
                 }
             };";

        string clickScript = String.Format("addClickFunction('{0}');", lbHello.ClientID);

        Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + lbHello.ClientID, clickScript, true);
    }

これは正常に機能します。これをアプリケーションのすべてのページで再利用できるようにする方法。1つのページに複数のリンクボタンと複数のパネルを含めることができます。

4

3 に答える 3

3

最もクリーンな方法は、から継承するカスタムサーバーコントロールを使用することLinkButtonです。実際、これは以前の質問のブログ投稿と一致しているようです。あなたがする必要があるのは、イベントをオーバーライドし、そのコントロールの特定のインスタンスを参照するように変更しながら、持っているコードを貼り付けることです。これを設定するのに10分以上かかることはありません。これが完了すると、1つのページで必要な数のコントロールを使用して、アプリケーションのさまざまなページ全体で簡単にサポートできるようになります。OnPreRenderlbHello.ClientIDthis.ClientID

このMSDNの記事は、以下の手順、特に「サーバーコントロールの作成」セクション:ウォークスルー:カスタムWebサーバーコントロールの開発と使用に役立つ場合があります。これを実現するためのステップバイステップガイドは次のとおりです。

  1. 既存のソリューションで、新しいASP.NET Server Controlプロジェクトを追加します([ソリューションエクスプローラー]->[新しいプロジェクトの追加]->[ASP.NET Server Control]からソリューションを右クリックします)。名前を付けLinkButtonDefaultます(もちろん、名前は自由に変更できます)。
  2. 名前を変更ServerControl1.csしますLinkButtonDefault.cs
  3. ファイル内の名前空間の名前を次のように変更しますCustomControls
  4. AssemblyInfo.csファイル(Propertiesプロジェクトのフォルダーに含まれている)を開いて、MSDNの記事の手順12〜14を実行します。ファイルの最後に次の行を追加します。[assembly: TagPrefix("CustomControls", "CC")]
  5. LinkButtonDefault.csのコードを追加して、OnPreRenderイベントをオーバーライドします。

コード(の使用に注意してthis.ClientIDください):

    protected override void OnPreRender(EventArgs e)
    {
        string addClickFunctionScript = @"function addClickFunction(id) {
           var b = document.getElementById(id);
           if (b && typeof(b.click) == 'undefined')
             b.click = function() {
               var result = true;
               if (b.onclick) result = b.onclick();
               if (typeof(result) == 'undefined' || result)
                 eval(b.getAttribute('href'));
             }
         };";

        string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);

        Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);

        base.OnPreRender(e);
    }

の代わりに[ToolboxData("<{0}:useで始まるクラス宣言の上に生成された属性コードを更新することもできます。新しいサーバー制御プロジェクトは以上です。前述のMSDNの記事を読んで、必要に応じてツールボックスにコントロールを追加するなど、他の機能を利用することを強くお勧めします。LinkButtonDefaultServerControl1

これらの手順を完了すると、次のようなLinkButtonDefault.csファイルが作成されます。

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:LinkButtonDefault runat=server></{0}:LinkButtonDefault>")]
    public class LinkButtonDefault : LinkButton
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? "[" + this.ID + "]" : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }

        protected override void OnPreRender(EventArgs e)
        {
            string addClickFunctionScript = @"function addClickFunction(id) {
               var b = document.getElementById(id);
               if (b && typeof(b.click) == 'undefined')
                 b.click = function() {
                   var result = true;
                   if (b.onclick) result = b.onclick();
                   if (typeof(result) == 'undefined' || result)
                     eval(b.getAttribute('href'));
                 }
             };";

            string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);

            Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);

            base.OnPreRender(e);
        }
    }
}

次に、Webアプリケーションに戻り、CustomControlsプロジェクトへの参照を追加します。Project上記のプロジェクトを既存のソリューションに追加することを提案したので、[参照の追加]タブからこれを実行できるはずです。上記のプロジェクトを独自のソリューションで構築したい場合は.dll、タブを使用してそのファイルへの参照を追加しBrowseます。参照が追加されると、新しいLinkButtonDefaultコントロールを使用する準備が整います。

コントロールを使用するには、コントロールが使用される各ページで@ Registerディレクティブを使用するか、コントロールをWeb.configに追加して、アプリケーション全体で簡単に参照できるようにします。以下に両方の方法を示します。あなたの質問に基づいて、私はあなたがそれをWeb.configに追加したいと思うでしょう。MSDNの記事を参照してください。この情報は、ページの途中の「タグプレフィックス」セクションにあります。

@Registerディレクティブの使用:

目的のページに移動し、コントロールを使用する各ページの上部にディレクティブを.aspx追加します。Register

<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="CC" %>

同じページで、コントロールの複数のインスタンスを使用できるようになりました。次に例を示します。

<p><strong>1st Panel:</strong></p>
<asp:Label runat="server" ID="helloLabel" />
<asp:Panel ID="Panel1" runat="server" DefaultButton="lbHello">
    First name:
    <asp:TextBox runat="server" ID="txtFirstName" />
    <CC:LinkButtonDefault ID="lbHello" runat="server" Text="Click me" OnClick="lbHello_Click"
        OnClientClick="alert('Hello, World!');" />
</asp:Panel>

<p><strong>2nd Panel:</strong></p>
<asp:Label runat="server" ID="fooBarLabel" />
<asp:Panel ID="Panel2" runat="server" DefaultButton="lbFooBar">
    Other:
    <asp:TextBox runat="server" ID="TextBox1" />
    <CC:LinkButtonDefault ID="lbFooBar" runat="server" Text="Click me" OnClick="lbFooBar_Click" />
</asp:Panel>

()の背後にあるコードで、以下.aspx.csを追加する必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    // example of adding onClick programmatically
    lbFooBar.Attributes.Add("onClick", "alert('Foo Bar!');"); 
}

protected void lbHello_Click(object sender, EventArgs e)
{
    helloLabel.Text = String.Format("Hello, {0}", txtFirstName.Text);
}

protected void lbFooBar_Click(object sender, EventArgs e)
{
    fooBarLabel.Text = String.Format("FooBar: {0}", TextBox1.Text);
}

Web.configの使用:

Web.configを使用するには、上記の例で使用したものとまったく同じマークアップとコードを保持します。次の手順を実行します:

  1. @ Register.aspxマークアップで使用されているディレクティブを削除します。
  2. Web.configWebアプリケーションのファイルを開きます。
  3. セクションを見つけます<system.web>...</system.web>
  4. そのセクションに次のマッピングを追加します。

マッピング:

<pages>
  <controls>
    <add assembly="CustomControls" namespace="CustomControls" tagPrefix="CC" />
  </controls>
</pages>

再コンパイルすると、すべてが正常にビルドされます。@ Registerこれにより、個々のページでディレクティブを指定する必要がなくなります。

行き詰まって質問があれば、私に知らせてください。たくさんのコードを含む長い投稿なので、上記のすべてを注意深く読んでください。

于 2010-09-05T20:50:15.837 に答える
0

System.Web.UI.Pageから派生するクラス(Fooと呼びましょう)を作成し、メソッドを抽象化して再利用できるようにすることができます。すべてのContentPageは、System.Web.UI.PageではなくFooから派生する必要があります

于 2010-09-04T12:33:34.807 に答える
0

マスターページを使用するか、コードをSystem.Web.UI.Pageオブジェクトをパラメーターとして受け取る静的関数に分割することをお勧めします。もちろん、継承(これは機能します)をいつでも使用できますが、VS.NET WebフォームデザイナーがASPXページで大きなフリークアウトを行うため、ドラッグアンドドロップのデザインタイム機能を使用してページをレイアウトする機能が失われます。 System.Web.UI.PageまたはSystem.Web.UI.MasterPageから直接派生しないでください。

于 2010-09-04T12:39:06.130 に答える