fc2ブログ

記事一覧

ListViewで行毎にテキストボックスのTextChangedイベントを発生させる方法 | asp.net


asp.net の ListView において、この行のテキストボックスはイベントを発生させたい。次の行はイベントを発生させないようにしたい。などという仕様になる場合があります。そのような場合に参考になるソースの一例をご紹介いたします。

aspnet_listview_textbox_event_01.png



前提条件
・Windows 7 Professional 以降 / Windows Server 2008 R2 以降
・Visual Studio 2008 Professional 以降
・VB.NET
・.Net Framework 3.5 以降



1.TextBoxのイベントの発生方法

まずは基礎的なことから説明します。
asp.net でイベントを動作させるには以下の2点の設定が必要です。
・AutoPostBack が True に設定すること
・イベントの紐づけが設定されていること
いずれも aspx または vb ファイルにて記述可能が可能です。

aspx側での記述
<asp:TextBox ID="TextBox1" runat="server" 
        AutoPostBack="True"
        OnTextChanged="TextBox1_TextChanged">
</asp:TextBox>

vb側での記述
Private Sub WebForm1_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender
    TextBox1.AutoPostBack = True 'PostBackをONにします。
    AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged    'イベントの紐づけを設定します。
End Sub


※vb側で処理する場合、イベントの登録・解除はLoadまたはPreRenderイベントにておこなってください。動的に変更する場合はPreRenderの方が良いでしょう。



2.TextBoxのイベントの紐づけ解除の方法

asp.net でイベントを動作させないようにするは以下の2点の設定が必要です。
・AutoPostBack を False に設定すること
・イベントの紐づけを解除する
いずれも aspx または vb ファイルにて記述可能が可能です。
ただし、動的に設定する場合は、aspx 側でイベントの紐づけを設定し、
vb 側でイベントの紐づけを解除する設定をしたほうが良いです。

vb側での記述
Private Sub WebForm1_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender
    TextBox1.AutoPostBack = False 'PostBackをOFFにします。
    RemoveHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged 'イベントの紐づけを解除します。
End Sub



3.ListViewにて行毎にイベントを発生させる設定

それでは本題である事例をご紹介致します。
大まかには、イベントの紐づけ設定を aspx 側で行い、イベントの解除を vb 側で行います。

aspx側の記述
<form id="form1" runat="server">
<div>
<asp:ListView ID="ListView1" runat="server" GroupPlaceholderID="groupPlaceHolder1" ItemPlaceholderID="itemPlaceHolder1">
<LayoutTemplate>
<table>
<tr runat="server">
<th runat="server">
<asp:Label ID="lblTiTleId" runat="server" Text="ID"></asp:Label>
</th>
<th runat="server">
<asp:Label ID="lblTitleName" runat="server" Text="名前"></asp:Label>
</th>
<th runat="server">
<asp:Label ID="lblTitleAge" runat="server" Text="年齢"></asp:Label>
</th>
<th runat="server">
<asp:Label ID="lblTitleResult" runat="server" Text="判定"></asp:Label>
</th>
</tr>
<asp:PlaceHolder runat="server" ID="groupPlaceHolder1"></asp:PlaceHolder>
</table>
</LayoutTemplate>
<GroupTemplate>
<tr>
<asp:PlaceHolder runat="server" ID="itemPlaceHolder1"></asp:PlaceHolder>
</tr>
</GroupTemplate>
<ItemTemplate>
<tr runat="server">
<td runat="server">
<asp:Label ID="lblID" runat="server" Text='<%# (Eval("ID")) %>'></asp:Label>
</td>
<td runat="server">
<asp:Label ID="lblName" runat="server" Text='<%# (Eval("NAME")) %>'></asp:Label>
</td>
<td runat="server">
<asp:TextBox ID="txtAge" runat="server" AutoPostBack="True" OnTextChanged="txtAge_TextChanged"></asp:TextBox>
</td>
<td runat="server">
<asp:Label ID="lblResult" runat="server"></asp:Label>
</td>
</tr>
</ItemTemplate>
</asp:ListView>
</div>
</form>


vb 側では ListView の行に設定されているテキストボックスをループして取得します。テキストボックスが取得できたら、AutoPostBackとイベントの解除を行います。

vb側の記述
Private Sub WebForm1_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender

    For i As Integer = 0 To Me.ListView1.Items.Count - 1 Step 2
        Dim tBox As TextBox = DirectCast(Me.ListView1.Items(i).FindControl("txtAge"), TextBox)
        tBox.AutoPostBack = False
        RemoveHandler tBox.TextChanged, AddressOf txtAge_TextChanged
    Next i

End Sub

※各行なので、Step 2 にて1行飛ばしで解除しています。





最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。