WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

ListView でソート(行の並び替え)

by WebSurfer 2012年5月26日 15:35

ListView で、ヘッダのリンクボタンをクリックして、その列に設定した SortExpression に従って行の並べ替えを行う例です。

ListView でソート(列の並べ替え)を行う例

GridView の場合は、ウィザードを使ってコードは一行も書かないで簡単にできますが、ListView では少しですが自力でコードを書かなければなりません。

GridView の場合は AllowSorting プロパティを true に設定すれば、ヘッダが自動的に LinkButton になって、それをクリックすれば、その列に設定した SortExpression に従って列の並べ替えが行われます。

ところが、ListView には AllowSorting プロパティという便利なものはありません。ウィザードで作っていくと、ヘッダは普通のテキストになりますので、それを自力で LinkButton に置き換えて、Text、CommandName、CommandArgument の各プロパティを設定してやる必要があります。

Text にはヘッダに表示するテキスト、CommandName は Sort、CommandArgument は SortExpression を設定します。以下のコード例を参考にしてください。それだけで、GridView と同様な列の並べ替えが可能になります。

昇順/降順を示すイメージをヘッダのテキストに追加して表示する場合は、MSDN ライブラリの ListView.Sorting イベント のページのコードが参考になると思います。

以下、余談かもしれませんが、気がついたポイントを書いておきます。

SortExpression は複数の列を指定することもできます。例えば、A, B, C 列があるとすると、C 列の SortExpression を A, B, C のようにすることも可能です。LinkButton のクリックを繰り返すと、昇順/降順が切り替わりますが、ASC/DESC は SortExpression の末尾に追加されます(A, B, C DESC のように)。

SQL Server に投げられるクエリに ORDER BY xxxxx が追加されることはありません(プロファイラで見ると分かりますが、ヘッダの LinkButton をクリックすると、SqlDataSource の SelectCommand に設定されたクエリが毎回そのまま投げられます)。ListView と SqlDataSource の中でどのような操作が行われているかは見えないので定かではないですが、たぶん、取得したデータから DataView を作って、その Sort プロパティ に SortExpression を設定し、ソートした結果を ListView に表示しているようです。(これは GridView の場合も同じです)

SqlDataSource.DataSourceMode は DataSet でなければなりません。DataReader では、ソートを行うために LinkButton をクリックすると、System.NotSupportedException がスローされます。

以下にコード例をアップしておきます。上の画像の ListView を表示したコードです。

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  // ListView でソートするサンプル

  protected void Button1_Click(object sender, EventArgs e)
  {
    // 初期状態に戻すには SortExpression を "" にして
    // ListView.Sort メソッドを実行する。(GridView で
    // も同様)
    ListView1.Sort("", SortDirection.Ascending);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
  <style type="text/css">
    table.style1
    {
      border-style: solid;
      border-width: 2px;
      border-color: Black;
      text-align: center;
      border-collapse: collapse;
    }
       
    table.style1 th
    {
      border-style: solid;
      border-width: 2px 1px 2px 1px;
      border-color: Black;
      padding: 0px 5px 0px 5px;
    }
        
    table.style1 td
    {
      border-style: solid;
      border-width: 1px;
      border-color: Black;
      padding: 0px 5px 0px 5px;
    }
  </style>

</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:Button ID="Button1" 
      runat="server" 
      Text="初期状態に戻す" 
      OnClick="Button1_Click" />

    <asp:SqlDataSource ID="SqlDataSource1" 
      runat="server" 
      ConnectionString="<%$ ConnectionStrings:Northwind2 %>" 
      SelectCommand=
        "SELECT SupplierID, CategoryID, UnitPrice, ProductName 
        FROM Products" 
      DataSourceMode="DataSet">
    </asp:SqlDataSource>

    <asp:ListView ID="ListView1" 
      runat="server" 
      DataSourceID="SqlDataSource1">
      <ItemTemplate>
        <tr>
          <td>
            <asp:Label ID="SupplierIDLabel" runat="server" 
              Text='<%# Eval("SupplierID") %>' />
          </td>
          <td>
            <asp:Label ID="CategoryIDLabel" runat="server" 
              Text='<%# Eval("CategoryID") %>' />
          </td>
          <td>
            <asp:Label ID="UnitPriceLabel" runat="server" 
              Text='<%# Eval("UnitPrice") %>' />
          </td>
          <td>
            <asp:Label ID="ProductNameLabel" runat="server" 
              Text='<%# Eval("ProductName") %>' />
          </td>
        </tr>
      </ItemTemplate>
      <LayoutTemplate>
        <table>
          <tr>
            <td>
              <table ID="itemPlaceholderContainer" 
                runat="server" 
                class="style1">
                <tr>
            <%--ソーティングのためヘッダーのテキストを LinkButton 
               に置き換える。CommandName を Sort に設定し、
              CommandArgument を SortExpression に設定。--%>
                  <th>
                    <asp:LinkButton ID="LinkButton1" 
                      runat="server" 
                      Text="SupplierID" 
                      CommandName="Sort" 
                      CommandArgument="SupplierID" />
                  </th>
                  <th>
                    <asp:LinkButton ID="LinkButton2" 
                      runat="server" 
                      Text="CategoryID" 
                      CommandName="Sort" 
                      CommandArgument="SupplierID,CategoryID" />
                  </th>
                  <th>
                    <asp:LinkButton ID="LinkButton3" 
                      runat="server" 
                      Text="UnitPrice" 
                      CommandName="Sort" 
                      CommandArgument=
                        "SupplierID,CategoryID,UnitPrice" />
                  </th>
                  <th>
                    <asp:LinkButton ID="LinkButton4" 
                      runat="server" 
                      Text="ProductName" 
                      CommandName="Sort" 
                      CommandArgument="ProductName" />
                  </th>
                </tr>
                <tr runat="server" ID="itemPlaceholder">
                </tr>
              </table>
            </td>
          </tr>
          <tr>
            <td>
            <%--以下はオマケのちょっと凝ったページャー。--%>
              <asp:DataPager ID="DataPager1" runat="server">
                <Fields>
                  <asp:TemplatePagerField>              
                    <PagerTemplate>
                      Page
                      <asp:Label runat="server" 
                        ID="CurrentPageLabel" 
                        Text="<%# Container.TotalRowCount>0 ? 
                          (Container.StartRowIndex / Container.PageSize) + 1 : 0 %>" />
                      of
                      <asp:Label runat="server" 
                        ID="TotalPagesLabel" 
                        Text="<%# Math.Ceiling (
                          (double)Container.TotalRowCount / Container.PageSize) %>" />
                      (
                      <asp:Label runat="server" 
                        ID="TotalItemsLabel" 
                        Text="<%# Container.TotalRowCount%>" />
                      records)
                      <br />
                    </PagerTemplate>
                  </asp:TemplatePagerField>
                                    
                  <asp:NextPreviousPagerField
                    ButtonType="Button"
                    ShowFirstPageButton="true"
                    ShowNextPageButton="false"
                    ShowPreviousPageButton="false" />
                  <asp:NumericPagerField 
                    PreviousPageText="< Prev 3"
                    NextPageText="Next 3 >"
                    ButtonCount="3" />
                  <asp:NextPreviousPagerField
                    ButtonType="Button"
                    ShowLastPageButton="true"
                    ShowNextPageButton="false"
                    ShowPreviousPageButton="false" />
                </Fields>
              </asp:DataPager>
            </td>
          </tr>
        </table>
      </LayoutTemplate>
    </asp:ListView>
  </div>
  </form>
</body>
</html>

Tags: ,

ASP.NET

名前解決

by WebSurfer 2012年5月23日 21:48

Windows ネットワークにおける「名前解決」について、いろいろ調べて分ったことを備忘録として書いておきます。

Windows ネットワークで利用されるプロトコルには、大きく分けて NetBIOS 系のプロトコルと、TCP/IP 系のプロトコルがあり、その目的に応じて使い分けられています。(はじめから通信プロトコルに TCP/IP を採用していた UNIX 系の OS では NetBIOS 名という考え方は存在しません)

もともとこれらのプロトコルはまったく別のものでしたが、NBT(NetBIOS over TCP/IP)などの技術によって両者は巧みに組み合わされ、ユーザーはその違いをほとんど意識することなく利用することができるようになっています。

従って、現在では、Windows ネットワークにおける名前解決とは NetBIOS 名またはホスト名を IP アドレスに正しくマップすることと定義してよさそうです。

Windows ネットワークにおける名前解決のための機能は複数あり、標準的に、以下の優先順位で名前解決のための各機能が利用されています。(以下の「WINS サービス」と「NetBIOS 名のブロードキャスト」の部分はノードタイプによって異なります。詳しくは @IT の記事 第19回 NetBIOS over TCP/IPプロトコル(その2) (4/4) を見てください)

NetBIOS 名前キャッシュ
    ↓
WINS サービス
    ↓
NetBIOS 名のブロードキャスト
    ↓
lmhosts ファイル
    ↓
hosts ファイル
    ↓
DNS サービス

以下に、各機能の説明を書きます。

(1) NetBIOS

NetBIOS は、ネットワークサービスを呼び出すための API インターフェイスです。IBM-PC 用のネットワークアダプタ上に実装されていた BIOS の API として 1980 年代前半に開発され、Windows 95/98 や Windows NT、LAN Manager などを始め、パソコン用のネットワークサービスの API として広く普及したそうです。

アプリケーションでは、NCB(Network Control Block)というデータ構造体に NetBIOS のコマンドとそのパラメータをセットし、NetBIOS インターフェイスを呼び出すことによって各種のネットワークサービスを受けることができます。

NetBIOSは、通信プロトコルの規格ではなく、API の呼び出しインターフェイスの仕様です。物理的なネットワーク媒体やその上でやり取りされるパケットの構造については決めていません。

下位ネットワークプロトコルとしては、NetBEUI (NetBIOS Extended User Interface) や TCP/IP などが利用されています。TCP/IP をベースとするものを特に NBT(NetBIOS over TCP/IP)といいます。

(2) NetBEUI

NetBIOS API を使う Windows 95 時代の通信プロトコルが NetBEUI です。ブロードキャストを多用すること、ルーティング機能が実装されていないことから、プロトコルとしては小規模な LAN 向けです。

基本的にはコンピュータが自分の NetBIOS 名を知っていて、それが(ブロードキャストで)呼ばれたら変事をするような仕組みになっています。

現在では NBTに移行されていて、NetBEUI が使われることはほとんどないそうなので、忘れてよさそうです。実際、Windows 7 から NetBEUI が廃止されています。

(3) NBT

時代の流れに乗って一気に TCP/IP に移行してしまうと、今まで使ってきた NetBEUI と NetBIOS による Windows のファイル共有やプリンタ共有ができなくなるので、Microsoft の戦略として、TCP/IP 上で NetBIOS API を使えるようにしたのが NBT(NetBIOS over TCP/IP)です。

NBT により、複数セグメントに分かれたネットワークでも、NetBIOSのアプリケーションそのままで対応可能になりました。

参考: NBTとは

(4) NetBIOS 名

NetBIOS のサービスを利用して通信する場合、各コンピュータには必ず NetBIOS 名が付けられている必要があります。通信相手を特定するのに、IP アドレスや MAC アドレスではなく、この NetBIOS 名が利用されるためです。(NetBIOS 名は 16 バイト固定で、最後の 1 バイトがサフィックスという点が、コンピュータ名とはちょっと違います)

NetBIOS名 は、システムの起動時に各マシンごとに動的に登録するようになっています。つまり、あらかじめコンピュータに割り当てられた NetBIOS 名を、システムの起動時にネットワークにブロードキャストしたり、WINS サーバに登録したりし、それが認められて初めて Windows ネットワークに参加することができます。

逆に言えば、認められなければ、サービスを提供するだけでなく、ほかのマシンのサービスを利用することもできません。この点が、IP アドレスさえ割り当てられれば動作する TCP/IP とは大きく異なります。

参考: NetBIOS名とは何か?

(5) NetBIOS 名前キャッシュ

名前解決の結果は一定時間(デフォルトで 600 秒)だけ NetBIOS 名前キャッシュに格納されます。次にまた通信を行う場合、キャッシュ中に該当するエントリがあれば、キャッシュから IP アドレスが取り出され、問い合わせパケットを送信することはありません。

NetBIOS 名キャッシュの内容は「nbtstat -c」コマンドを実行すれば確認できます。解決した NetBIOS 名とユニークかグループかの種別、IP アドレス、寿命(キャッシュの有効期限。単位は秒)の情報が表示されます。

(6) WINS サービス

WINS (Windows Internet Name Service) は、NetBIOS over TCP/IP を使うルーティングされるネットワークで、NetBIOS の名前解決から発生した問題を解決するよう設計されたものだそうです。

各コンピュータが NetBIOS 名と IP アドレスの対応付けを WINS サーバーに登録しておき、利用したい場合には WINS サーバーに相手コンピュータの NetBIOS 名で問い合わせることで、相手コンピュータの IP アドレスを取得することができます。

なお、WINS にはドメインという概念がないので、大きなネットワークでも 1 台のサーバーで管理しなくてはいけないという問題を抱えています。そのためか、Microsoft も WINS には見切りをつけていて、廃止の方向に向かっているそうです。

参考: WINS の定義

(7) NetBIOS 名のブロードキャスト

WINS サービスが利用可能だからといって、必ずしも WINS サービスを使うと言うわけではなく、NBT のノードタイプによってはWINSサーバを使わず、ブロードキャストを使う場合があります。

ノードタイプは、RFC 1001『Protocol Standard for a NetBIOS Service on a TCP/UDP Transport: Concepts and Methods』 で定義されていて、以下の通り 4 種類あります。

  1. b ノード(ブロードキャスト)
  2. p ノード(ピアツーピア:WINS サーバー利用)
  3. m ノード(混合:ブロードキャスト ⇒ WINS サーバー利用)
  4. h ノード(ハイブリッド:WINS サーバー利用 ⇒ ブロードキャスト)

参考: NetBIOS 名の解決

(8) lmhosts ファイルと hosts ファイル

Windows ネットワークにおいて静的な名前解決を行う手段としては、hosts ファイルと lmhosts (LAN Manager Hosts) ファイルの 2 つがあります。

hosts ファイルは、もともとは TCP/IP プロトコルで使われてきた名前解決手段ですが、現在では NBT 系のサービスでも利用されている、一番基本的な名前解決手段です。

lmhosts ファイルは、もともとは NBT プロトコルで利用されてきた名前解決手段で、主に NetBIOS 名と IP アドレスの対応付けを管理しています。

いずれも systemroot\System32\Drivers\Etc フォルダに格納されています。

参考: hosts と lmhostsの違い

(9) DNS サービス

Microsoft は Windows2000 で Active Directory という Windows ネットワークを管理する新しい仕組みを導入し、その中で名前解決の仕組みに DNS を導入しました。Windows ネットワークでも、本格的に TCP/IP + DNS という仕組みを採用したわけです。

しかしながら、上に述べましたように、過去の資産を継承するために NetBIOS の仕組みも存続させています。NBT も搭載していますし、NetBIOS 名の名前解決の仕組みとして WINS も存続しています。

それゆえ、Windows ネットワークは NetBIOS 名とホスト名が混在するややこしい状態になっています。

参考: NetBIOS名の登録

Tags: , ,

その他

リソース埋め込みカスタムコントロール

by WebSurfer 2012年5月19日 15:26

画像、html ファイル、スクリプトファイル、css ファイルなどのリソースをアセンブリに埋め込んで使用する、カスタムコントロールのサンプルです。

リソース埋め込みカスタムコントロール

参考にしたのは、Microsoft サポートの Working with Web Resources in ASP.NET 2.0 です。サンプルコードほとんどそのままですが、CSS を参照する部分ほかを若干変更し、自分なりに注釈を加えてみました。

カスタムコントロールの本体は、table 要素の中に画像とアンカータグを配置したものです。mouseover、mouseout イベントで、コントロールの画像とラベルの色を変化させています。クリックすると、ヘルプページ Help.htm に遷移するようになっています。

必要な画像、html ファイル、スクリプトファイル、css ファイルなどのリソースは、すべてカスタムコントロールのアセンブリに埋め込んであります。

それらの内容は、以下の画像の通りです。MsButton.cs がカスタムコントロール本体、その他が埋め込んだりソースです。

Visual Studio のソリューションエクスプロー��ーとプロパティウィンドウ

ソースファイルの内容は以下の通りです。ソースを Visual Studio のプロジェクトに追加したら、上の画像のように、各リソースのプロパティのビルドアクションを「埋め込まれたりソース」に設定するのを忘れないようにしてください。その他、個別の注意点は下記の説明を参照してください。

実際に動かして試せるよう 実験室 にこのカスタムコントロールを使ったページをアップしましたので、興味のある方は試してみてください。


MsButton.cs

カスタムコントロールの本体です。基本は、table 要素の中に画像とアンカータグを配置したものです。

アセンブリに埋め込んだリソースは、GetWebResourceUrl メソッド によって URL 参照を取得して使用します。

2013/7/6 追記:this.GetType() ⇒ typeof(MsButton) に変更。詳細は リソース埋込カスタムコントロールの継承 を参照してください。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace SimpleControl
{
  [ToolboxData(
    "<{0}:MSButton runat='server' Text='Problems?'><{0}:MSButton>")]
  public class MsButton : WebControl
  {
    [Category("Appearance")]
    [DefaultValue("Problems?")]
    [Description("Text for Label")]
    [Localizable(true)]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public string Text
    {
      get
      {
        String s = (String)ViewState["Text"];
        return ((s == null) ? String.Empty : s);
      }
      set
      {
        ViewState["Text"] = value;
      }
    }

    protected override void CreateChildControls()
    {
      ClientScriptManager cs = Page.ClientScript;

      // 2013/7/6 修正
      // このコントロールを継承する場合 this.GetType() ではダメ
      // this は継承先になり、結果、リソースが見つからない。
      //Type rsType = this.GetType();

      Type rsType = typeof(MsButton);

      // css への参照を <head></head> に配置
      HtmlLink css = new HtmlLink();
      css.Href = 
        cs.GetWebResourceUrl(rsType, 
          "SimpleControl.MyStylesheet.css");
      css.Attributes["rel"] = "stylesheet";
      css.Attributes["type"] = "text/css";
      Page.Header.Controls.Add(css);

      Literal tableStart = new Literal();
      tableStart.Text = 
        "<table cellspacing='0' cellpadding='0'>" + 
        "<tr><td valign='middle'>";
      this.Controls.Add(tableStart);
      HyperLink linkImage = new HyperLink();
      linkImage.NavigateUrl = 
        cs.GetWebResourceUrl(rsType, "SimpleControl.Help.htm");
      linkImage.Attributes.Add(
        "onmouseover", "ChangeImage('image1','Green')");
      linkImage.Attributes.Add(
        "onmouseout", "RollbackImage('image1','Red')");

      this.Controls.Add(linkImage);

      Image img = new Image();
      img.ImageUrl = 
        cs.GetWebResourceUrl(rsType, 
          "SimpleControl.smallFail.gif");
      img.ID = "image1";
      // ASP.NET 4 からは自動的に border-width を 0 に設定
      // しなくなった
      img.Style["border-width"] = "0";
      linkImage.Controls.Add(img);

      Literal ltTableColumn = new Literal();
      ltTableColumn.Text = "</td><td valign='middle'>";
      this.Controls.Add(ltTableColumn);

      HyperLink linkText = new HyperLink();
      linkText.NavigateUrl = 
        cs.GetWebResourceUrl(rsType, "SimpleControl.Help.htm");
      linkText.Attributes.Add(
        "onmouseover", "ChangeImage('image1','Green')");
      linkText.Attributes.Add(
        "onmouseout", "RollbackImage('image1','Red')");

      this.Controls.Add(linkText);

      Label lbl = new Label();
      lbl.ID = "Label1";
      lbl.Text = this.Text;
      lbl.Font.Name = "Verdana";
      lbl.Font.Bold = true;
      lbl.Font.Size = FontUnit.Medium;
      lbl.ForeColor = System.Drawing.Color.Red;
      linkText.Controls.Add(lbl);

      Literal tableEnd = new Literal();
      tableEnd.Text = "</td></tr></table>";
      this.Controls.Add(tableEnd);

      // MyScript.js ファイルを参照するスクリプト
      // ブロックを追加。
      cs.RegisterClientScriptInclude(
        "MyScript", 
        cs.GetWebResourceUrl(rsType, 
          "SimpleControl.MyScript.js"));

      base.CreateChildControls();
    }
  }
}

MyScript.js

このクライアントスクリプトは、mouseover、mouseout イベントで、コントロールの画像とラベルの色を変化させるためのものです。

img 要素の src 属性に、アセンブリ内のリソース smallFail.gif と smallSuccess.gif を参照する URL を動的に取得して設定している点に注意してください。

そのためには、スクリプトの中で、<%= WebResource("アセンブリ内のパス") %> のように記述します。それによって、<%= ~ %> ブロックの中身は実行時に動的に解析され、出力時には、

WebResource.axd?d=p_b6vJYrM2mWH00RZ2d...faEA2&t=634730293148422703

といったURLが埋め込まれます。その場合、後述しますが、WebResource 属性を定義する際、PerformSubstitution プロパティを true にしておく必要がありますので注意してください。

なお、ここでは簡略化のため Labal1 というサーバー側の ID を直接使っていますが、クライアント側の id は異なる場合がありますので(例:マスターページを使う場合など)、実際の応用には注意してください。

function ChangeImage(imgControl, varcolor) {
  document.getElementById(imgControl).src = 
    '<%=WebResource("SimpleControl.smallSuccess.gif")%>';
  document.getElementById('Label1').style.color = varcolor;
}

function RollbackImage(imgControl, varcolor) {
  document.getElementById(imgControl).src = 
    '<%=WebResource("SimpleControl.smallFail.gif")%>';
  document.getElementById('Label1').style.color = varcolor;
}

MyStylesheet.css

スタイルを何も指定しないと、ハイパーリンクの文字列には、mouseover でアンダーラインが入ります。この CSS が有効なのでアンダーラインは入りません。

a {
    text-decoration:none;
}

Help.htm

リソースに埋め込んだヘルプページです。コントロールをクリックすると、このページに遷移します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
	<head>
		<title>ヘルプのページ</title>
	</head>
	<body>
	    <h1>Help Page</h1>
        <p>これはヘルプページです。</p>
	</body>
</html>

AssemblyInfo.cs

アセンブリ内の指定された埋め込みリソースを Web リソースとして使用できるようにするため、WebResource 属性 を使用してメタデータ属性を定義します。

AssemblyInfo.cs ファイルは Visual Studio が自動生成しますので、その中に、以下のコードのように WebResource 属性の定義を追加します。(WebResourceAttribute クラス の説明のサンプルコードのように、クラスファイルに追加することもできます)

この中で、MyScript.js は、アセンブリ内のリソース smallFail.gif と smallSuccess.gif を参照している点が他と異なります。そのため、PerformSubstitution プロパティ を true にしています。

リソースのファイル名や名前空間(この例では SimpleControl)を間違えると、当然動きませんが、エラーもでないので原因が分からず、ハマったりするかもしれませんので注意してください。

また、リソースファイルを、プロジェクト直下でなく、別にフォルダを作ってそこに入れたりすると、名前空間が変わってきますので注意してください。例えば、プロジェクト直下に Resources というフォルダを作って、そこにリソースファイルを入れると、名前空間は SimpleControl ではなく、SimpleControl.Resources になります。

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Web.UI;

[assembly: AssemblyTitle("SimpleControl")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SimpleControl")]
[assembly: AssemblyCopyright("Copyright(c) 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 埋め込んだリソースが参照されるよう WebResource 属性を追
// 加。 これら以外は Visual Studio が自動生成したコード。
[assembly: WebResource("SimpleControl.Help.htm", 
    "text/html")]
[assembly: WebResource("SimpleControl.MyStylesheet.css", 
    "text/css")]
[assembly: WebResource("SimpleControl.smallFail.gif", 
    "image/gif")]
[assembly: WebResource("SimpleControl.smallSuccess.gif", 
    "image/gif")]

// MyScript.js は、アセンブリ内のリソース smallFail.gif
// と smallSuccess.gif を参照している。そのため、
// PerformSubstitution プロパティを true にしている。
[assembly: WebResource("SimpleControl.MyScript.js", 
    "text/javascript", PerformSubstitution = true)]
// WebResource 属性の追加はここまで。

[assembly: ComVisible(false)]

[assembly: Guid("3f6b9d6b-02db-48f8-acba-9cfe139a199a")]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Tags:

Web Custom Control

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar