- PR -

動的に作成したテキストボックスの値を取得する

1
投稿者投稿内容
GALOAD
会議室デビュー日: 2006/07/27
投稿数: 10
投稿日時: 2006-08-05 00:50
毎々お世話になっております。

ASP.NET2.0でWeb画面を作っています。
repeaterコントロールで、現在のWebサイト配下にあるファイル、
及びそのファイルのサイズ、日付ををテキストボックス上に表示しています。
ページ表示後、「Button1」ボタン(下記ソース77行)をクリックされた時に
テキスト上に入力されている「ファイル名」、「サイズ」、「日付」を取得したいのですが、
その方法がわかりません。
もし、ご存知でしたら御教授お願い致します。


01:<%@ Page Language="VB" %>
02:<%@ Import Namespace="System.IO" %>
03:<%@ Import Namespace="System.Data" %>
04:
05:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
06:
07:<script runat="server">
08: Sub Page_Load(ByVal Sender As Object, ByVal e As EventArgs) Handles Me.Load
09:
10: If Not IsPostBack Then
11: Dim values As New ArrayList()
12:
13: Repeater1.DataSource = CreateDataSource()
14: Repeater1.DataBind()
15: End If
16: End Sub
17:
18: Function CreateDataSource() As ICollection
19: Dim di As DirectoryInfo = New DirectoryInfo(Server.MapPath("."))
20: Dim fi As FileInfo() = di.GetFiles()
21:
22: Dim dt As DataTable = New DataTable()
23: Dim dr As DataRow
24:
25: dt.Columns.Add(New DataColumn("filename", GetType(System.String)))
26: dt.Columns.Add(New DataColumn("filesize", GetType(System.Int64)))
27: dt.Columns.Add(New DataColumn("date", GetType(System.DateTime)))
28:
29: Dim i As Integer
30: For i = 0 To fi.Length - 1
31: dr = dt.NewRow()
32: dr(0) = fi(i).Name
33: dr(1) = fi(i).Length
34: dr(2) = fi(i).LastWriteTime
35: dt.Rows.Add(dr)
36: Next
37:
38: Dim dv As DataView = New DataView(dt)
39:
40: Return dv
41: End Function
42:
43: Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
44: '//ここに各テキストボックスの入力値を取得するコードを記述
45: End Sub
46:</script>
47:
48:<html xmlns="http://www.w3.org/1999/xhtml" >
49:<head runat="server">
50: <title>無題のページ</title>
51:</head>
52:<body>
53: <form id="Form1" runat="server">
54: <asp:Repeater id="Repeater1" runat="server">
55: <HeaderTemplate>
56: <table border="1">
57: <tr>
58: <td><b>filename</b></td>
59: <td><b>filesize</b></td>
60: <td><b>date</b></td>
61: </tr>
62: </HeaderTemplate>
63:
64: <ItemTemplate>
65: <tr>
66: <td> <asp:TextBox id="TxtFilename" runat="server" Text=<%# DataBinder.Eval(Container.DataItem, "filename") %> /></td>
67: <td> <asp:TextBox id="TxtFilesize" runat="server" Text=<%# DataBinder.Eval(Container.DataItem, "filesize")%> /> </td>
68: <td> <asp:TextBox id="TxtDate" runat="server" Text=<%# DataBinder.Eval(Container.DataItem, "date")%> /> </td>
69: </tr>
70: </ItemTemplate>
71:
72: <FooterTemplate>
73: </table>
74: </FooterTemplate>
75:
76: </asp:Repeater>
77: <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
78: </form>
79:</body>
80:</html>
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-05 02:18
Repeater1.Items(何番目のデータか).Controls(いくつ目のコントロールか)
これをTextBoxにキャストすればいいです。

[追記]
FindControl 。。そうか。。時間が時間だったし↑半ば本気で書いてました。。w

[ メッセージ編集済み 編集者: べる 編集日時 2006-08-06 00:45 ]
GALOAD
会議室デビュー日: 2006/07/27
投稿数: 10
投稿日時: 2006-08-05 15:34
べる様

早速のご返答、誠にありがとうございました。
お蔭様で、どのようなコーディングをすべきか見えてきました。

アドバイス頂きました通り、Button1をクリックした際のイベント処理に、
下記のような処理を入れていました。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'//ここに各テキストボックスの入力値を取得するコードを記述
Dim i As Integer
Dim intItems As Integer = Repeater1.Items.Count

For i = 0 To intItems - 1
'filename
Dim txtFilename As TextBox = CType(Repeater1.Items(i).Controls(1), TextBox)
'filesize
Dim txtFilesize As TextBox = CType(Repeater1.Items(i).Controls(2), TextBox)
'date
Dim txtDate As TextBox = CType(Repeater1.Items(i).Controls(3), TextBox)
Next
End Sub

これを実行したところ、3つのTextBoxのひとつ「Filename」は
正常にTextBoxにキャスト出来たのですが、
「filesize」はエラーが生じてしまいました。
-----------------------------------------
型 'System.Web.UI.LiteralControl' のオブジェクトを型 'System.Web.UI.WebControls.TextBox' にキャストできません。
-----------------------------------------
というエラー内容で、どうやら「filesize」のTextBoxのTextプロパティの値が
数値である為と考えられます。
このエラーを回避するのには、どのような方法があるのでしょうか?
(キャストのことなので、会議室違いになってしまうかもしれませんが…)

どうぞ、ご教授のほど宜しくお願い致します。

[ メッセージ編集済み 編集者: GALOAD 編集日時 2006-08-05 15:37 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-08-05 16:07
引用:

GALOADさんの書き込み (2006-08-05 15:34) より:

コード:
 'filename
Dim txtFilename As TextBox = CType(Repeater1.Items(i).Controls(1), TextBox) 




ここにブレイクポイントを設定して
Repeater1.Items(i).Controls の中身をすべて確認してみてください。

たぶん、テキストボックスとテキストボックスの間に何かが入っているはず
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-05 16:13
こんにちは。

引用:

GALOADさんの書き込み (2006-08-05 15:34) より:

型 'System.Web.UI.LiteralControl' のオブジェクトを型 'System.Web.UI.WebControls.TextBox' にキャストできません。


このエラーメッセージをちゃんと読んでみましたでしょうか。
Repeater1.Items(i).Controls(2) が TextBox ではなく
LiteralControl 型なので、TextBox にキャストできませんよとい
うエラーです(というか、読んでそのままですが)。

ですので

引用:

というエラー内容で、どうやら「filesize」のTextBoxのTextプロパティの値が
数値である為と考えられます。


が原因ではありません。

Repeater1.Items(i).Controls(2) というのは、
Repeater1.Items(i) の中のコントロール群の2番目という意味
です。それが LiteralControl 型ということは、Repeater1 の行
の中にテキスト以外のラベルなどが入っていたりするのではないで
しょうか(それが LiteralControl として認識されている)。
べるさんが示してくれたヒントはあくまでヒントなので、一般的には
コントロールの番号で指定することはあまりありません。
RepeaterItem.FindControl などを調べてみるといいのではな
いでしょうか。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
GALOAD
会議室デビュー日: 2006/07/27
投稿数: 10
投稿日時: 2006-08-05 17:00
>かるあ様

教えていただきました通り、「Repeater1.Items(i).Controls」の中身を
確認しましたが、Count、IsReadOnly、IsSynchronized、Item、SyncRoot等があり、
どこのプロパティをチェックすればよいのかわかりませんでした。
1度、Controlsプロパティについて勉強してから、わからないことあったら、
再度質問させて頂こうと思っています。ありがとうございました。


>ぽぴ王子様

引用:
--------------------------------------------------------------------------------

Repeater1.Items(i).Controls(2) が TextBox ではなく
LiteralControl 型なので、TextBox にキャストできませんよとい
うエラーです(というか、読んでそのままですが)。
--------------------------------------------------------------------------------

申し訳ありません。エラー内容を早読みしてしまい、
そのエラー内容を正しく理解していませんでした。(恥ずかしいかぎりで…)


引用:
--------------------------------------------------------------------------------
RepeaterItem.FindControl などを調べてみるといいのではな
いでしょうか。
--------------------------------------------------------------------------------

アドバイスの通り、FindControlメソッドを利用し、下記のように
コードを修正してみました。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'//ここに各テキストボックスの入力値を取得するコードを記述
Dim i As Integer
Dim intItems As Integer = Repeater1.Items.Count
For i = 0 To intItems - 1
'filename
Dim txtFilename As TextBox = Repeater1.Items(i).FindControl("TxtFilename")
'filesize
Dim txtFilesize As TextBox = Repeater1.Items(i).FindControl("TxtFilesize")
'date
Dim txtDate As TextBox = Repeater1.Items(i).FindControl("TxtDate")
Next
End Sub

これで正常に動作し、TextBoxのText値も正しく取得できることを確認できました。
誠にありがとうございました。

[ メッセージ編集済み 編集者: GALOAD 編集日時 2006-08-05 17:01 ]
1

スキルアップ/キャリアアップ(JOB@IT)