DataGridViewのハイフン扱い


C.Cレモン  2012-05-22 14:30:07  No: 143308  IP: 192.*.*.*

DataGridViewの扱い方に困っています。

CSVから「-」(半角ハイフン)付きのデータをバインドすると日付に変わってしまいます。データの内容をそのまま表示させるにはどうしたらいいでしょうか。

編集 削除
魔界の仮面弁士  2012-05-22 15:05:31  No: 143309  IP: 192.*.*.*

もう少し詳細な状況を、追加で説明していただけますか?

> CSVから「-」(半角ハイフン)付きのデータをバインドすると日付に変わってしまいます。

質問文からは、CSV と DataGridView の関連性が分からなかったのですが、
DataGridView 自体には、日付型に変換する機能は無いと思います。
http://madia.world.coocan.jp/cgi-bin/vbnet/wwwlng.cgi?print+201205/12050003.txt

バインド元データ(DataTable 等)が日付型として保持されているなら、
"5/6"だろうと"1-2-3"だろうと、日付形式に変換して格納されますが、
それは DataGridView 自体の機能とは別の話です。


また、CSV をどのようにして取り込んでいるかも不明ですが、
たとえば VB の TextFieldParser を使っているのだとすれば、
その結果は常に文字列のはずなので、日付変換はされないはずです。
http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.html


あるいは、ODBC あるいは JET I-ISAM での CSV 取込なのだとしたら、
schema.ini で列のデータ型を指定するか、または、レジストリの
ImportMixedTypes エントリを "Text" 指定にするという手が使えます。
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=15003&page=0

編集 削除
魔界の仮面弁士  2012-05-22 15:11:49  No: 143310  IP: 192.*.*.*

> schema.ini で列のデータ型を指定するか、または、レジストリの
> ImportMixedTypes エントリを "Text" 指定にするという手が使えます。

http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=15003&page=0

上記は VB6 向けなので、今回は下記の URL の方が良いかな。
http://dobon.net/vb/bbs/log3-43/26012.html

編集 削除
C.Cレモン  2012-05-22 16:10:45  No: 143311  IP: 192.*.*.*

魔界の仮面弁士さん、ありがとうございます。

質問文からは、CSV と DataGridView の関連性が分からなかったのですが、
DataGridView 自体には、日付型に変換する機能は無いと思います。


>バインド元データ(DataTable 等)が日付型として保持されているなら、"5/6"だろうと"1-2-3"だろうと、日付形式に変換して格納されますが、
>それは DataGridView 自体の機能とは別の話です。

なるほど、DataGridView 自体の機能はないんですね。勉強になります。

そこで、TextFieldParserで試してみようと以下の内容を試しましたが、「InvalidOperationExceptionはハンドルされませんでした。」となりました。

Dim parser As TextFieldParser = New TextFieldParser("E:\test.csv", System.Text.Encoding.GetEncoding("Shift_JIS"))
parser.TextFieldType = FieldType.Delimited
parser.SetDelimiters(",") ' 区切り文字はコンマ

' データをすべてクリア
DataGridView1.Rows.Clear()

While (Not parser.EndOfData)
     Dim row As String() = parser.ReadFields() ' 1行読み込み
     ' 読み込んだデータ(1行をDataGridViewに表示する)
     DataGridView1.Rows.Add(row)
End While

また、勉強不足ですみませんが教えてもらえませんでしょうか。

編集 削除
魔界の仮面弁士  2012-05-22 16:25:35  No: 143312  IP: 192.*.*.*

> TextFieldParserで試してみようと以下の内容を試しましたが
TextFieldParserを試す前に——
そもそもは、どのようにして取得していたのでしょうか?

最初の質問の内容からは、そちらの状況を把握しきれていないため、
そもそも TextFieldParser にすれば解決する問題なのか、あるいは
それ以外の箇所に問題があるのか、未だに読み取れません…。


> 「InvalidOperationExceptionはハンドルされませんでした。」となりました。
どの行でエラーになったのでしょうか?

編集 削除
C.Cレモン  2012-05-22 17:04:16  No: 143313  IP: 192.*.*.*

魔界の仮面弁士さん、ありがとうございます。
以下のように書いてなんとか表示されました。

Dim dt As New DataTable
 Dim row As DataRow

'フィールド(列)を追加
dt.Columns.Add("あ", Type.GetType("System.String"))
dt.Columns.Add("い", Type.GetType("System.String"))
dt.Columns.Add("う", Type.GetType("System.String"))
dt.Columns.Add("え", Type.GetType("System.String"))
dt.Columns.Add("お", Type.GetType("System.String"))
dt.Columns.Add("か", Type.GetType("System.String"))
dt.Columns.Add("き", Type.GetType("System.String"))
dt.Columns.Add("く", Type.GetType("System.String"))
dt.Columns.Add("け", Type.GetType("System.String"))

Dim parser As TextFieldParser = New TextFieldParser("E:\test.csv", System.Text.Encoding.GetEncoding("Shift_JIS"))
parser.TextFieldType = FieldType.Delimited
parser.SetDelimiters(",") ' 区切り文字はコンマ

' データをすべてクリア
DataGridView1.Rows.Clear()

While Not parser.EndOfData
     row = dt.NewRow
     row.ItemArray = parser.ReadFields
     dt.Rows.Add(row)

End While
DataGridView1.DataSource = dt

>そもそもは、どのようにして取得していたのでしょうか?
すみません、取得の方法がいろいろありますが、ODBC あるいは JET I-ISAM での CSV 取込など、意味もわからずコピペでやっていたので意味がわかっていません。取得方法をもっと勉強していかないといけないですね。

編集 削除