「これはヤバかったな」という遅刻エピソード

はじめまして。
現在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

A 回答 (1件)

どの行を生成するのか記憶しておく変数を準備して これをSessionに登録してみてはいかがでしょう



dim bRow(10) as Boolean

' Page_Loadイベント
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  if IsPostBack then
    '何かのアクションで呼び出されたのなら bRowをSessionから復元
    bRow = Session("bRow")
  else
    ' Sessionを新規生成
    Session("bRow") = bRow
  end if

  for n as integer = 1 to 10
    if bRow(n) = false then
      ' 削除済みフラグが設定されていなければ生成
      tblFormat.Rows.Add(retCreateRow(n))
    end if
  next
End Sub

' 行削除ハンドラ
Private Sub btnDelete(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Dim btn as ImageButton = CType(sender, ImageButton)
  Dim ControlIdx = Split(btn.ID, "_")(1)

  ' Sessionから bRowを取得
  bRow =Session("bRow")
  if bRow(ControlIdx) = false then
    bRow(ControlIdx) = true
    dim row as HtmlTableRow = btn.Parent.Parent
    tblFormat.rows.Remove(row)
    ' Sessionの更新
    Session("bRow") = bRow
  end if
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。教えていただいた方法で出来ました。

お礼日時:2013/03/20 22:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報