質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1660閲覧

VB.NET ローカルファイルからCSVを読み込んでDataGridViewに表示させたい

layla

総合スコア14

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/03/18 14:47

編集2019/03/21 16:04

前提

VB.NET全くのド素人の者です。初めて質問させていただきます。

現在BMIの計算アプリを作っていまして、その計算結果などをdatagridviewに表示させ、保存ボタンを押すことでcsv形式でローカルに名前を付けて保存することができるようにしました。

教えていただきたいこと

そこで今度は逆に読み込みボタンを押してローカルに保存してあるcsvファイルを選択し、datagridviewに表示させる機能を付けたいのですが、どこのサイトを見てもやり方を見つけることが出来ませんでした。具体的なコードなどを教えていただけると幸いです。

追記
http://bbs.wankuma.com/index.cgi?mode=al2&namber=90559
時間がなかったため、こちらのサイトでも同時並行で同じアプリの質問をしていました。

Public Class Form1 Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click Me.Close() End Sub Private Sub btnBMI_Click(sender As Object, e As EventArgs) Handles btnBMI.Click Dim Height As Double = txtHeight.Text Dim Weight As Double = txtWeight.Text Dim Name As String = txtName.Text Dim BMI As Double If Height > 0 AndAlso Weight > 0 Then lblerror.Text = "" BMI = Weight / ((Height / 100) * (Height / 100)) txtBMI.Text = BMI.ToString("0.0")``` '有効数字以下は四捨五入される '肥満度判定 If txtBMI.Text >= 25 Then lblHimando.Text = "肥満" ElseIf txtBMI.Text < 25 AndAlso txtBMI.Text >= 18.5 Then lblHimando.Text = "普通" ElseIf txtBMI.Text < 18.5 Then lblHimando.Text = "痩せ" End If '肥満度によって文字の色を変更 If lblHimando.Text = "肥満" Then lblHimando.ForeColor = Color.Red ElseIf lblHimando.Text = "痩せ" Then lblHimando.ForeColor = Color.Blue End If '0以下が入力された時にエラーメッセージを表示 Else lblerror.Text = "正しい値を入力してください" lblHimando.Text = "" End If End Sub Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick End Sub Private Sub btnTouroku_Click(sender As Object, e As EventArgs) Handles btnTouroku.Click If txtBMI.Text = "" Then lblerror.Text = "計算してください" Else Dim idx As Integer = DataGridView1.Rows.Add() DataGridView1.Rows(idx).Cells(0).Value = idx DataGridView1.Rows(idx).Cells(1).Value = txtName.Text DataGridView1.Rows(idx).Cells(2).Value = txtHeight.Text DataGridView1.Rows(idx).Cells(3).Value = txtWeight.Text DataGridView1.Rows(idx).Cells(4).Value = txtBMI.Text End If End Sub Private Sub txtName_TextChanged(sender As Object, e As EventArgs) Handles txtName.TextChanged End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click CsvFileSave("BMIデータ.csv") End Sub Dim FileName As String Public Property OpenFileDialog1 As Object Private Sub CsvFileSave(ByVal SaveFileName As String) ' 「名前を付けて保存」ダイアログを使う方法 Using sfd As New SaveFileDialog sfd.FileName = "BMIデータ.csv" sfd.Filter = "CSV(*.csv)|*.csv" sfd.CheckPathExists = True sfd.OverwritePrompt = True If sfd.ShowDialog() <> Windows.Forms.DialogResult.OK Then Exit Sub End If FileName = sfd.FileName End Using CsvFileSave(FileName) End Sub ```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/19 01:49

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。
退会済みユーザー

退会済みユーザー

2019/03/20 01:13

囲い方が間違ってます。以下のようにコートの一番最初の行の上と一番最後の行の下に ``` を追加するのです。 ``` Public Class Form1 ・・・中略・・・ End Class ```
退会済みユーザー

退会済みユーザー

2019/03/21 15:33

わんくま掲示板とのマルチポストですよね。ここにもルールがあるのですよ。そういうのは止めませんか? https://teratail.com/help#posted-otherservice
guest

回答1

0

ベストアンサー

CSV形式のファイルをDataTableや配列等として取得する

DataTable にして DataGridView の DataSource に突っ込めば表示されます。

投稿2019/03/18 15:08

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

layla

2019/03/19 15:54 編集

ご回答ありがとうございました。以下のコードでcsvファイルをdatatableとして読み込み、datagridviewのdatasourceに配置することで表示することは出来たのですが、なぜか空白の行と列が追加され、その横に表示されるようになってしまいます。どこを修正すれば良いか教えていただきたいです。 VB.NET Public Class Cls_CSV2Table Public Function CsvToTable(d_FilePass As String) As DataTable 'フルパスからディレクトリのみ取り出す Dim csv_Dir As String = System.IO.Path.GetDirectoryName(d_FilePass) 'フルパスからディレクトリのみ取り出す Dim csv_File As String = System.IO.Path.GetFileName(d_FilePass) '接続文字列 Dim conString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _ + csv_Dir + ";Extensions=asc,csv,tab,txt;" Dim con As New System.Data.Odbc.OdbcConnection(conString) Dim commText As String = "SELECT * FROM [" + csv_File + "]" Dim my_Da As New System.Data.Odbc.OdbcDataAdapter(commText, con) 'DataTableに格納する Dim my_Dt As New DataTable my_Da.Fill(my_Dt) Return my_Dt End Function Friend Sub Close() Throw New NotImplementedException() End Sub End Class Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim class_csv2table As New Cls_CSV2Table Dim csv_Daityou As DataTable = class_csv2table.CsvToTable(”D:\BMI.csv") DataGridView1.AutoGenerateColumns = True ' ここを False にすると表示しない DataGridView1.DataSource = csv_Daityou End Sub
Zuishin

2019/03/19 16:13

こちらで問題が確認できなければ修正できません。 新しくプロジェクトを作り、問題の再現する最小のソースを作ってください。 またコードはこんなところに書かれても読む気になりません。 質問に追記してください。 そしてコードとともに問題の再現する最小のデータも渡してください。 まとめ 1.問題が再現してコンパイルできる最小のコードとデータを作る 2.質問を編集してコードブロックを使いそれらを提示する 次に何か質問する時もこのようにしてください。
YAmaGNZ

2019/03/19 22:11

多分、デザイナーでDataGridViewの列を作成されているのでしょう。 なので、デザイナーで作成した列の後ろにCSVの列が作成されて表示されているのだと思います。 デザイナーで列を作成せず、AutoGenerateColumnsはTrueの状態で DataSourceを設定してください。 列の見出しを変更するのであれば、DataSourceを設定した後に変更してください。
Zuishin

2019/03/19 22:26

なるほど、「空白の行と列が追加される」のではなく「もともとあった空白の列が残る」ですか。 もしそうならデザイナで列を編集して DataPropertyName を適切に設定することでも対応できます。
layla

2019/03/20 16:01

お二方、ご回答ありがとうございます。ご指摘の通り、もともとあった空白の列の後ろにcsvの列に追加されていました。BMIなどのデータをテキストボックスに入力し、登録ボタンでdatagridviewに追加するときにデザイナーであらかじめ列を作成していないと追加できないのですが、どうすればよいでしょうか?
Zuishin

2019/03/20 16:31

解決策が二つ書いてあります。 自動的に列を設定するなら列をすべて削除して AutoGenerateColumns を true に、そうでないなら DataPropertyName を設定ということです。
layla

2019/03/21 02:37

DataPropertyNameを設定する場合、デザイナーで作成したDataGridViewの列の名前と同じに設定すれば良いということでしょうか?
Zuishin

2019/03/21 03:40

DataPropertyName をデザイナーで設定します。値は「なにもしなければ新しく増えるはずの列名」と同じものにしてください。
layla

2019/03/21 13:24

ご回答ありがとうございました。上手くdatagridviewに表示させることが出来ました。お世話になりました。
退会済みユーザー

退会済みユーザー

2019/03/21 15:33

わんくま掲示板とのマルチポストですよね。ここにもルールがあるのですよ。そういうのは止めませんか? https://teratail.com/help#posted-otherservice
Zuishin

2019/03/21 15:40

質問を編集して、マルチポストである旨を明記してリンクを貼り、またマルチポスト先にも同様の手続きをしてください。 そしてどちらかで解決した場合には必ず双方に報告してください。これが最低限で、あとはマルチポスト先の規約やガイドラインを尊重してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問