none
datagridview で選択したデータがないにもかかわらず、rowcount=1 になる RRS feed

  • 質問

  • vs2015でmysql + datagridview を使用している。

    日付で絞って伝票をdatagridviewに表示している。伝票のレコードがないにも関わらず、rowcount=1 になり、1件伝票があるときと、いろいろなプロパティで試したが区別を付ける方法がわからない。

    2017年8月16日 11:18

回答

  • そのrowcountというのはDataGridViewのRowCountプロパティのことでしょうか?あと、DataGridViewの一番に空欄で表示されている行がありますか?
    そうであれば、それは追加のための行であり、その分が1とカウントされています。
    追加する必要が無いなら、AllowUserToAddRowsプロパティをfalseにしてやればDataSouceに与えたデータ数と同じになるでしょう。

    あるいはDataGridViewのDataSourceプロパティに与えた元のデータは何かわかっているはずですから、その数を数えましょう。

    元のデータが判らないという特殊な場合はRowsプロパティから得られるDataGridViewRowにはIsNewRowプロパティがあるので、

    Dim count As Integer = Me.DataGridView1.Rows.OfType(Of DataGridViewRow).Where(Function(r) Not r.IsNewRow).Count
    Dim newRowCount As Integer = Me.DataGridView1.Rows.OfType(Of DataGridViewRow).Where(Function(r) r.IsNewRow).Count
    のように行の種類を数えるという手もあります。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年8月16日 12:13
  • select count(*) from テーブル名 where 条件 

    でレコード件数を求めた。

    どのタイミングで上記のSQLを実行されるのかわかりませんが、もし、複数人で同時にデータベースを弄る可能性があるのであれば、取得するタイミングによってはDataGridViewに表示される件数と異なる可能性がありますので、ご注意下さい。

    さて、上記のSQLで解決されたということであれば、お勧めはgekkaさんも書かれていますが、DataGridViewに表示する元のデータソースの行数を数えるのが一般的です。例えばデータテーブルであれば、その行数になります。
    今一度gekkaさんの回答をお読みになって、そちらの方法を試されることをお勧めします。
    また、基本的な考え方として、データの登録や削除はDataGridViewの行に対して行うのではなく、そのデータソース(例えばデータテーブル)に対して行うという感覚、すなわちDataGridViewはデータソースを弄るための窓口という感覚で考えて行かれると良いと思います。そうすれば、今回の場合も、データソースの行を数えるという発想に至ったはずです。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年8月17日 1:17
    モデレータ

すべての返信

  • そのrowcountというのはDataGridViewのRowCountプロパティのことでしょうか?あと、DataGridViewの一番に空欄で表示されている行がありますか?
    そうであれば、それは追加のための行であり、その分が1とカウントされています。
    追加する必要が無いなら、AllowUserToAddRowsプロパティをfalseにしてやればDataSouceに与えたデータ数と同じになるでしょう。

    あるいはDataGridViewのDataSourceプロパティに与えた元のデータは何かわかっているはずですから、その数を数えましょう。

    元のデータが判らないという特殊な場合はRowsプロパティから得られるDataGridViewRowにはIsNewRowプロパティがあるので、

    Dim count As Integer = Me.DataGridView1.Rows.OfType(Of DataGridViewRow).Where(Function(r) Not r.IsNewRow).Count
    Dim newRowCount As Integer = Me.DataGridView1.Rows.OfType(Of DataGridViewRow).Where(Function(r) r.IsNewRow).Count
    のように行の種類を数えるという手もあります。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年8月16日 12:13
  • 自己解決した。

    直接mysqlに

    select count(*) from テーブル名 where 条件 

    でレコード件数を求めた。

    2017年8月16日 14:45
  • select count(*) from テーブル名 where 条件 

    でレコード件数を求めた。

    どのタイミングで上記のSQLを実行されるのかわかりませんが、もし、複数人で同時にデータベースを弄る可能性があるのであれば、取得するタイミングによってはDataGridViewに表示される件数と異なる可能性がありますので、ご注意下さい。

    さて、上記のSQLで解決されたということであれば、お勧めはgekkaさんも書かれていますが、DataGridViewに表示する元のデータソースの行数を数えるのが一般的です。例えばデータテーブルであれば、その行数になります。
    今一度gekkaさんの回答をお読みになって、そちらの方法を試されることをお勧めします。
    また、基本的な考え方として、データの登録や削除はDataGridViewの行に対して行うのではなく、そのデータソース(例えばデータテーブル)に対して行うという感覚、すなわちDataGridViewはデータソースを弄るための窓口という感覚で考えて行かれると良いと思います。そうすれば、今回の場合も、データソースの行を数えるという発想に至ったはずです。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年8月17日 1:17
    モデレータ