Uncategorized

【VB.net】改行注意!DataGridViewのエクスポートの落とし穴

DataGridViewとは

DataGridViewとは、SQL-Serverなどに格納してあるデータを表形式で表示させるユーザーフォームツールです。

以下の図のようにVisual Stadioで検索すると出てきます。

検索結果

これをフォームに配置して実行すると以下のグレーの枠の中にデータが反映されます。

DataGridViewを配置して、実行した結果

CSVエクスポートで起きた事件

私は、DataGridViewの表示をそのままCSVにエクスポートするプログラムを書きました。

Try
    sw = New IO.StreamWriter(fname, False, System.Text.Encoding.Default)
Catch ex As Exception
    MessageBox.Show("エラーメッセージ" & ex.Message)
    Exit Sub
End Try

Try
    Dim dgv As DataGridView
    dgv = DataGridViewList
    ' ヘッダー
    For i = 0 To dgv.Columns.Count - 1
        If dgv.Columns(i).Visible Then
            sw.Write(dgv.Columns(i).HeaderText)
            sw.Write(vbTab)
        End If
    Next
    sw.Write(vbNewLine)
    ' 行取得
    For i = 0 To dgv.RowCount - 1
        For j = 0 To dgv.Columns.Count - 1
            If dgv.Columns(j).Visible Then
                sw.Write(dgv.Item(j, i).Value)
                sw.Write(vbTab)
            End If
        Next
        sw.Write(vbNewLine)
    Next
Catch ex As Exception
    MessageBox.Show("エラーメッセージ" & ex.Message)
Finally
    sw.Close()
End Try

このコードで何が起こったかというと、

CSV形式でのエクスポート時、改行データにあたった際、次の行に行ってしまう。

以下のようなデータがDataGridViewに表示されているとしましょう。

IDNAMEMEMO
U0001TARO SUZUKI明日、予約済み
U0002HANAKO YAMADAXX日に予約済み
前回未払い
U0003JIRO TANAKA本日来店
DataGridViewに表示されているデータ

CSV保存ボタンイベントが発生したときに先程のコードがメイン処理で流れます。

そして、保存したCSVを開くと以下のように表示されます。

IDNAMEMEMO
U0001TARO SUZUKI明日、予約済み
U0002HANAKO YAMADAXX日に予約済み
前回未払い
U0003JIRO TANAKA本日来店
実際に出力されるCSVデータ

改行で次の行に移行して、CSVのレイアウトが思った形ではなくなっている…

解決方法

このようなことが起きたときに、まずは項目の用途を調査するのが鉄則です。

調査をすることにより、コードを書き換えなくてもよいパターンが見えてきたり、

機能削除という選択を取れたりすることが多いからです。

これは社内SEだったり、社内アプリを作る側ならではの方法ですが、

ユーザーが社員の場合、アンケートが取りやすいため、アプリの仕様調査は積極的に行うべきです!

そして、調査結果はというと、

リッチテキスト項目の調査結果
ツールの用途 見積を仮作成してSAPに転送するツール
調査対象 営業30人ほど
バグ発見者が行いたかったこと 見積登録日付を取ってExcelで分布を見たかった。
リッチテキスト項目の使用方法 詳細画面で閲覧が主流。リストで見ることもあるが、そもそもリストでは全文表示されていないため、保存後に入力漏れがないかの確認程度で見る。
DataGridViewに表示されていないと困るか 無ければ無いで困らない。
リッチテキスト項目はそもそも改行が必要か 絶対に必要。多いときは10行以上入力する。
CSV出力を使用したことのある人の割合 30人中、4人(約13%)

まとめると、項目は必須だがDataGridViewへの表示は必須ではない。

以上の調査結果より、対策方法として以下が浮上します。

  • DataGridViewにリッチテキスト項目を載せない
  • リッチテキスト項目の時に改行を消すコードを追加
  • そもそも頻度が少ないから対応しない(Excel側で対応してもらう)

結論

DataGridViewにリッチテキスト項目を載せないということになりました(^▽^)/

理由としては、DataGridViewでリッチテキスト項目を見る頻度/重要性が低いからです!

コードとしても1行コメントアウトするだけでOKだし、CSV出力の機能は残したままにできるということで、良い着地になりました♪