04. Page_Load

トップどんと来い! ASP.NET > 04. Page_Load

ListBox の使い方

ListBox というコントロールがあります。

これです。これを ASP.NET で実現する方法をご紹介します。
<asp:ListBox id="ListBox1" runat="server"></asp:ListBox>
これで見かけ上のリストボックスは作成できますが、残念ながらこれだけでは Items すなわち ListBox の中身が入っていない状態です。
最も簡単な方法が、 ListItem コントロールを利用する方法です。このコントロールを、ListBox の入れ子にすれば Items が増やせます。
<asp:ListBox id="ListBox1" runat="server">
<asp:ListItem Value="仲間">仲間</asp:ListItem>
<asp:ListItem Value="阿部">阿部</asp:ListItem>
<asp:ListItem Value="生瀬">生瀬</asp:ListItem>
</asp:ListBox>
ListItem の Value 属性はほとんど Text と同じです。 null 参照のときにちょっと違った動きをするらしいですが、実験してみた結果、生成される HTML は同じものでした。
この ListItem を利用する方法は WebMatrix では ListBox コントロールの Items プロパティを利用して設定します。
ListBox1.Items.Add(new ListItem("仲間"));
ListBox1.Items.Add(new ListItem("阿部"));
ListBox1.Items.Add(new ListItem("生瀬"));
この方法はプログラムコードからListBox1.Items コレクションに ListItems コントロール(オブジェクト)を追加します。これをどこに記述するかは次の項目です。
string[] trick_char = new string[]{"仲間","阿部","生瀬"};
ListBox1.DataSource = trick_char;
ListBox1.DataBind();
最後のがデータベースの得意な ASP.NET らしいプログラムです。
1行目で trick_char stirng 配列に項目を初期化して代入しています。
2行目で DataSource プロパティにそれを割り当てています。このプロパティは「デー タの素」を示すプロパティですからわかりやすいだろうと思います。
3行目で DataBind() メソッドを実行し、完了です。このメソッドははんこの ようなものでしょうか?書類に書き込んだ後、正式な文書ははんこを押すだろうと思います。その役目を果たすものですから、決して忘れてはなりません。

コードの原理からすると、最後のが最も早そうなので、というよりも最もきれいなので最後のを利用します。

Page_Load の使い方

さて、最後のを利用するといったものの、あれはプログラムコードですからビジュアル部品とは 分離して書かなければなりません。
すなわち、 <script ~> この中に入れなければなりませんが、ASP.NET はイベントの応答によりプログラムが呼び出されるため、地にそのまま書くにはいきません。

かといって、Button_Click などでわざわざ設定するのは面倒です。ユーザにボタンを押してもらわなければなりません。
ここで必要なのは、「ページがロードされるときに実行したいプログラム」を実行するためのイ ベントです。

それが、「 Page_Load 」イベントです。これを利用することにより、ページがロードされる時に実行できます。
void Page_Load(object sender, EventArgs e) {
string[] trick_char = new string[]{"仲間","阿部","生瀬"};
ListBox1.DataSource = trick_char;
ListBox1.DataBind();
}
Windows アプリケーションでは Form_Load イベントはForm の Load に追加していましたが、ASP.NET ではその必要はなく、定義すれば自動的に呼び出されます
WebMatrix において Page_Load を定義するには以下のようにします。
  1. デザインタブが選択状態にあることを確認し、プロパ ティウィンドウを見る
  2. 一番上コンボボックス(おそらく <P> となっている場合が多い。それ以外は何らかのコントロール名)を [ Page ]に切り替える
  3. すぐ下に雷のような黄色いマークがあるので、それをクリックする。これは「イ ベント」、その隣のが「プロパティ」と、切り替えるボタン
  4. [ Load ] を探して右側の空白部分をダブルクリック
しかし、Page_Load というのはそんなに簡単なものではありません。このプログラムだけでは足りません。
それは、Page_Load が Form_Load などに比べてより頻繁に呼び出されるからです。

たとえば、ボタンを押したらページはロードされます。しかし、実際に実行したいコードは「初めて呼び出され た時」だけ実行したいものであり、ボタンを押したからといっていちいち呼び出されては困るというものです。

しかし、呼び出されるのが現実ですから、その「初めて呼び出されたかどうか」ということを if で捕まえることができれば、2回目以降は回避できるのです。それが次項です。

IsPostBack

IsPostBack 。それが先ほど説明したプロパティにあたるものです。
ただし、これは
初めて呼び出された → false
2回目以降に呼び出された → true
を示します。

Post というのは Web アプリケーションでは重要です。郵便ポストのポストは「送 信」という感じがします。この Post も「ブラウザから何らかの情報がサーバに向けて送信された」というときに使います。

だから、PostBack は送信されて戻ってきたわけで、2回目以降に呼び出されたことを示します。
よって、初めて呼び出された時を if でとるならば、
if (!IsPostBack)
として、始めに「!」びっくりマークをつけるのを忘れてはなりません。

今回は、それにいろいろ付け足してこんなプログラムを作りました。
<%@ Page Language="C#" %>
<script runat="server">

// ページのコードをここに記述してください。
//

void Page_Load(object sender, EventArgs e) {
if(!IsPostBack)
{
string[] trick_char = new string[]{"仲間","阿部","生瀬"};
ListBox1.DataSource = trick_char;
ListBox1.DataBind();
}
}

void Button1_Click(object sender, EventArgs e) {
if (ListBox1.SelectedIndex != -1)
Label1.Text = ListBox1.SelectedItem.Text + "が好きらしい...";
else
Label1.Text = "もしかしてあなた、TRICKが嫌いなんてことはないでしょうね。";
}

</script>
<html>
<head>
</head>
<body>
<form runat="server">
<p>
<asp:ListBox id="ListBox1" runat="server"></asp:ListBox>
<asp:Button id="Button1" onclick="Button1_Click" runat="server" Text="Let's Go!!">
</asp:Button>
</p>
<p>
<asp:Label id="Label1" runat="server">うひょひょひょひょ</asp:Label>
</p>
<!-- コンテンツをここに配置してください。 -->
</form>
</body>
</html>
(( 補足 ))
<asp:Label>
これはラベルコントロールです。HTML で何に変換されるかというと、ただの <span> ですが、ここではれっきとしたオブジェクトなので Text プロパティを利用することができ、そのためここで使ってみました。