none
DataGridViewの行数制限 RRS feed

  • 質問

  • DataGridViewを例えば10行までは、手動で行追加を許し11行以上は追加禁止するにはどうしたらいいでしょうか?

    宜しく御教授ねがいます。

    2011年1月6日 9:55

回答

  • UserAddedRowとUserDeletedRowイベントにしてはどうでしょうか。

    その場合、wlRwCnt >= 3 と wlRwCnt < 3 は、wlRwCnt >= 4 と wlRwCnt < 4 となります。

    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 5:01
  • AllowUserToAddRows プロパティを設定するイベントを別のものにする必要がありそうですね。
    次の URL のスレッドに、C# ですが、そのものずばりな実装例があります。(VB に読み替えるのも難しくないと思います。)

     DataGridView maximum row limit...?
     http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/d982bc21-6c1a-4386-a52d-c3f754373cfb/

    RowValidated イベントと UserDeletedRow イベントが使用されています。
    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 5:02
  • 理由はChukiさんが書かれている通りだと思います。つまり、RowAddedイベントハンドラの段階では新規行がありますし、RowRemovedイベントハンドラの段階では新規行が無いからでしょう。
    であれば、RowAddedイベントハンドラでは、新規行を考慮しなければ良いはずです。(頭で考えただけで未検証です)

          If wlRwCnt - 1 >= 3 Then     //新規行分を-1する。
            T_DataGridView2.AllowUserToAddRows = False
          End If

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 5:13
    モデレータ
  • 以下のように試してみたら、無限ループでRowsAddedとRowsRemovedをいったりきたりします。

     

      Private Sub T_DataGridView2_RowsAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles T_DataGridView2.RowsAdded
        Dim wlRwCnt As Long = 0
        Try
          wlRwCnt = Me.T_DataGridView2.RowCount
    
          If wlRwCnt >= 3 Then
            T_DataGridView2.AllowUserToAddRows = False
          End If
    
    
    On_EndTry:
        Catch ex As Exception
          Trends.Message.ErrDialog(New StackFrame)
        End Try
    
      End Sub
    
      Private Sub T_DataGridView2_RowsRemoved(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsRemovedEventArgs) Handles T_DataGridView2.RowsRemoved
    
        Dim wlRwCnt As Long = 0
        Try
          wlRwCnt = Me.T_DataGridView2.RowCount
    
          If wlRwCnt < 3 Then
            T_DataGridView2.AllowUserToAddRows = True
          End If
    
    
    On_EndTry:
        Catch ex As Exception
          Trends.Message.ErrDialog(New StackFrame)
        End Try
    
      End Sub
    どうしたらいいでしょうか?
    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 4:41

すべての返信

  • DataGridView だけで実現したいということであれば、RowAdded辺りをハンドルして、RowCountが10行に達したらAllowUserToAddRows をFalseにして追加をさせなくするなどはいかがでしょうか?

     

    2011年1月6日 10:37
  • 試してはいませんが、RowsAdded イベントとRowsRemoved イベントで行数を確認して、AllowUserToAddRows プロパティを切り替えるというのはどうでしょうか?

    DataGridView.RowsAdded イベント (System.Windows.Forms)

    DataGridView.RowsRemoved イベント (System.Windows.Forms)

    DataGridView.AllowUserToAddRows プロパティ (System.Windows.Forms)


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
    2011年1月6日 10:37
  • 以下のように試してみたら、無限ループでRowsAddedとRowsRemovedをいったりきたりします。

     

      Private Sub T_DataGridView2_RowsAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles T_DataGridView2.RowsAdded
        Dim wlRwCnt As Long = 0
        Try
          wlRwCnt = Me.T_DataGridView2.RowCount
    
          If wlRwCnt >= 3 Then
            T_DataGridView2.AllowUserToAddRows = False
          End If
    
    
    On_EndTry:
        Catch ex As Exception
          Trends.Message.ErrDialog(New StackFrame)
        End Try
    
      End Sub
    
      Private Sub T_DataGridView2_RowsRemoved(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsRemovedEventArgs) Handles T_DataGridView2.RowsRemoved
    
        Dim wlRwCnt As Long = 0
        Try
          wlRwCnt = Me.T_DataGridView2.RowCount
    
          If wlRwCnt < 3 Then
            T_DataGridView2.AllowUserToAddRows = True
          End If
    
    
    On_EndTry:
        Catch ex As Exception
          Trends.Message.ErrDialog(New StackFrame)
        End Try
    
      End Sub
    どうしたらいいでしょうか?
    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 4:41
  • UserAddedRowとUserDeletedRowイベントにしてはどうでしょうか。

    その場合、wlRwCnt >= 3 と wlRwCnt < 3 は、wlRwCnt >= 4 と wlRwCnt < 4 となります。

    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 5:01
  • AllowUserToAddRows プロパティを設定するイベントを別のものにする必要がありそうですね。
    次の URL のスレッドに、C# ですが、そのものずばりな実装例があります。(VB に読み替えるのも難しくないと思います。)

     DataGridView maximum row limit...?
     http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/d982bc21-6c1a-4386-a52d-c3f754373cfb/

    RowValidated イベントと UserDeletedRow イベントが使用されています。
    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 5:02
  • 3行目が追加されたとき、AllowUserToAddRows がfalseに設定されるため、DataGridViewが一行減らされます。
    そのためRowsRemovedが呼び出されてAllowUserToAddRowsにTrueが設定され、DataGridViewの行が一行追加されます。
    (以上、一生そのまま)

    ですので、AllowUserToAddRows を変更するところで、フラグ立てておき動作を制御するか、ユーザーの追加削除に反応するUserDeletedRowなどのイベントをハンドルすると良いと思います。

    2011年1月7日 5:04
  • 理由はChukiさんが書かれている通りだと思います。つまり、RowAddedイベントハンドラの段階では新規行がありますし、RowRemovedイベントハンドラの段階では新規行が無いからでしょう。
    であれば、RowAddedイベントハンドラでは、新規行を考慮しなければ良いはずです。(頭で考えただけで未検証です)

          If wlRwCnt - 1 >= 3 Then     //新規行分を-1する。
            T_DataGridView2.AllowUserToAddRows = False
          End If

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク TAKAPI 2011年1月15日 1:26
    2011年1月7日 5:13
    モデレータ
  • うまくいきました。ありがとうございました。

    みなさんの御意見で、理解が深まりました。

    2011年1月15日 1:25