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

データグリッドビューの空白行(新規行)について

環境/言語:[VB.net VisualBasic2008 .netflamework3.5]
分類:[.NET]

聞きたいことがあります。
と その前に前回私が途中で打ち切ってしまった投稿のことなのですが、
その後いろいろ投稿と注意が飛んできていたので今回から途中できらないこととなるべく敬語を使うように気をつけますのでよろしくお願いします。
ちなみに前回のプログラムは晴れて失敗し、(いろんな意味で)自爆しました。
ですが、まだあきらめていません。いつか自爆します。
えと今回、質問したいことはバインドしたデータグリッドビューの空白行についてです。
今グループワークをしているのですが、データグリッドビュー(以下DGV)の空白行が打ち込んだとき空きが出ていると行ごと消えてしまいます。
たとえば
生産型(主キーnull許容無し) 値1 値2 値3  値4 メモ
と定義が書かれている場合、(値1からメモまでnull許容可能。←許容してるのに。) 値1から値4はfloat型 メモはnvercharです。
A 11.1 11.1 2 空白 頭我天才と順番に打ち込みエンターをを押しても行が削除されます。
削除の原因がnull許容してないからだ!と思って許容させてみても変わりません。
コードは
すいません 課題の関係上これ以上書き込めないんですm−−m
ですが データグリッドビューの異常を聞くだけなら多分グレーラインなんで、
多分大丈夫
聞きたいことをまとめますと、
1、データグリッドビューの空白行はnull許容に関係無しに必ず消えるのかどうか。
2、データグリッドビュー関係で過去コレと同じような異常に見舞われたことがあり、回復させた経験がある方いらっしゃいませんでしょうか?
よろしくお願いしますm−−m
削除キーは1515です
すいません 画像も張ります。
この状態からエンターを押すと消えます。
編集内容を保持したままエラー文を出して編集内容を消えないようにしたいです。




■No27095に返信(頭我悪蔵さんの記事)
> 聞きたいことがあります。
> と その前に前回私が途中で打ち切ってしまった投稿のことなのですが、
> その後いろいろ投稿と注意が飛んできていたので今回から途中できらないこととなるべく敬語を使うように気をつけますのでよろしくお願いします。
> ちなみに前回のプログラムは晴れて失敗し、(いろんな意味で)自爆しました。
> ですが、まだあきらめていません。いつか自爆します。
> えと今回、質問したいことはバインドしたデータグリッドビューの空白行についてです。
> 今グループワークをしているのですが、データグリッドビュー(以下DGV)の空白行が打ち込んだとき空きが出ていると行ごと消えてしまいます。
> たとえば
> 生産型(主キーnull許容無し) 値1 値2 値3  値4 メモ
> と定義が書かれている場合、(値1からメモまでnull許容可能。←許容してるのに。) 値1から値4はfloat型 メモはnvercharです。
> A 11.1 11.1 2 空白 頭我天才と順番に打ち込みエンターをを押しても行が削除されます。
> 削除の原因がnull許容してないからだ!と思って許容させてみても変わりません。
> コードは
> すいません 課題の関係上これ以上書き込めないんですm−−m
> ですが データグリッドビューの異常を聞くだけなら多分グレーラインなんで、
> 多分大丈夫
> 聞きたいことをまとめますと、
> 1、データグリッドビューの空白行はnull許容に関係無しに必ず消えるのかどうか。
> 2、データグリッドビュー関係で過去コレと同じような異常に見舞われたことがあり、回復させた経験がある方いらっしゃいませんでしょうか?
> よろしくお願いしますm−−m
> 削除キーは1515です
添付ファイル: 1279587387.png (12 KB)
■No27095に返信(頭我悪蔵さんの記事)
> 値1から値4はfloat型 メモはnvercharです。
それらは、「データベースの型」ですよね。

DataGridView に表示する場合には、DataTable 等を介して使うことが多いですが、
どの方法を使うにしても、表示前には「.NET の型」に変換されているはずです。
それはどのような型ですか?

たとえば、Double、Double?、Decimal、Decimal?、Integer、Integer?、String など。


> A 11.1 11.1 2 空白 頭我天才と順番に打ち込みエンターをを押しても行が削除されます。
値3が全角の「2」になっているのが妙ですね。
データ変換やデータ検証のために、何か追加のコードを記述しているのでしょうか?


> すいません 課題の関係上これ以上書き込めないんですm−−m
と言われましても、作成手順も無ければ現象を再現可能な最低限のコードもありませんから、
これだけの情報で状況が伝わる事は稀でしょう。もう少し具体的な情報が必要だと思いますよ。

たとえば「バインドしたデータグリッドビュー」と一口に言っても、
BindingSource を使っているとか、DataTable を直接割り当てたとか、
いろいろな使い方がありますし、現段階では設定ものコードも不明ですから、
正直答えようがありません。回答もなかなか付きにくいと思いますよ。

実際のところ、現象を再現させるだけなら、幾通りもの方法があるはずです。
極端な例で言えば、主キー列の MaxLength を 0 にした上で、DataGridView の
DataError イベントを e.ThrowException = False にしておくとか。


とりあえず、当方 VB2008 で実験コードを書いてみましたが、Enter キー押下時に
入力した値が勝手に消えてしまうことはありませんでした。

Public Class Form1
    Private WithEvents tbl As DataTable
    Private WithEvents dgv As DataGridView
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        tbl = New DataTable("生産型")

        Dim col0 As DataColumn = tbl.Columns.Add("type", GetType(String))
        Dim col1 As DataColumn = tbl.Columns.Add("min", GetType(Decimal))
        Dim col2 As DataColumn = tbl.Columns.Add("max", GetType(Decimal))
        Dim col3 As DataColumn = tbl.Columns.Add("plusLtd", GetType(Decimal))
        Dim col4 As DataColumn = tbl.Columns.Add("minusLtd", GetType(Decimal))
        Dim col5 As DataColumn = tbl.Columns.Add("memo", GetType(String))

        col0.AllowDBNull = False
        col1.AllowDBNull = True
        col2.AllowDBNull = True
        col3.AllowDBNull = True
        col4.AllowDBNull = True
        col5.AllowDBNull = True

        tbl.PrimaryKey = New DataColumn() {col0}

        dgv = New DataGridView() With {.Name = "dgv"}
        dgv.DataSource = tbl
        dgv.Dock = DockStyle.Fill
        Controls.Add(dgv)
    End Sub
End Class


> 1、データグリッドビューの空白行はnull許容に関係無しに必ず消えるのかどうか。
ここでいう空白行というのは、AllowUserToAddRows = True の際に表示される、
新規入力用の末尾行の事ですよね。

新規入力行は、入力を開始した時点で新規行では無くなります(.IsNewRow = False になる)。
入力中は、「編集を開始したが、その値は未確定で DataTable には反映されていない状態」です。

他の行に移動したり EndEdit メソッドを呼び出したりすれば、値は確定され、
その行は DataTable 側に反映された状態に変わりますが、値が確定する前の段階では、
たとえば入力エラーや Esc キーなどにより、未入力状態に戻る可能性があります。

# 質問の回答になっているかどうか分かりませんが。
裏でコードで何もやってない場合は…

行の確定とともにエラーも何も出ずに居なくなるなら実際には行はできているのでは?
DataGridViewと連携しているのが、
入力した内容だとたまたま対象外になるようなフィルタを指定してある「DataView」だったりは
しませんか?
ちょっと今立て込んでるんで返せないんですけど午後に必ず返事を返しますm−−m
もう少し待っててくださいm−−m
お二人ともありがとうございますm−−m
■No27095に返信(頭我悪蔵さんの記事)
> 値1から値4はfloat型 メモはnvercharです。
それらは、「データベースの型」ですよね。

DataGridView に表示する場合には、DataTable 等を介して使うことが多いですが、
どの方法を使うにしても、表示前には「.NET の型」に変換されているはずです。
それはどのような型ですか?

たとえば、Double、Double?、Decimal、Decimal?、Integer、Integer?、String など。

頭我悪蔵:ええと floatがdoubleで nvervharはstringだったかなたしか。


> A 11.1 11.1 2 空白 頭我天才と順番に打ち込みエンターをを押しても行が削除されます。
値3が全角の「2」になっているのが妙ですね。
データ変換やデータ検証のために、何か追加のコードを記述しているのでしょうか?
頭我悪蔵:すいません 間違えましたm−−m
A 11.1 11.1 1 2でした。


> すいません 課題の関係上これ以上書き込めないんですm−−m
と言われましても、作成手順も無ければ現象を再現可能な最低限のコードもありませんから、
これだけの情報で状況が伝わる事は稀でしょう。もう少し具体的な情報が必要だと思いますよ。

頭我悪蔵:やっぱりそうですよねぇ  こまった 次から同伝えようか・・・。

たとえば「バインドしたデータグリッドビュー」と一口に言っても、
BindingSource を使っているとか、DataTable を直接割り当てたとか、
いろいろな使い方がありますし、現段階では設定ものコードも不明ですから、
正直答えようがありません。回答もなかなか付きにくいと思いますよ。


頭我悪蔵:えーとmyprojectの設定にデータをぶちこんでからapp.configで何か細工して(友人が進めたので詳しいことは不明)データベースエクスプローラー横のデータソース内のテーブルにクリックしてコマンドリスト展開そのままデータグリッドビューを選んでデザイン画面に突っ込んだ。


実際のところ、現象を再現させるだけなら、幾通りもの方法があるはずです。
極端な例で言えば、主キー列の MaxLength を 0 にした上で、DataGridView の
DataError イベントを e.ThrowException = False にしておくとか。
頭我悪蔵:すいません さっぱりです。 も少し理解したら返事書きますm−−m

とりあえず、当方 VB2008 で実験コードを書いてみましたが、Enter キー押下時に
入力した値が勝手に消えてしまうことはありませんでした。

Public Class Form1
Private WithEvents tbl As DataTable
Private WithEvents dgv As DataGridView
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
tbl = New DataTable("生産型")

Dim col0 As DataColumn = tbl.Columns.Add("type", GetType(String))
Dim col1 As DataColumn = tbl.Columns.Add("min", GetType(Decimal))
Dim col2 As DataColumn = tbl.Columns.Add("max", GetType(Decimal))
Dim col3 As DataColumn = tbl.Columns.Add("plusLtd", GetType(Decimal))
Dim col4 As DataColumn = tbl.Columns.Add("minusLtd", GetType(Decimal))
Dim col5 As DataColumn = tbl.Columns.Add("memo", GetType(String))

col0.AllowDBNull = False
col1.AllowDBNull = True
col2.AllowDBNull = True
col3.AllowDBNull = True
col4.AllowDBNull = True
col5.AllowDBNull = True

tbl.PrimaryKey = New DataColumn() {col0}

dgv = New DataGridView() With {.Name = "dgv"}
dgv.DataSource = tbl
dgv.Dock = DockStyle.Fill
Controls.Add(dgv)
End Sub
End Class

頭我悪蔵:すいません 少し実験用に借りていきますねm−−m
> 1、データグリッドビューの空白行はnull許容に関係無しに必ず消えるのかどうか。
ここでいう空白行というのは、AllowUserToAddRows = True の際に表示される、
新規入力用の末尾行の事ですよね。

新規入力行は、入力を開始した時点で新規行では無くなります(.IsNewRow = False になる)。
入力中は、「編集を開始したが、その値は未確定で DataTable には反映されていない状態」です。

他の行に移動したり EndEdit メソッドを呼び出したりすれば、値は確定され、
その行は DataTable 側に反映された状態に変わりますが、値が確定する前の段階では、
たとえば入力エラーや Esc キーなどにより、未入力状態に戻る可能性があります。

頭我悪蔵:まったくもってそのとおりですm−−m↑!

# 質問の回答になっているかどうか分かりませんが。

いえ かなり ヒントになりましたm−−m ありがとうございます^^。
裏でコードで何もやってない場合は…

行の確定とともにエラーも何も出ずに居なくなるなら実際には行はできているのでは?
DataGridViewと連携しているのが、
入力した内容だとたまたま対象外になるようなフィルタを指定してある「DataView」だったりは
しませんか?

すいませんm−−m app.configでなにか細工しているようだ。ちょっとその友人に少し相談してみます。
回答内容をもう少し理解してみます????ちょっと 時間かかるかも。すいませんm−−m

返答が遅くなりもうしわけございませんm−−m 解決したときにはコードと解決内容を8月ごろに書かせていただきますm−−m(課題が終わるころ)

今回はこれでお二方ありがとうございますm−−m 
もうちょいでいけそうなのでがんばります。
引用の行が分かりにくいです。引用は全行 > 付けたほうがいいですよ。
あ〜  しもうた
すいません 次から気をつけますm−−m

・・・・・・はい!! 結果発表!!!

撃沈!!!!!
Public Class quality

Private Sub quality_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: このコード行はデータを 'DB_ceramickunDataSet.tbl_qlty' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
Me.Tbl_qltyTableAdapter.Fill(Me.DB_ceramickunDataSet.tbl_qlty)
Me.FormBorderStyle = FormBorderStyle.FixedSingle

End Sub

'DataErrorイベントハンドラ
Private Sub DataGridView1_DataError(ByVal sender As Object, _
ByVal e As DataGridViewDataErrorEventArgs) _
Handles DataGridView1.DataError

MessageBox.Show("値が不正です。")

e.Cancel = True

'主キー、空欄

End Sub

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

For Each RR In DataGridView1.Rows()

Dim msg As String = ""

Dim val As Double = RR.cells(1).value

If Not val < 0 Then
ElseIf val < 0 Then
'MessageBox.Show("-不可")
'Exit Sub
msg &= "最小値に負の値が設定されています。" & vbCrLf
End If

val = RR.cells(2).value

If Not val < 0 Then
ElseIf val < 0 Then
'MessageBox.Show("-不可")
'Exit Sub
msg &= "最大値に負の値が設定されています。" & vbCrLf
End If

val = RR.cells(3).value

If Not val < 0 Then
ElseIf val < 0 Then
'MessageBox.Show("-不可")
'Exit Sub
msg &= "加熱前抵抗値に負の値が設定されています。" & vbCrLf
End If

val = RR.cells(4).value

If val < 0 Then
ElseIf val > 0 Then
'MessageBox.Show("+不可")
'Exit Sub
msg &= "冷却後抵抗値に正の値が設定されています。" & vbCrLf
ElseIf val = Nothing Then
End If

If Not msg = "" Then
MsgBox(msg)
Exit Sub
End If

Next


If MessageBox.Show("更新しますか?", "更新", MessageBoxButtons. _
YesNo) = DialogResult.Yes Then

Me.Tbl_qltyTableAdapter.Update(Me.DB_ceramickunDataSet.tbl_qlty)

MessageBox.Show("更新しました。")
Exit Sub

Else

MessageBox.Show("更新しませんでした。")


Exit Sub


End If


End Sub

Private Sub DataGridView1_RowValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.RowValidating
Dim kazu As Integer = 0
Dim kaisuua As Double = 0
Dim LIVEla As Long
Dim tmp_checker As Boolean = False

If DataGridView1.CurrentRow.IsNewRow Then
Exit Sub
Else
End If



'Dim LIVE As Boolean = True
'For kazu = 0 To 4
' If Not DataGridView1.CurrentRow.Cells(kazu).Value.ToString = "" Then
' LIVE = False
' 'MsgBox("x")
' End If
'Next
''If LIVE = True Then
''With DataGridView1
'' .Rows.Remove(.SelectedRows(0))
''End With
'DataGridView1.CancelEdit()
'Exit Sub
''DataGridView1.CurrentRow.Visible = False
''End If


For kaisuua = 0 To 4
If DataGridView1.CurrentRow.IsNewRow Then
Exit Sub
Else
If DataGridView1.CurrentRow.Cells(kazu).Value Is Nothing OrElse DataGridView1.CurrentRow.Cells(kazu).Value.ToString = "" Then
'If DataGridView1.CurrentRow.Cells(kazu) Is Nothing Then
kazu = kazu + 1
kaisuua = kaisuua + 1

Else

End If
End If

If kazu = 5 Then
DataGridView1.CancelEdit()
tera()
Exit For
End If

Next
'If then

'Dim feimfeise As Boolean
'Dim feimdoosu As





'End If


If kazu = 5 Then

Dim superioru As Double = 0
Dim haiyala As Integer = 0


For haiyala = 0 To 4
If DataGridView1.CurrentRow.IsNewRow Then
Exit Sub
Else
If DataGridView1.CurrentRow.Cells(kazu).Value Is Nothing OrElse DataGridView1.CurrentRow.Cells(kazu).Value.ToString = "" Then
'If DataGridView1.CurrentRow.Cells(kazu) Is Nothing Then
haiyala = haiyala + 1
superioru = superioru + 1

Else

End If
End If

If kazu = 5 Then
DataGridView1.CancelEdit()
tera()
Exit For
End If

Next

If superioru = 5 Then
Exit Sub

End If




Else


With DataGridView1.CurrentRow.Cells(1).Value
If DataGridView1.CurrentRow.Cells(1).Value.ToString = "" Then tmp_checker = True
If tmp_checker AndAlso Not DataGridView1.CurrentRow.IsNewRow Then
MsgBox("値が入力されていないセルがあります。")
e.Cancel = True
Exit Sub

End If

End With

With DataGridView1.CurrentRow.Cells(2).Value
If DataGridView1.CurrentRow.Cells(2).Value.ToString = "" Then tmp_checker = True
If tmp_checker AndAlso Not DataGridView1.CurrentRow.IsNewRow Then
MsgBox("値が入力されていないセルがあります。")
e.Cancel = True
Exit Sub
End If
If .ToString = "" AndAlso Val(.ToString) > 0 Then tmp_checker = True
If Val(.ToString) < 0 Then
MsgBox("最大値の値が不正です。")
e.Cancel = True
Exit Sub

End If

End With

With DataGridView1.CurrentRow.Cells(3).Value
If DataGridView1.CurrentRow.Cells(3).Value.ToString = "" Then tmp_checker = True
If tmp_checker AndAlso Not DataGridView1.CurrentRow.IsNewRow Then
MsgBox("値が入力されていないセルがあります。")
e.Cancel = True
Exit Sub

End If
If .ToString = "" AndAlso Val(.ToString) > 0 Then tmp_checker = True
If Val(.ToString) < 0 Then
MsgBox("+差分限度が不正です。")
e.Cancel = True
Exit Sub
End If

End With
With DataGridView1.CurrentRow.Cells(4).Value
If DataGridView1.CurrentRow.Cells(4).Value.ToString = "" Then tmp_checker = True
If tmp_checker AndAlso Not DataGridView1.CurrentRow.IsNewRow Then
MsgBox("値が入力されていないセルがあります。")
e.Cancel = True
Exit Sub
End If
'If .ToString = "" AndAlso Val(.ToString) <> 0 Then tmp_checker = True
If .ToString = "" AndAlso Val(.ToString) > 0 Then tmp_checker = True
If .ToString = "" Then tmp_checker = True
If Val(.ToString) < 0 Then
Else
MsgBox("-差分限度が不正です。")
e.Cancel = True
Exit Sub
End If

End With

If tmp_checker AndAlso Not DataGridView1.CurrentRow.IsNewRow Then
MsgBox("値が入力されていないセルがあります。")
e.Cancel = True
Exit Sub
End If

End If
End Sub

Public Sub tera()
DataGridView1.CancelEdit()
DataGridView1.Rows.Remove(DataGridView1.CurrentRow)
End Sub
End Class
これがコードです。
一応成功文はちょっとあとで張ります。

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