• 締切済み

GridViewのコントロールを変更したい

お知恵を貸してください。 データが1件もなくても、見出しを見せるために データ行の1行目をヘッダーとして扱っています。 また、表示したい列が可変長のため、 デザイン側では、TemplateField等を指定せずに、 RowDataBoundイベントにて、一部の項目を テキスト、ボタン、リンクに変更しました。 この状態でボタンを押したら、 変更したテキスト、ボタン、リンクが消えてしまったので、 RowCreatedイベントでコントロールを作る処理をいれたのですが、 直接バインドするデータがなかった最後の列については、 e.Row.Cells.Addで実現できたのですが、 バインドしている項目については、 e.Row.Cells[0].Controls.Add(テキスト)としてみたのですが、 RowDataBoundイベントで、RowCreatedで作ったはずのIDが FindControlで取得できません。 実行時にバインドされるコントロールを変えることはできないのでしょうか?

みんなの回答

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

RowDataBoundイベントとRowCreatedイベントってどっち先に発生するんでしたっけ? Dataをバインドしようとして行が作成されるような気もするんですが。。。 あと、処理のタイミングとしてGridViewのPreRenderを検討してみてはどうでしょう。 このタイミングだとデータのバインド等が終了し、HTMLを生成(レンダリング)する直前なので見え方等を変えるには一番よいのではないかと思います。

kurocky
質問者

お礼

回答ありがとうございます。 RowDataBoundの前にRowCreatedが走っています。 急遽別作業が発生してしまい、まだPreRenderを試していませんが、 やってみます。

kurocky
質問者

補足

PreRenderで試してみました。 ボタンを押す前に入力した値が、押した後には消えてしまいました。 可変の列ですが、上限があるようなので、 デザインで作成しておき、地道に隠すしかないのでしょうか。

関連するQ&A

  • ASP.Net GridView の加工

    大変お世話になります。 GridView のテンプレートモードにいくつかのコントロールを配置しております。 コントロールAの値が True なら コントロールBの背景色を変えたいと思っているのですが、 どのイベントでそれらを記述して良いかわかりません。 また、GridView1_DataBinding、GridView1_DataBound、GridView1_RowDataBound などで記述しようとするのですが、これらのイベントでは、FindControl メソッドが使えないのですが、  GridView1_RowDataBound イベントで e.Row.Cells(1).Text = "1" などで記述しないとダメでしょうか? テンプレートにしてしまうと、e.Row.Cells の概念はどういうふうになるなど、わからないことだらけです。 何卒よろしくお願いいたします。

  • GridViewにバインドせずにデータを表示する方法

    環境:VS2008&VB.NET&ASP GridViewに手動でテーブルからデータを読みデータバインドせず DBの値を表示する方法を考えていますがうまくいかず困っています。 (データバインドしたくない理由はデータバインドを行っていると行の挿入や移動ができない認識のためです。) 初心者のため見当違いなことをしているかもしれませんが それも含めまして質問させていただきます。 質問1 そもそもGridViewでデータバインドせずに手動でデータを表示することは可能でしょうか。 質問2 以下のコードで試しましたが「GridView1.Controls(0).Controls.Add(row1)」でExeptionが発生してしまいました。 手順に不適格な箇所があるのでしょうか。 strSql = "SELECT * FROM Data_Table" Using connection As New SqlClient.SqlConnection(cnStr) Dim command As New SqlClient.SqlCommand(strSql, connection) connection.Open() Dim dr As SqlClient.SqlDataReader = command.ExecuteReader While (dr.Read = True) 'データあり str1 = dr("data1") str2 = dr("data2") str3 = dr("data3") End If connection.Close() Dim item1 As DataGridItem item1 = New DataGridItem(-1, -1, ListItemType.Item) Dim cell0 As TableCell = New TableCell item1.Cells.Add(cell0) Dim cell1 As TableCell = New TableCell item1.Cells.Add(cell1) Dim cell2 As TableCell = New TableCell item1.Cells.Add(cell2) Dim row1 As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal) row1.Cells.Add(cell0) row1.Cells.Add(cell1) row1.Cells.Add(cell2) GridView1.Controls(0).Controls.Add(row1) End While End Using エラーの内容 System.ArgumentOutOfRangeException はユーザー コードによってハンドルされませんでした。 Message="指定された引数は、有効な値の範囲内にありません。 パラメータ名: index" お力添えをよろしくお願い致します。

  • GridViewからの値を全件LOOPして取得したい

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 画面上に設置したボタン押下のイベントハンドラで、そのGridViewの全行をループして各列の値を参照したいのですが、 以下のようなに記述しても(1)の部分でNOTHINGとなりエラーになります。 どのようにすればよいでしょうか? やりたいことは、GridView全行ループし、ITEMKINDの値が"1"の時、TemplateField内にあるtxtNVERCHARの値を取得することです。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="ITEMKIND" HeaderText="ITEMKIND" Visible="False" /> </asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox CssClass="txtstr" ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub 更新_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExec.Click For Each row As GridViewRow In grdList.Rows Dim strITEMKIND As TextBox = DirectCast(row.FindControl("ITEMKIND"), TextBox)  ←(1) IF strITEMKIND.Text = "1" THEN Dim strDDL As TextBox = DirectCast(row.FindControl("txtNVERCHAR"), TextBox) End IF Next End Sub

  • ASP.Net GridView TextBoxで

    大変お世話になります。 FormViewにあるGridView を編集状態にした状態で、 Dim Gv As GridView = FormView1.Row.FindControl("GridView1") TextBoxのデータを変更した際に、他のTextBoxの内容を変更したいのですが、 この場合、GridViewのTextBoxのTextChangedイベントを使用しています。 ここで問題なのが、 (1) GridVew の行の Index の取得 (2) TextChangedイベント内での FindControl の記述の仕方 上記のやり方がよくわかりません。 ボタンを使用した場合の Index の取得などはわかるのですが、 GridView1_RowCreated イベントで Dim A As Button = CType(e.Row.FindControl("A"), Button) A.CommandArgument = e.Row.RowIndex.ToString() 上記(1)、(2)はどうしたらよいのかわかりません。 編集状態にあるGridView の Index の取得方法とローカル関数でのFindCotrol メソッドの やり方など、お分かりになる方がいらっしゃいましたら 何卒ご教授いただければと存じます。

  • vb.net web 動的に作成したTableが消える

    よろしくお願いします 現在、vs.net 2005 で web ページを作成しています そこで質問があるので、ご教授の程よろしくお願いします。 test.aspx Table コントロール配置:Table1 Button コントロール配置:Button1 Label コントロール配置:Label1 Label コントロール配置:Label2 test.aspx.vb Partial Class test Inherits System.Web.UI.Page Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load Dim row As TableRow Dim col As TableCell If (Page.IsPostBack = False) Then Label2.Text = "aaa" row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) End If End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Rows.Count" & Table1.Rows.Count End Sub End Class ボタンを押すと、 Label2の "aaa" は保持されていて Table1が保持されないのはなぜなのでしょうか? Table1 の内容を保持させたいのですが その場合、どのようにすればよいのでしょうか

  • GridViewのDropDownLisについて

    よろしくお願いします ASP.NET(Microsoft Visual Basic 2010)で開発をしております。 GridViewにDropDownLisを配置しているのですが、 リストを選択したときの、GridViewの行(row)を取得する方法が分かりません。 OnSelectedIndexChangedを使用すると変更時のイベントを拾えて リストボックスの内容を取得出来るところまでは調べたのですが、 変更したリストボックスと同じ行にある別の項目の値を取得する 必要があるのですが、その方法が分かりません。 変更した行番号が分かれば「gridView.Rows(3).Cells(3).Text」で 値の取得は出来るのかな?と考えました。 なので、目的は同行の値の取得なので、もし行数が分からなくても 構いません。 自分なりには、かなり調べたつもりなのですが、どうしても答えを 導けず困っています。 お分かりの方がありましたら、是非ご教授頂ければ幸いです。 よろしくお願い致します。

  • 動的に作成したコントロールの削除方法

    はじめまして。 現在ASP.net でweb画面を作成していますが、動的に作成したコントロールの削除が不規則な動きをしており困り果ててこちらにきました。よろしくお願いします。 配置してあるテーブルに行だけを動的に追加しており その行には、テキストボックスと削除ボタンが含まれています。 不規則な動きというのは、以下になります。 1行目の削除ボタンを押す→1行目が消える 1行目になった削除ボタンを押す→変化なし 1行目の削除ボタンを押す→末尾の行が消える という状態です。デバッグで確認すると、 Removeで消しているコントロールIDは確かに1行目のものなのに、 画面が開くとそれが残っているという現象です。 そしてなぜ末尾が途中から消されていくのかは分かりません。 もしかして思うのは、毎回Loadで動的に生成しているため、 削除ボタンが押されたときもLoad一度生成したものをイベントハンドラで削除しようとしていておかしくなるのかなという気もしますが、 毎回生成しないとコントロール自体が消えてしまい、Loadでなくイベントハンドラで生成するようにすると、今度は入力値が消えてしまいます。 ソースは以下になります。(一部抜粋) とても困っています。宜しくお願いします。 'テーブルの枠だけデザイナで作成しておく <table id="tblDynamic" runat="server" enableviewstate="false">  </table> 'ロード Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load  ’配置してあるテーブルに行を動的に追加する  For rowCnt As Integer = 1 To 10   tblFormat.Rows.Add(retCreateRow(rowCnt))  Next End Sub ’テーブルの行(コントロールを含む)を作成して返す関数 Function retCreateRow(rowCnt As Integer) As HtmlTableRow  Dim tr As New HtmlTableRow  Dim cel1 As New HtmlTableCell  Dim cel2 As New HtmlTableCell  Dim txt As New TextBox  Dim btn As New ImageButton  txt .ID = "txt " & "_" & rowCnt cel1.Controls.Add(txt)  tr.Cells.Add(cel1)  btn.ID = "btn" & "_" & rowCnt  btn.text="行削除" AddHandler btn.Click, New System.Web.UI.ImageClickEventHandler(AddressOf btnDelete_btnInsert) cel2.Controls.Add(btn)  tr.Cells.Add(cel2)  Return tr End Function '行削除イベントハンドラ Private Sub btnDelete(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim ControlIdx = Split(CType(sender, ImageButton).ID, "_")(1) 'この削除ボタンがある行Indexを取得 For HitIdx As Integer = 1 To tblFormat.Rows.Count If Not IsNothing(tblFormat.Rows(HitIdx).FindControl(CType(sender, ImageButton).ID)) Then 'あった!この行を削除する Me.tblFormat.Rows.RemoveAt(HitIdx) Exit For End If Next End Sub

  • DataGridViewにリンク列の追加に関して

    開発環境:Visual Basic 2008 教えて下さい。 画面上にDataGridViewを配置し、データベースから取得した値を表示させていますが、 その際に、ある項目だけリンク列としたいと考えています。 いろいろネットで調べたところ、単純にDataGridViewにリンク列にする方法は記載がありましたが、 Datatableとバインドしているような場合のやり方は記載がなく、、、 以下のような場合(リンク項目をリンクとしたい)はどのようにリンクとしたら良いでしょうか?? ※ リンク項目はDBの内容で、それぞれリンク先を異なるリンク先にしたいと考えています。 《記述内容》 Private Sub 作成_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'データセットにテーブルを追加する dtTable = dtSet.Tables.Add("データ_TBL") 'テーブルにフィールドを追加する dtTable.Columns.Add("部品", Type.GetType("System.String")) dtTable.Columns.Add("リンク項目", Type.GetType("System.String")) 'DataGridViewにデータを表示する G_GRID.DataSource = dtTable End Sub Private Sub BTN_表示_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_TEXT.Click ********* かなり抜粋 ********* Do until data_row("部品") = IN_名称(HCOUNT).IN_部品 ← 上処理でDBより取得 data_row("リンク項目") = IN_名称(HCOUNT).IN_リンク項目 ← 上処理でDBより取得 dtTable.Rows.Add(data_row) loop End Sub よろしくお願いします。

  • GridViewからチェックボックスでデータを選択し、次のページへ送信する動作について

    現在VisualWebDeveloper2005にて、セミナーの申し込みページを作成しています。 動作は、コース一覧(GridView)からチェックボックスで受けたいコースを選択し、GridViewの下にある[申し込む]ボタンを押すとGridViewからチェックがついている行のデータ(コースID)を取得し、次ページに送信→次ページでそのIDをもとにGridViewで詳細情報を表示する確認ページを作成したいと思っています。 GridViewの中にチェックボックスを作成し、チェックボックスがオンになっているもののみ、という部分まではプログラムが完成しているのですが、取得したデータを送信→次ページで受け取り表示の部分がわからずに困っています。 チェックした行のデータをSessionに入れようと考えたのですが 'チェックボックスがオンになっている時、その行のIDを取得してテキストボックスに表示 Protected Sub Button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) For Each row As GridViewRow In GridView1.Rows Dim cb As CheckBox = CType(row.FindControl("cbSelect"), CheckBox) If cb.Checked Then Session("test") = row.Cells(1).Text Response.Redirect("kakunin.aspx") End If Next End Sub このプログラムだと複数の項目をチェックしても1つしかデータが送信されないのでどうすればいいかわからない状態です。 3日ほどどうすればいいかを検索してみたのですが、良い答えが見つからなかったので質問させていただきます。よろしくお願いします。

  • GridViewに行追加するには?

    ObjectDataSourceをGridViewにバインドしてGridViewを表示しています。GridViewは1画面に20行固定で表示したいのですが、表示するデータが20行に満たない場合でも空白行を追加して、20行表示にしたい。空白行を追加するにはどうすればよろしいでしょうか? GridView1.Controls[0].Controls.AddAt(INDEX,GridViewRow)で追加できそうなのですが、GridViewRowの作成方法がわかりません。 よろしくおねがいします。