none
MasterPageを使った場合のGridViewのRowsが取得できない RRS feed

  • 質問

  • DataSet(TableAdapter)を使用した空テーブルGridViewを生成し、レコードの表示とそれに伴い、InsertできるTextBoxを設置し、一括InsertおよびUpdateできるようにしました。

    MasterPageを使用しなければ、空テーブルへのレコード追加更新動作はできますが、MasterPageを使用した場合、表示および入力は可能ですが更新は動作しません。

    何が原因として考えられるでしょうか?ContentPlaceHolderの為、form要素は使用しておりません。

    以下vbコード

    Protected Sub bttn_更新_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim tadapter = New DataTable1TableAdapter()
    
            Using tranScope = New TransactionScope()
                Using connection = New SqlConnection()
                    connection.ConnectionString = tadapter.Connection.ConnectionString
                    connection.Open()
    
                    Dim insertCommand = New SqlCommand("insert into tbl1 (A, B) values (@A, @B)", connection)
                    insertCommand.Parameters.Add("@A", System.Data.SqlDbType.Int)
                    insertCommand.Parameters.Add("@B", System.Data.SqlDbType.Int)
    
                    Dim updateCommand = New SqlCommand("update tbl1 set B = @B where (C = @C)", connection)
                    updateCommand.Parameters.Add("@B", System.Data.SqlDbType.Int)
                    updateCommand.Parameters.Add("@C", System.Data.SqlDbType.Int)
    
                    For Each gr As GridViewRow In GridView1.Rows
                        Dim B As Integer = Integer.Parse(DirectCast(gr.FindControl("B"), TextBox).Text)
                        Dim A As Integer = Integer.Parse(DirectCast(gr.FindControl("A"), Label).Text)
                        Dim C As Integer = Integer.Parse(DirectCast(gr.FindControl("C"), Label).Text)
    
                        If C = 0 Then
                            insertCommand.Parameters("@A").Value = A
                            insertCommand.Parameters("@B").Value = B
                            insertCommand.ExecuteNonQuery()
                        Else
                            updateCommand.Parameters("@B").Value = B
                            updateCommand.Parameters("@C").Value = C
                            updateCommand.ExecuteNonQuery()
    
                        End If
                    Next
                End Using
    
                tranScope.Complete()
    
            End Using
        End Sub
    
    End Class

    2012年4月3日 7:28

回答

すべての返信

  • マスターページ、およびコンテンツページのaspxも見せて下さい。公開に問題がある箇所は伏字にするなどして下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年4月3日 7:44
    モデレータ
  • 自己解決しました。

    MasterPageのformの

    enableviewstate="False"

    が問題でした。trueに変更し解決しました。

    失礼いたしました。

    2012年4月4日 1:13
  • 解決して良かったです。私の方でもRowsが0になる現象を再現したところでした。この原因はEnableViewStateがfalseであることは知っていましたが、GridViewにばかり目が行っていました。
    よく気が付かれましたね。私も勉強になりました。

    さて、解決されたところで一つ問題点を提示しておきます。私のコードでは、ユーザーが変更していない行まで変更、登録を行うようになっています。仕様上問題なければ良いのですが、無駄と言えば無駄にデータベースに更新しに行っています。
    バインドしたデータテーブルをSession変数に入れて取って置き、それとGridViewの行の値を比較し、変更されていたらデータベースへ変更、または登録に行くというロジックにするのが本来は良いと思います。
    ただ、比較するロジックは将来の仕様変更時などにバグ発生の可能性を高めますので、データベース更新のレスポンスなども考慮し、総合的に判断されると良いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年4月4日 1:54
    モデレータ
  • trapemiya様 御返答ありがとうございます。

    >私のコードでは、ユーザーが変更していない行まで変更、登録を行うようになっています。

    今のところ問題はありません。(というかレスポンスも測れないです)

    褒めていただけてものすごくうれしいです。今までのスレッドは質問ばかり(しかも基本的なところばかり)で、本当に皆様にはご迷惑と煩わしさがあったのではないかと反省ばかりしていました。なんとか聞くだけではなく自分でも勉強し、解決できればと、必死にもがきながらですが、少し前に進めた気がします。

    今は、trapemiya様にお教えいただいたコードから発展させようと(日付と時間の入力設置)頑張っています。このフォーラムに質問してよかったと思っております。

    私のWEBアプリは、まだまだ出来上がりませんが、次回質問するときはもっとまともな、皆さんに有益になるようなものにしたいと思います。

    ありがとうございました。

    2012年4月4日 2:05