asp.netのイベントの基本と注意事項
押下したボタンによってサーバ処理を分岐したい場合(例:登録ボタン、削除ボタン、検索ボタンなど)、いままでの方法では処理区分としてhidden
をsubmit
し、処理を分岐していました。
ASP.NET
ではsubmitコントロールにrunat="server"
属性を指定してsubmit
するようにすれば、サーバ処理ではフォームアプリと同じようにイベントのファンクションを定義できます。
フォームアプリとは違い、webアプリではサーバ処理を行うたびに画面全体を再描画するため、サーバ処理でのページロードイベントは常に実行されるので注意が必要です。
サーバ処理ではポストバック時にはIsPostBack
の値がtrue
になるので、初期表示時か、ポストバック時かで処理を分岐することができます。
ページロードイベントの処理はIsPostBack
がfalse
のとき(初期表示時のとき)のみ処理を行うようにすれば、フォームアプリと同じようなイメージでサーバ処理を実装することができます。
'ページロード(登録・削除ボタンクリック時でも発生します)
Private Sub Page_Load(ByVal sender As …) Handles MyBase.Load
'登録ボタンクリック
Private Sub btnInsert_Click(ByVal sender As …) Handles btnInsert.Click
'削除ボタンクリック
Private Sub btnDelete_Click(ByVal sender As …) Handles btnDelete.Click
いままでのコードにイベント処理を組み込んだコードは下記のようになります。
sample.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="sample1.aspx.vb" Inherits="sample1" %>
<html>
<head>
<title>aspを移植</title>
<script type="text/javascript">
function touroku(){
//クライアント側の入力チェック
if(document.frmMain.txtName.value==''){
alert('商品名を入力してください。');
return false;
}
if(document.frmMain.txtPrice.value==''){
alert('単価を入力してください。');
return false;
}
return true;
}
function init(){
if(document.frmMain.hidCheck.value=="1"){
alert("入力した商品名はすでに登録されています。");
}
}
</script>
</head>
<body onload="init()">
<form id="frmMain" runat="server">
<!-- buttonをsubmitコントロールに変更します -->
<input type="submit" value="登録" onclick="return touroku()" runat="server">
商品名:<input type="text" name="txtName" id="txtName" runat="server">
単価:<input type="text" name="txtPrice" id="txtPrice" runat="server">
<asp:GridView ID="grvDetail" runat="server" AutoGenerateColumns="false">
<Columns><asp:BoundField DataField="商品名" HeaderText="商品名" /></Columns>
<Columns><asp:BoundField DataField="単価" HeaderText="単価" /></Columns>
</asp:GridView>
<input type="hidden" name="hidCheck" id="hidCheck" runat="server" />
</form>
</body>
sample.aspx.vb
Imports System.Data
Partial Class sample1
Inherits System.Web.UI.Page
''' <summary>
''' ページロードイベント
''' </summary>
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'初期表示時のみこのタイミングで処理を行います
If Not IsPostBack Then
Dim dt As DataTable = getData() 'データ取得
dispData(dt) 'データ表示
End If
End Sub
''' <summary>
''' データ取得
''' </summary>
Private Function getData() As DataTable
Dim dt As DataTable
'データを取得する処理は省略します
Return dt
End Function
''' <summary>
''' データ表示
''' </summary>
Private Sub dispData(ByVal dt As DataTable)
grvDetail.DataSource = dt
grvDetail.DataBind()
End Sub
''' <summary>
''' 登録データをチェック
''' </summary>
Private Function checkData() As Boolean
'データが存在するかどうかチェックする処理は省略します
'すでにデータが登録されていたらtrueを返します
End Function
''' <summary>
''' データ登録
''' </summary>
Private Sub insertData()
'データを登録する処理は省略します
End Sub
''' <summary>
''' 登録ボタン押下イベント
''' </summary>
Private Sub btnTouroku_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTouroku.ServerClick
If checkData() Then 'データチェック
insertData()
Else
hidCheck.Value = "1"
End If
Dim dt As DataTable = getData() 'データ取得
dispData(dt) 'データ表示
End Sub
End Class