none
DataViewのDefaultViewの挙動について RRS feed

  • 質問

  • DataTableをDataViewのDefaultViewを使って代入処理を行うと、
    1レコード目だけが書き換わりません。

    以下はFormにDataGridView1とButton1を貼り付けた状態での説明用コードです。

        Private dt As New DataTable

        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

                With dt
                    .Columns.Add("No")
                    .Columns.Add("値")
                    Dim rw As DataRow = dt.NewRow
                    rw("No") = "1"
                    rw("値") = "テスト1"
                    rw.Table.Rows.Add(rw)

                    rw = dt.NewRow
                    rw("No") = "2"
                    rw("値") = "テスト2"
                    rw.Table.Rows.Add(rw)

                    rw = dt.NewRow
                    rw("No") = "3"
                    rw("値") = "テスト3"
                    rw.Table.Rows.Add(rw)
                    .AcceptChanges()
                End With

                DataGridView1.DataSource = dt
        End Sub

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

            Dim dv As DataView = dt.DefaultView
            For Each rv As DataRowView In dv

                rv("値") = "成功"
            Next
        End Sub


    また、「dv.RowFilter = "No <> 3"」などで絞り込んでから代入すると、1レコード目もうまく代入処理できますが、何故かRowStateが1レコード目だけはModifiedにならずUnchangedのままであり、保存時に困ります。

    なお試行錯誤の結果、DefaultViewでも↓のコードを代入前に入れておくと1レコード目がうまく処理できることがわかりました。
    If rv.Row.RowState = DataRowState.Unchanged Then rv.Row.SetModified()

    気づかずに使っていると大変なことになっていたので、どなたかDefaultViewの詳しい仕様というか使い方をお聞きしたいです。

    追記

    開発環境はWin7Pro
    VS2010 Pro VB  .NET Framework4です。

    • 編集済み IWAKUN 2012年10月17日 2:47
    2012年10月17日 2:23

回答

  • 通常はDataRowViewのRowプロパティでDataRowを取得し、そこに値をセットすると思うのですが、このようにするとどうなりますか?


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

    • 回答としてマーク IWAKUN 2012年10月17日 3:27
    2012年10月17日 2:46
    モデレータ

すべての返信

  • 通常はDataRowViewのRowプロパティでDataRowを取得し、そこに値をセットすると思うのですが、このようにするとどうなりますか?


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

    • 回答としてマーク IWAKUN 2012年10月17日 3:27
    2012年10月17日 2:46
    モデレータ
  • trapemiyaさま

    うまくできました。
    「通常はRowプロパティ…」そうでしたか、たしかにそういうサンプルコードとか見た事ありました。
    新規行を追加するときしかRowプロパティは使ってませんでした。

    早速のご教示ありがとうございした。

    2012年10月17日 3:09