fc2ブログ

記事一覧

リピーターの明細毎のデータを取得・更新する方法 -How to get the dataitem value of all rows in repeater- | asp.net


今回は asp.net の サーバーコントロール Repeater において 明細毎のデータを取得・更新する方法についてご紹介いたします。
asp.net 標準の ListView や Repeater には ItemDataBound というデータバインド時のイベントがあり、e.Item.DataItem を使用するとバインド時のデータは取得できますが、ポストバック時に明細毎のデータを取得するには Container.DataItem がNULLになっており、取得できないのです。


aspnet_repeater_dataitem_01.png


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



1.Repeater の実装方法

Repeater の内部で表示用の DataBinder.Eval をインライン式で実装してデータセットのデータを表示します。さらに、ItemDataBound 用と ポストバック時の更新用の2種類のラベルを用意します。

aspnet_repeater_dataitem_02.png


RepeaterTest.aspx
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="RepeaterTest.aspx.vb" Inherits="AspNetTest.RepeaterTest" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>RepeaterTest</title>
<link rel="stylesheet" type="text/css" href="~/Styles/Style.css" media="all" />
<script src="Scripts/jquery-1.10.2.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<%-- リピーター --%>
<asp:Repeater ID="rptLargeCategory" runat="server">
<ItemTemplate>
<ul>
<li>
Id:
<asp:Label ID="lblIndex" runat="server" Text='<%# Container.ItemIndex.ToString() %>' />
Code:
<asp:Label ID="lblCode" runat="server" Text='<%# Eval("LargeCode") %>' />
Name:
<asp:Label ID="lblName" runat="server" Text='<%# Eval("LargeName") %>' />
<br>
ItemDataBound:
<asp:Label ID="lblValue1" runat="server" /> <%-- ItemDataBindイベントで設定 --%>
<br>
Button_Click:
<asp:Label ID="lblValue2" runat="server" /> <%-- Buttonクリックイベントで設定 --%>
</li>
</ul>
</ItemTemplate>
</asp:Repeater>
<asp:Button ID="btnConfirm" runat="server" Text="OK" />
</div>
</form>
</body>
</html>




2.イベントの実装

データバインド時のイベントとボタンクリック時のポストバックイベントを用意します。

RepeaterTest.vb
Option Explicit On
Option Strict On

Public Class RepeaterTest
Inherits System.Web.UI.Page

''' <summary>
''' ViewStateにデータセットを保持します。
''' </summary>
''' <returns></returns>
Private Property DataSource As DataSet
Get
Return DirectCast(ViewState("DataSource"), DataSet)
End Get
Set(value As DataSet)
ViewState("DataSource") = value
End Set
End Property

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not IsPostBack Then

Dim dbUtil As New DbUtility()
Dim ds1 As DataSet = Nothing
Dim ds2 As DataSet = Nothing
Dim ds3 As DataSet = Nothing
Dim sql1 As New StringBuilder
Dim sql2 As New StringBuilder
Dim sql3 As New StringBuilder

'大カテゴリ取得
sql1.AppendLine(" SELECT LargeCode ")
sql1.AppendLine(" ,LargeName ")
sql1.AppendLine(" FROM T_Category_L ")
sql1.AppendLine(" WHERE LargeCode <= 5")
sql1.AppendLine(" ; ")

dbUtil.Connect()
dbUtil.ClearParams()

'データを取得する
ds1 = dbUtil.ExecuteFill(sql1.ToString, "CategoryLarge")
Me.DataSource = ds1

'データバインド
Me.rptLargeCategory.DataSource = ds1
Me.rptLargeCategory.DataBind()

End If

End Sub

''' <summary>
''' リピータのデータバインド時イベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub rptLargeCategory_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles rptLargeCategory.ItemDataBound

If e.Item.ItemType = ListItemType.Item OrElse
e.Item.ItemType = ListItemType.AlternatingItem Then

'バインドされた行のラベルを取得します。
Dim lblValue1 As Label = DirectCast(e.Item.FindControl("lblValue1"), Label)

'ラベルにバインドデータを表示します。
lblValue1.Text = DataBinder.Eval(e.Item.DataItem, "LargeCode").ToString()

End If

End Sub

''' <summary>
''' ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnConfirm_Click(sender As Object, e As EventArgs) Handles btnConfirm.Click

'Repeaterの全明細をRepeaterItemとして取得します。
Dim items As RepeaterItemCollection = DirectCast(Me.rptLargeCategory.Items, RepeaterItemCollection)

'明細をループし、RepeaterItemからラベルコントロールを取得します。
For Each item As RepeaterItem In items
Dim index As Integer = item.ItemIndex
Dim lblValue2 As Label = DirectCast(item.FindControl("lblValue2"), Label)

'ラベルにデータセットの同じIndexのデータを表示します。
lblValue2.Text = DirectCast(Me.DataSource, DataSet).Tables(0).Rows(index).Item("LargeCode").ToString()
Next

End Sub

End Class



以上で Repeater 全ての明細の lblValue1 にデータが表示され、ボタンをクリックすると全ての明細の lblValue2 にデータを更新する事ができます。





最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも 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

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