- PR -

DataGridViewでスクロールして行くとエラーになるのですが・・・

1
投稿者投稿内容
ずっと初心者
会議室デビュー日: 2008/10/02
投稿数: 9
投稿日時: 2008-12-03 20:26
VB2005.NETにて、DaraGridviewを使ったアプリケーションを作っています。
分からないことが2つあります。
1つは、スクロールバーをドラッグしても、下の▼ボタンにぶつかるまでの間しか動きません。普通は、下の▼ボタンにぶつかると、最下段までスクロールするのですが、本当に物理的にその隙間分しか移動しません。
2つめの疑問は、どこかのセルをクリックし、「↓」キーか「Enter」キーで、押すと、スクロールはするのですが、33行目ぐらいで、『'399'の値'Value'に対して有効ではありません。'Value'は'minimum'と'maximum'の間でななければなりません』と言って落ちてしまいます。
バーが幅:983,高さ411、カラム数11、18行表示できる大きさで、スクロールバーは水平、垂直両方設定しています。この高さを小さくすると、20数行で落ちます。その時のメッセージは、最初の'399'が異なってきます。Tabの上にDataGridViewを載せていたのですが、どこかで、問題があるとの記事をにたので、Formの上に置きました。でも現象は変わりません。
ソースを出せるといいのですが、お見せできるように大分努力が必要です。
現象的には、かなり有名な話なのかなと思ったりして、まずは投稿してみました。
ご存知でしたら、お教え願います。よろしくお願いします。
ずっと初心者
会議室デビュー日: 2008/10/02
投稿数: 9
投稿日時: 2008-12-04 13:40
追っかけ質問です。
スクロールバーによるスクロールができないので、「↓」キーでスクロールさせていた時、
エラーが出ました。
どうせ使えないのであれば・・・と、デザイン時に、スクロールバーを「None」に設定して
みたところ、「↓」キーでのスクロールでエラーが出なくなりました。
垂直スクロールバーを設定している場合、エラーが発生していたタイミングは、
0行目を一番上に表示していた時に、一番下に表示されていた(RowIndex + 2)の行を
一番上に表示させようとするタイミングでした。
どこかちょっとした設定の問題である気もするのですが、ご存知の方がおられましたら、
教えてください。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-12-04 17:20
何が問いたいのでしょう?現象の発生する理由を問いたいのでしょうか?
それとも回避方法なのでしょうか?

引用:

ソースを出せるといいのですが、お見せできるように大分努力が必要です。
現象的には、かなり有名な話なのかなと思ったりして、まずは投稿してみました。


ずっと初心者さんがどのようなコードを記載したのかがわからずに、十分な回答をするのは困難だと思います。
今の時点では、スクロールバーのMaximumの値を超えて移動させたということしかわかりません。
(多少推察してますが・・・)

少なくとも、コード上でDataGridViewに対してどのような操作をしているのかは記載したほうが良いと思います。
(ソースを記載いただくのが一番わかりやすいですが、苦労するのであれば、文章でもかまわないと思います。)

ちなみに、
引用:

、『'399'の値'Value'に対して有効ではありません。'Value'は'minimum'と'maximum'の間でななければなりません』


これに似たエラーは、HScrollBarやVScrollBarで発生させることができます。
HScrollBarのMaximumプロパティに100といれ、その後、Valueプロパティに399とかいれると発生します。

※DataGridViewのScrollイベントとかでなにかしてませんか?他に、スクロールに関連した操作をしていませんか?

[ メッセージ編集済み 編集者: Toshi 編集日時 2008-12-04 17:28 ]
ずっと初心者
会議室デビュー日: 2008/10/02
投稿数: 9
投稿日時: 2008-12-04 19:09
お聞きしたいのは回避方法です。発生原因も教えていただければ嬉しいのですが、
お見せできる形のソースを作ってみましたところ、再現しませんでした。
スクロールバーは有効に動くし、Downキーで最下段まで行っても、
まったく問題ありません。
で、Toshiさんのおっしゃるように、これでは、質問に答えてくれと言っても
訳がわからないとよくわかりました。ただ、スクロールに関するものは何も触ってない
し、DataGridViewのプロパティーにはMaxmunSizeやMinimumSizeはあっても、
MaxmunやMinimumはありません。Column単位でBackColorを変えたり、ReadOnlyを
Trueにしている程度なんですが。
再現するサンプルができたら、また、投稿しますので教えてください。
お騒がせをいたしました。
ずっと初心者
会議室デビュー日: 2008/10/02
投稿数: 9
投稿日時: 2008-12-10 15:10
再現させるソースを作ることができました。と同時に、原因が分かり、回避させることができました。私と同様のことで、皆さんがお困りにならないよう、一応、以下に再現ソースを記載しておきます。ListBoxなどでは起きないので、何の気なしにコーディングしていましたが、
私自身はいい勉強になりました。

原因:DataGridView1のRowをAddし、データを追記していく前に、フォーム上の
   コントロールのEnabledをFalseにしていました。
対策:とりあえずは、Enabledを保存して、一旦Falseにし、処理が済んだら戻すということを
   やめました。

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form

'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub

'Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer

'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使用して変更できます。
'コード エディタを使って変更しないでください。
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.DataGridView1 = New System.Windows.Forms.DataGridView
Me.Column1 = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.Column2 = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.Column3 = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.Column4 = New System.Windows.Forms.DataGridViewTextBoxColumn
CType(Me.DataGridView1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(321, 266)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(85, 39)
Me.Button1.TabIndex = 1
Me.Button1.Text = "終了"
Me.Button1.UseVisualStyleBackColor = True
'
'DataGridView1
'
Me.DataGridView1.AllowUserToAddRows = False
Me.DataGridView1.AllowUserToDeleteRows = False
Me.DataGridView1.AllowUserToResizeColumns = False
Me.DataGridView1.AllowUserToResizeRows = False
Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
Me.DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.Column1, Me.Column2, Me.Column3, Me.Column4})
Me.DataGridView1.Location = New System.Drawing.Point(12, 12)
Me.DataGridView1.Name = "DataGridView1"
Me.DataGridView1.RowHeadersVisible = False
Me.DataGridView1.RowTemplate.Height = 21
Me.DataGridView1.Size = New System.Drawing.Size(386, 198)
Me.DataGridView1.TabIndex = 20
'
'Column1
'
Me.Column1.HeaderText = "Column1"
Me.Column1.Name = "Column1"
'
'Column2
'
Me.Column2.HeaderText = "Column2"
Me.Column2.Name = "Column2"
'
'Column3
'
Me.Column3.HeaderText = "Column3"
Me.Column3.Name = "Column3"
'
'Column4
'
Me.Column4.HeaderText = "Column4"
Me.Column4.Name = "Column4"
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(418, 331)
Me.Controls.Add(Me.DataGridView1)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
CType(Me.DataGridView1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)

End Sub
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents DataGridView1 As System.Windows.Forms.DataGridView
Friend WithEvents Column1 As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents Column2 As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents Column3 As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents Column4 As System.Windows.Forms.DataGridViewTextBoxColumn

End Class

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

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

'----- フォーム上のコントロールを使用不可に
DisableFormControls(Me)

'----- 模擬データ書き込み------
SetDataGrid()

'------ フォーム上のコントロールを使用可に
EnabledFormControls(Me)
End Sub
Private Sub SetDataGrid()
Dim lCol, lRow As Integer
Dim aColData() As String = {"Column2のデータ", "Column3のデータ", "Column4のデータ"}

With DataGridView1
For lRow = 0 To 40
.Rows.Add()
.Item(0, lRow).Value = lRow.ToString
For lCol = 1 To 3
.Item(lCol, lRow).Value = aColData(lCol - 1)
Next
Next

End With

End Sub
End Class


Module Module1

Private fbFormControlStatus() As Boolean

'--------------------------------------------------
' フォーム上の全てのコントロールのEnabedを保存し
' 使用不可にする
'--------------------------------------------------
Public Sub DisableFormControls(ByVal aoForm As Form)

Dim lnCnt As Integer
Dim lnMax As Integer
Dim loCtrl As Control

lnMax = aoForm.Controls.Count - 1
ReDim fbFormControlStatus(0 To lnMax)

For lnCnt = 0 To lnMax
loCtrl = aoForm.Controls(lnCnt)
If TypeName(loCtrl) <> "Label" And TypeName(loCtrl) <> "Frame" Then
fbFormControlStatus(lnCnt) = loCtrl.Enabled
loCtrl.Enabled = False
End If
Next lnCnt

End Sub

'--------------------------------------------------
' フォーム上の全てのコントロールの
' Enabled を復元する
'--------------------------------------------------
Public Sub EnabledFormControls(ByVal aoForm As Form)
Dim lnCnt As Integer
Dim lnMax As Integer
Dim loCtrl As Control

lnMax = aoForm.Controls.Count - 1

For lnCnt = 0 To lnMax
loCtrl = aoForm.Controls(lnCnt)
If TypeName(loCtrl) <> "Label" And TypeName(loCtrl) <> "Frame" Then
loCtrl.Enabled = fbFormControlStatus(lnCnt)
End If
Next lnCnt

End Sub
End Module


1

スキルアップ/キャリアアップ(JOB@IT)