- - PR -
動的に作成したテキストボックスの値を取得する
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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> | ||||||||
|
投稿日時: 2006-08-05 02:18
Repeater1.Items(何番目のデータか).Controls(いくつ目のコントロールか)
これをTextBoxにキャストすればいいです。 [追記] FindControl 。。そうか。。時間が時間だったし↑半ば本気で書いてました。。w [ メッセージ編集済み 編集者: べる 編集日時 2006-08-06 00:45 ] | ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2006-08-05 16:07
ここにブレイクポイントを設定して Repeater1.Items(i).Controls の中身をすべて確認してみてください。 たぶん、テキストボックスとテキストボックスの間に何かが入っているはず | ||||||||
|
投稿日時: 2006-08-05 16:13
こんにちは。
このエラーメッセージをちゃんと読んでみましたでしょうか。 Repeater1.Items(i).Controls(2) が TextBox ではなく LiteralControl 型なので、TextBox にキャストできませんよとい うエラーです(というか、読んでそのままですが)。 ですので
が原因ではありません。 Repeater1.Items(i).Controls(2) というのは、 Repeater1.Items(i) の中のコントロール群の2番目という意味 です。それが LiteralControl 型ということは、Repeater1 の行 の中にテキスト以外のラベルなどが入っていたりするのではないで しょうか(それが LiteralControl として認識されている)。 べるさんが示してくれたヒントはあくまでヒントなので、一般的には コントロールの番号で指定することはあまりありません。 RepeaterItem.FindControl などを調べてみるといいのではな いでしょうか。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||
|
投稿日時: 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