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

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

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

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

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

Q&A

解決済

1回答

1296閲覧

CSVデータを参照して呼び出すフォームを変えるログインフォームを作りたいです

bv_beg

総合スコア5

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

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

0グッド

0クリップ

投稿2019/12/16 08:27

前提・実現したいこと

ユーザーにIDを入力させ外部のCSVファイルの中に、入力されたIDと同じものがあるかを確認し一致するIDがあった場合は特定のフォームを呼び出す処理を行うログインフォームを作りたいです。
CSVファイルのデータを、TextFieldParserクラスを使用して読み込む処理まではできましたが読み込んだデータに対しての処理で詰まってしまいました。

CSVファイルの中身は以下のようになっております。
ID,ユーザー名,呼び出すフォームの種類を判別する番号※CSVファイル内に表題行は無くデータのみです

1000,田中一郎,1
1001,山田次郎,2
1003,佐藤三郎,1
1004,加藤司郎,3

呼び出すフォームの番号
1→Form1
2→Form2
3→Form3

たとえばユーザーIDが1000の田中さんがログインした場合、呼び出すフォームは1番が割り振られたForm1に、ユーザーIDが1001の山田さんがログインした場合はForm2を呼び出すといった制御にしたいです。

該当のソースコード

Visual

1 Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 2 3 '各テキストボックスが空欄の場合メッセージボックスを表示 4 If UsernameTextBox.Text = "" Then 5 MsgBox("ユーザー名を入力してください。") 6 Return 7 ElseIf PasswordTextBox.Text = "" Then 8 MsgBox("パスワードを入力してください。") 9 Return 10 End If 11 12 Dim csvRecords As New System.Collections.ArrayList() 13 14 'CSVファイル名 15 Dim csvFileName As String = "C:\LoginDate\ID.csv" 'テスト段階なのでローカルです 16 17 'Shift JISで読み込む 18 Dim tfp As New FileIO.TextFieldParser(csvFileName, 19 System.Text.Encoding.GetEncoding(932)) 20 21 'カンマで区切られたデータを仕分ける 22 tfp.TextFieldType = FileIO.FieldType.Delimited 23 24 tfp.Delimiters = New String() {","} 25 26 tfp.HasFieldsEnclosedInQuotes = True 27 28 'フィールドの前後からスペースを削除する 29 tfp.TrimWhiteSpace = True 30 31 While Not tfp.EndOfData 32 'フィールドを読み込む 33 Dim fields As String() = tfp.ReadFields() 34 '保存 35 csvRecords.Add(fields) 36 End While 37 38 39 'フォームを呼び出した後ログインフォームを閉じる 40 Me.Close() 41 42 End Sub

補足情報(FW/ツールのバージョンなど)

開発環境:Visual Studio 2017

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

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

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

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

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

YAmaGNZ

2019/12/16 15:39

それで何が分からないのでしょうか? IDの比較ですか?フォームの呼び出し方ですか?
退会済みユーザー

退会済みユーザー

2019/12/16 22:55 編集

個人に配布する Windows Forms アプリで質問に書かれている個人別のログインフォームを作るのですか? ユーザーが増えて新たにフォームを作るといった保守ができるのでしょうか? 将来そういう問題が起きる可能性があるなら、今のうちに方針転換して、Web アプリにすることを考えてみてはいかがですか?
bv_beg

2019/12/18 04:12

質問力が低く、すみません。 3列のデータを読み込み特定の列の値を取得する処理と、取得した値を元にIF文の処理を行う、の二つの処理を行いたかったです。 また、保守運用についてもご指摘いただきありがとうございます。 作成したアプリをサンプルにチーム内で相談いたします。
guest

回答1

0

ベストアンサー

VB

1Dim csvRecords As New System.Collections.ArrayList()

ここなんですが、クラスを作って

VB

1Class CsvRecord 2 3 Public Sub New(fields As String()) 4 Id = fields(0) 5 Name = fields(1) 6 FormIndex = fields(2) 7 End Sub 8 9 Public ReadOnly Property Id As String 10 Public ReadOnly Property Name As String 11 Public ReadOnly Property FormIndex As String 12End Class 13 14Private csvRecords As List(Of CsvRecord) 'モジュールのスコープ

のようにしたほうがいいと思います。

CSV から読み取って csvRecords に格納するのは Load イベントに移して

VB

1(略) 2csvRecords = New List(Of CsvRecord)() 3While Not tfp.EndOfData 4 Dim fields As String() = tfp.ReadFields() 5 csvRecords.Add(New CsvRecord(fields)) 6End While

UsernameTextBox の内容から次に起動するフォームを取得する処理は

VB

1Private Function GetNextForm() As Form 2 For Each item As CsvRecord In csvRecords 3 If item.Id = UsernameTextBox.Text Then 4 Select Case item.FormIndex 5 Case "1" 6 Return New Form1() 7 Case "2" 8 Return New Form2() 9 Case "3" 10 Return New Form3() 11 Case Else 12 Exit For 13 End Select 14 End If 15 Next 16 Return Nothing 17End Function

となり「フォームを呼び出した後ログインフォームを閉じる」のところは

VB

1Dim nextForm As Form = GetNextForm() 2If nextForm Is Nothing Then 3 MessageBox.Show("ユーザ名またはパスワードが違います。") 4 Return 5End If 6nextForm.Show() 7Me.Close()

と書けます。

投稿2019/12/16 16:10

編集2019/12/16 16:12
KOZ6.0

総合スコア2622

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

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

bv_beg

2019/12/18 02:54

回答ありがとうございます。 大変助かりました!クラスの作成の勉強にもなりました。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問