C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Datagridviewの値が変更されているか判別


(過去ログ 74 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■43038 / inTopicNo.1)  Datagridviewの値が変更されているか判別
  
□投稿者/ hs (163回)-(2009/10/27(Tue) 15:17:37)

分類:[VB.NET/VB2005 以降] 

VS2008-VBです。
いつもお世話になっております。

DataGridViewで月ごとのスケジュールを登録する昨日を作っております。
年月度を選択できるコンボボックスを配置し、選択された月のカレンダー(列:日付, 列:スケジュール内容)を手動で生成しております。
そのDataGridViewに表示された月を初期値とし、カレンダー(列:日付, 列:スケジュール内容)のいずれかが変更(入力)されているかを判別できればと考えております。
また、年月度を選択した際、以前に登録されていたデータがあれば、そのスケジュールも表示されるようになっています。この場合、DataGridViewの初期値は表示されたデータとします。

これを[登録]ボタンを配置しクリック時に、変更があれば登録処理を行いたいのですが、なにか良い手法がありましたらご教授ください。

よろしくおねがいします。
引用返信 編集キー/
■43041 / inTopicNo.2)  Re[1]: Datagridviewの値が変更されているか判別
□投稿者/ gtk2k (104回)-(2009/10/27(Tue) 16:31:26)
2009/10/27(Tue) 16:32:32 編集(投稿者)
データソースがDataTableであればRowStateで判断するとか?

Dim dt As DataTable = CType(Me.DataGridView1.DataSource, DataTable)
For Each row As DataRow In CType(Me.DataGridView1.DataSource, DataTable).Rows
    Select Case row.RowState
        Case DataRowState.Added
            ' 追加
        Case DataRowState.Deleted
            ' 削除
        Case DataRowState.Modified
            ' 更新
    End Select
Next
dt.AcceptChanges() ' 変更をコミットする。

引用返信 編集キー/
■43042 / inTopicNo.3)  Re[2]: Datagridviewの値が変更されているか判別
□投稿者/ たくボン (282回)-(2009/10/27(Tue) 17:16:31)
No43041 (gtk2k さん) に返信
> 2009/10/27(Tue) 16:32:32 編集(投稿者)
>
> データソースがDataTableであればRowStateで判断するとか?
>
> Dim dt As DataTable = CType(Me.DataGridView1.DataSource, DataTable)

DataAdapterとかで一括して更新するなら、変更行(新規、削除含む)が存在するかどうかの判断でもいいかな。

dt.GetChanges.Rows.Count > 0なら前回のAcceptChanges後(もしくはFill後)になんらかの変更があったと判断。

独自に更新処理を組むならgtk2kさんの方法。ただし、DataTableのRowをFor Eachするのは避けて、Select()のDataViewRowState指定で個別に処理するのがいいかも。

引用返信 編集キー/
■43115 / inTopicNo.4)  Re[3]: Datagridviewの値が変更されているか判別
□投稿者/ hs (164回)-(2009/10/29(Thu) 13:01:02)
No43041 (gtk2k さん) に返信
No43042 (たくボン さん) に返信

いつもありがとうございます。
最初の質問で言葉足らずでした...

Dim SQL As String = "SELECT * FROM Table WHERE 日付 BETWEEN #" & ○/○/1 & "# AND #" & ○/○/最終日 & "#"
Dim Ds As DataSet = New DataSet("Tabel")
Dim Da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(SQL, Cn)
Da.Fill(Ds, "Tabel")

For i = 1日 to コンボボックスで選択した年月の最終日
  If   Then
    Dim Drow as DataRow = Ds.Tables("Tabel").Rows(i)
    'i日に登録があれば.Rows.Add
    Me.DataGridView.Rows.Add(Drow.Item("日付"), Drow.Item("スケジュール内容"))
  Else
    'i日に登録がなければスケジュール内容は "" で.Rows.Add
    Me.DataGridView.Rows.Add(CDate(i), "")
  End If
Next

のように (もう少し条件分岐があるのですが...) カレンダを生成しています。
これは編集する上で、行(日付)単位の追加・削除ができるようにこの手法を使っております。

ですのでデータソースをDataTableにすることもできず、試行錯誤しておりました。

また、表示する際にカレンダーとして見せるために再度コンボボックスで年月度を選択した際、編集中にDataGridViewの行が削除され登録されていても再びDataGridViewには毎回1日〜月最終日までが生成され、登録のある日付にはスケジュール内容が表示されるようになっております。

gtk2k さんの
> Select Case row.RowState
で判定という具合に今回のケースは簡単に行けそうもなさそうです。

今回は、[登録]ボタンをクリックした際、変更がないのに処理を行うのが無駄だと思い投稿されていただきましが、
毎回登録処理を行って対応しようと思います。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -