DataGridViewを非バインドで、AllowUserToAddRows=Trueにして使用しているのですが、
入力行数を6行までに制限したいと考えております。
理想の動きとしては以下の通りです。
・5行目を入力し終え、6行目に移る。
↓
・6行目でセルに値を入れても新規行は追加されない。
(普通なら自動的に7行目の新規行が追加されますが、追加されないようにしたいです。)
↓
・6行目を入力し終えたら次のコントロールに移る。
恐らくどこかでAllowUserToAddRows=Falseにすればいいのだと思いますが、どうもうまくいきません。
RowsAddedイベント内で以下のように記述してみました。
If DataGridView1.RowCount >= 6 AndAlso _
DataGridView1.AllowUserToAddRows = True Then
DataGridView1.AllowUserToAddRows = False
End If
すると、6行目でセルに値を入力した途端に以下のエラーが出ました。
「指定された行インデックスが範囲外です。」
一体どのようにすれば実現できるのか、皆目見当が付かない状態です。
何か良い方法がありましたら、教えていただけたらと思います。
> 何か良い方法がありましたら、教えていただけたらと思います。
あまり良い方法が思いつきませんでした。
下記のようにすればできるかな、とも思ったのですが、
プログラムから .Rows.AddRange された場合に対応できず…。
Private Sub DataGridView1_RowEnter(…
Dim count As Integer = DataGridView1.Rows.GetRowCount(DataGridViewElementStates.None)
If DataGridView1.AllowUserToAddRows Then count -= 1
Invoke(New Invoker(AddressOf Setter), DataGridView1, count >= 6)
End Sub
Delegate Sub Invoker(ByVal dgv As DataGridView, ByVal arg As Boolean)
Sub Setter(ByVal dgv As DataGridView, ByVal arg As Boolean)
If dgv.AllowUserToAddRows = arg Then
dgv.AllowUserToAddRows = Not arg
End If
End Sub
すみません、先のコードだと駄目ですね。
追加禁止になったあと、[Delete]キーで行を削除すると
> Invoke(New Invoker(AddressOf Setter), DataGridView1, count >= 6)
が InvalidOperationException 例外を発してしまいました。
『SetCurrentCellAddressCore 関数への再入呼び出しを生じるため、この操作は有効ではありません。』
BeginInvoke にすればエラーは出なくなりましたが、安全な方法では無さそうですし。