DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridView.DataSourceにつきまして

環境/言語:[WindowsXP VB.net2005]
分類:[.NET]

はじめまして、いつもお世話になっております。
vb.net2005にて
データグリッドを使用して新規追加、更新画面を作成しています。
項目の中にコンボボックスが存在するので
ヘッダー等の設定はデザイナで行っています。

更新ボタン押下時に更新が行われた行に対してのみ
更新処理を行いたいのですが、
DataRow.Rowstateを使用する方法を使用する為に、
フォーム起動後に画面のDataGridViewの
DatasourseをDataTableにセットする方法は無いでしょうか?

やりたい事はこんな感じなのですが

フォームロード時

DataGridView1.DataSource = 画面の情報

更新ボタン押下時

Dim Table As DataTable = DirectCast(Me.DataGridView1.DataSource, DataTable)
Dim Rows As DataRow
For Each Rows In Table.Rows
Rows.RowState=DataRowState.Modifiedなら更新
Next

よろしくお願いいたします
■No22555に返信(37度さんの記事)
意味が分かりません。
フォームロード時は画面の情報は空だと思いますが、
どんな情報があるのでしょうか?

空のデータで更新ボタン押下時にエラーになることを
言っているなら、更新ボタン押下時にチェックすれば
いいのでは?
返信ありがとうございます。
説明が足りなくてすいません。

初期表示で空白行を10行表示。

新規の場合
1行目に値を入力

更新ボタンで1〜10行目のRows.RowStateをチェック

1行目更新ありなのでデータを追加。

更新の場合
データを取得して表示
1行目の値を変更

更新ボタンで1〜10行目のRows.RowStateをチェック

1行目更新ありなのでデータを更新。

Rows.RowStateを使用するには画面の情報をDataTableに設定
する必要があるようなのですが、
グリッドの項目でコンボボックスがあったり、フォントの変更等があるので
DataTableの設定後、DataGrid.DatasourceにDataTableをセットではなく
画面が表示された後にDataGrid.Datasourceを有効にして
更新の有無を判別する方法があれば教えていただきたいと思いました。

うまく伝わらなくて申し訳ないです。
■No22565に返信(37度さんの記事)
やっぱり分からないです。
説明が足りないのではなくて、同じ内容を違うように解釈しようとしてる?

>グリッドの項目でコンボボックスがあったり、フォントの変更等があるので
DataGrid の設定は見た目の話。Datasource に設定されている DataTable は
データのみの話。関係ない情報に思えます。

>DataTableの設定後、DataGrid.DatasourceにDataTableをセットではなく
>画面が表示された後にDataGrid.Datasourceを有効にして
画面が表示された時がフォームロード時だと思うのですが、質問の
コードで DataSource を設定してるため、どっちも同じ意味になります。
同じ説明を繰り返しています。

とりあえず、質問時のままで作ってみたら?で、具体的にコードを示して
どこがどうなるのが期待する結果で、実際はどこのデータがどうなってて、
それをこちらで再現できる手順を教えてください。
■No22566に返信(るしぇさんの記事)
返信ありがとうございます。

具体的につくってみました
フォームにグリッドを配置し項目を2つ追加
1つ目の項目はコンボボックスです
ボタンを1つ配置

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
For i = 0 To 9
DataGridView1.Rows.Add()
DataGridView1.Rows(i).Cells(0).Value = ""
DataGridView1.Rows(i).Cells(1).Value = ""
Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Table As DataTable = DirectCast(Me.DataGridView1.DataSource, DataTable)
Dim Rows As DataRow
For Each Rows In Table.Rows
MsgBox(Rows.RowState.ToString())
Next
End Sub
End Class

これだとDataGridView1.DataSourceの設定がされてないのでエラーが発生します。

最初の質問で DataGridView1.DataSource = 画面の情報
とありますがグリッドの項目でコンボボックスがあったり、フォントの変更等があり
うまく出来なかったためやっていません。失礼しました。

この場合に行の編集がされたかどうかを判別する良い方法がないでしょうか?
2008/08/05(Tue) 12:04:36 編集(投稿者)

■No22567に返信(37度さんの記事)
DataGrid かと思ってたら、DataGridView の方でしたか。
両方存在しますので、区別するようにしてください。

まず、System.NullReferenceException についてですが、DataSource に何も
設定していない場合、
『オブジェクト参照がオブジェクト インスタンスに設定されていません。』
というエラーになります。実体が設定されていないという意味です。
この場合、IsNothing 関数で判定できます。
この時は、全て新規データなのですから、
>この場合に行の編集がされたかどうかを判別する良い方法がないでしょうか?
必要ないですよね?DataGridView のセルを直接参照して更新処理を作ることも
できるはず。

ただ、新規と更新で、ある程度違うコードを書かないといけないので無駄ですね。


DataTable はただのデータの入れ物なので、データベース検索で作成されるものと
同じものをローカルで作成できます。サンプルはヘルプ(MSDN)に載ってます。
[DataTable クラス]
http://msdn.microsoft.com/ja-jp/library/system.data.datatable(VS.80).aspx
これで作ってしまえばいいのでは?
■No22568に返信(るしぇさんの記事)

ありがとうございます。
DataTableについてもう少し調べてみます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板