DataGridViewとは
DataGridViewとは、SQL-Serverなどに格納してあるデータを表形式で表示させるユーザーフォームツールです。
以下の図のようにVisual Stadioで検索すると出てきます。
これをフォームに配置して実行すると以下のグレーの枠の中にデータが反映されます。
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に表示されているとしましょう。
ID | NAME | MEMO |
U0001 | TARO SUZUKI | 明日、予約済み |
U0002 | HANAKO YAMADA | XX日に予約済み 前回未払い |
U0003 | JIRO TANAKA | 本日来店 |
CSV保存ボタンイベントが発生したときに先程のコードがメイン処理で流れます。
そして、保存したCSVを開くと以下のように表示されます。
ID | NAME | MEMO |
U0001 | TARO SUZUKI | 明日、予約済み |
U0002 | HANAKO YAMADA | XX日に予約済み |
前回未払い | ||
U0003 | JIRO TANAKA | 本日来店 |
改行で次の行に移行して、CSVのレイアウトが思った形ではなくなっている…
解決方法
このようなことが起きたときに、まずは項目の用途を調査するのが鉄則です。
調査をすることにより、コードを書き換えなくてもよいパターンが見えてきたり、
機能削除という選択を取れたりすることが多いからです。
これは社内SEだったり、社内アプリを作る側ならではの方法ですが、
ユーザーが社員の場合、アンケートが取りやすいため、アプリの仕様調査は積極的に行うべきです!
そして、調査結果はというと、
ツールの用途 | 見積を仮作成してSAPに転送するツール |
---|---|
調査対象 | 営業30人ほど |
バグ発見者が行いたかったこと | 見積登録日付を取ってExcelで分布を見たかった。 |
リッチテキスト項目の使用方法 | 詳細画面で閲覧が主流。リストで見ることもあるが、そもそもリストでは全文表示されていないため、保存後に入力漏れがないかの確認程度で見る。 |
DataGridViewに表示されていないと困るか | 無ければ無いで困らない。 |
リッチテキスト項目はそもそも改行が必要か | 絶対に必要。多いときは10行以上入力する。 |
CSV出力を使用したことのある人の割合 | 30人中、4人(約13%) |
まとめると、項目は必須だがDataGridViewへの表示は必須ではない。
以上の調査結果より、対策方法として以下が浮上します。
- DataGridViewにリッチテキスト項目を載せない
- リッチテキスト項目の時に改行を消すコードを追加
- そもそも頻度が少ないから対応しない(Excel側で対応してもらう)
結論
DataGridViewにリッチテキスト項目を載せないということになりました(^▽^)/
理由としては、DataGridViewでリッチテキスト項目を見る頻度/重要性が低いからです!
コードとしても1行コメントアウトするだけでOKだし、CSV出力の機能は残したままにできるということで、良い着地になりました♪