DataGridViewで入力行数制限をするには?


竜崎  2009-03-19 22:40:37  No: 145817

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行目でセルに値を入力した途端に以下のエラーが出ました。

「指定された行インデックスが範囲外です。」

一体どのようにすれば実現できるのか、皆目見当が付かない状態です。
何か良い方法がありましたら、教えていただけたらと思います。


魔界の仮面弁士  2009-03-20 01:51:10  No: 145818

> 何か良い方法がありましたら、教えていただけたらと思います。

あまり良い方法が思いつきませんでした。

下記のようにすればできるかな、とも思ったのですが、
プログラムから .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


魔界の仮面弁士  2009-03-20 01:56:14  No: 145819

すみません、先のコードだと駄目ですね。

追加禁止になったあと、[Delete]キーで行を削除すると
>  Invoke(New Invoker(AddressOf Setter), DataGridView1, count >= 6)
が InvalidOperationException 例外を発してしまいました。

『SetCurrentCellAddressCore 関数への再入呼び出しを生じるため、この操作は有効ではありません。』

BeginInvoke にすればエラーは出なくなりましたが、安全な方法では無さそうですし。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加