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

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

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

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

Q&A

解決済

3回答

2137閲覧

VB.NET DataGridViewの新規登録について

mon121

総合スコア2

VB.NET

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

0グッド

0クリップ

投稿2021/12/14 07:44

編集2021/12/14 08:41

前提・実現したいこと

DataGridviewのレコードの追加を行いたいです。
行いたい動作としては、ユーザー一覧画面の「新規登録」をおすとユーザー登録画面が出てきます。
ユーザーIDやパスワードを入力し、登録ボタンを押すと、
ユーザー登録画面が消え、ユーザー一覧画面のDataGridviewが更新される。といった動きです。
画面はどちらもウィンドウズフォームで作成しています。

ユーザー一覧
新規登録

発生している問題・エラーメッセージ

現状では、ユーザー登録画面にわざとDataGridviewを表示させ、新規でユーザーID等を入力し、
新規登録ボタンを押すと問題なくデータが追加されます。

ですが、新規登録で入力したユーザーID等(変数)をユーザー一覧へ渡す方法がわかりません。

スコープを使いPublicで変数を定義したりしたのですが、エラーは出なかったのですが、
ユーザー一覧画面のデータが更新されませんでした。

また、上記の事を実現したい場合は、データを別なフォームへ渡すという考え方でよいのでしょうか?
それとも参照しているデータベースが共通なので、直接そこを操作するという考え方なのでしょうか。

該当のソースコード

**新規登録画面コード** Public Class new_user Private Sub new_user_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: このコード行はデータを 'SHINAGAWA_TRAININGDataSet4.MST_USER' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.MST_USERTableAdapter.Fill(Me.SHINAGAWA_TRAININGDataSet.MST_USER) End Sub '登録ボタンのクリック Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim frm As New new_user() frm.ShowDialog(Me) '変数の宣言 Dim flg As Int16 flg = 0 Dim id As String id = TextBox1.Text Dim pass As String pass = TextBox2.Text Dim name As String name = TextBox3.Text Dim age As String age = TextBox4.Text '文字列長さ判定用変数 Dim lenid As Integer = id.Length() Dim lenpass As Integer = pass.Length() Dim lenname As Integer = name.Length() '性別の判定 Dim gender As String gender = 0 If RadioButton1.Checked = True Then gender = 1 ElseIf RadioButton2.Checked = True Then gender = 2 ElseIf RadioButton3.Checked = True Then gender = 3 ElseIf gender = 0 Then '性別が未選択の場合 sex_null_error.Show() flg = 1 End If Dim i As Integer = DataGridView1.Rows.Count - 1 '追加した行に値をセット DataGridView1.Rows(i).Cells(0).Value = frm.id DataGridView1.Rows(i).Cells(1).Value = frm.pass DataGridView1.Rows(i).Cells(2).Value = frm.Name DataGridView1.Rows(i).Cells(3).Value = frm.gender DataGridView1.Rows(i).Cells(4).Value = frm.age '追加した行にフォーカスを移す DataGridView1.CurrentCell = DataGridView1(0, i) 'ユーザーIDが空白の場合 If id = "" Then ID_null_error.Show() flg = 1 'ユーザーIDが11文字以上の場合 ElseIf lenid > 11 Then ID_10over_error.Show() flg = 1 'ユーザーIDが半角英数字かの判定 ElseIf System.Text.RegularExpressions.Regex.IsMatch(id, "^[a-zA-Z0-9]+$") = False Then ID_hankaku_error.Show() flg = 1 End If 'パスワードが空白の場合 If pass = "" Then PASS_null_error.Show() flg = 1 'パスワードが3文字~10字以外のとき ElseIf 3 > lenpass Or lenpass > 10 Then PASS_mozisuu_error.Show() flg = 1 'パスワードが半角英数字かの判定 ElseIf System.Text.RegularExpressions.Regex.IsMatch(pass, "^[a-zA-Z0-9]+$") = False Then PASS_hankaku_error.Show() flg = 1 End If 'ユーザー名が空白の場合 If name = "" Then name_null_error.Show() flg = 1 'ユーザー名が50文字を超える場合 ElseIf lenname > 50 Then name_50over_error.Show() flg = 1 End If '年齢が空白の場合 If age = "" Then age_null_error.Show() flg = 1 '年齢が半角数字かの判定 ElseIf System.Text.RegularExpressions.Regex.IsMatch(age, "^[0-9]+$") = False Then agehankaku_error.Show() flg = 1 End If 'エラーが出なかったら登録画面を閉じる 'If flg = 0 Then '自画面を非表示 'Me.Visible = False 'End If End Sub 'キャンセル 押すとポップアップを閉じる' Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '自画面を非表示 Me.Visible = False End Sub **ユーザー一覧コード** Public Class all_user Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: このコード行はデータを 'SHINAGAWA_TRAININGDataSet.MST_USER' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.MST_USERTableAdapter.Fill(Me.SHINAGAWA_TRAININGDataSet.MST_USER) End Sub 'ログアウト ログイン画面へ' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '自画面を非表示 Me.Visible = False 'Form1を表示 Dim f2 As New rogin f2.Show() End Sub '戻る メニュー画面へ' Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '自画面を非表示 Me.Visible = False 'Form2を表示 Dim f2 As New Menu f2.Show() End Sub '新規登録 登録画面へ' Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim f2 As New new_user f2.Show() End Sub Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick End Sub End Class

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

環境
ウィンドウズ7
Visual stugio 2013
言語 VB.NET
フレームワーク .NETフレームワーク4.5
データベースはSQLサーバー2016で作成したものをDataGridViewで読み込んでいます。

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

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

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

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

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

guest

回答3

0

自己解決

本日再度コードを書き直したところ、解決しました。

Imports System.Data.SqlClient Public Class new_user Private Sub new_user_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: このコード行はデータを 'SHINAGAWA_TRAININGDataSet4.MST_USER' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.MST_USERTableAdapter.Fill(Me.SHINAGAWA_TRAININGDataSet.MST_USER) End Sub '登録ボタンのクリック Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '変数の宣言 Dim flg As Int16 flg = 0 Dim id As String id = TextBox1.Text Dim pass As String pass = TextBox2.Text Dim name As String name = TextBox3.Text Dim age As String age = TextBox4.Text '文字列長さ判定用変数 Dim lenid As Integer = id.Length() Dim lenpass As Integer = pass.Length() Dim lenname As Integer = name.Length() '性別の判定 Dim gender As String gender = 0 If RadioButton1.Checked = True Then gender = 1 ElseIf RadioButton2.Checked = True Then gender = 2 ElseIf RadioButton3.Checked = True Then gender = 3 ElseIf gender = 0 Then '性別が未選択の場合 sex_null_error.Show() flg = 1 End If 'INSERT SQLの設定 Dim Sql As String _ = "insert into MST_USER (USER_ID,PASSWORD,USER_NAME,SEX,AGE) VALUES (@USER_ID,@PASSWORD,@USER_NAME,@SEX,@AGE)" Try 'データベース接続 conn.Open() Using transaction As SqlTransaction = conn.BeginTransaction() Try Using cmd As New SqlCommand(Sql, conn, transaction) cmd.Parameters.Add(New SqlParameter( "@USER_ID", SqlDbType.VarChar)).Value = id cmd.Parameters.Add(New SqlParameter( "@PASSWORD", SqlDbType.VarChar)).Value = pass cmd.Parameters.Add(New SqlParameter( "@USER_NAME", SqlDbType.VarChar)).Value = name cmd.Parameters.Add(New SqlParameter( "@SEX", SqlDbType.Int)).Value = gender cmd.Parameters.Add(New SqlParameter( "@AGE", SqlDbType.Int)).Value = age cmd.ExecuteNonQuery() transaction.Commit() End Using Catch ex As Exception transaction.Rollback() Console.WriteLine(ex.Message) End Try End Using End Using Catch ex As Exception Console.WriteLine(ex.Message) End Try '以下エラー表示 'ユーザーIDが空白の場合 If id = "" Then ID_null_error.Show() flg = 1 'ユーザーIDが11文字以上の場合 ElseIf lenid > 11 Then ID_10over_error.Show() flg = 1 'ユーザーIDが半角英数字かの判定 ElseIf System.Text.RegularExpressions.Regex.IsMatch(id, "^[a-zA-Z0-9]+$") = False Then ID_hankaku_error.Show() flg = 1 End If 'パスワードが空白の場合 If pass = "" Then PASS_null_error.Show() flg = 1 'パスワードが3文字~10字以外のとき ElseIf 3 > lenpass Or lenpass > 10 Then PASS_mozisuu_error.Show() flg = 1 'パスワードが半角英数字かの判定 ElseIf System.Text.RegularExpressions.Regex.IsMatch(pass, "^[a-zA-Z0-9]+$") = False Then PASS_hankaku_error.Show() flg = 1 End If 'ユーザー名が空白の場合 If name = "" Then name_null_error.Show() flg = 1 'ユーザー名が50文字を超える場合 ElseIf lenname > 50 Then name_50over_error.Show() flg = 1 End If '年齢が空白の場合 If age = "" Then age_null_error.Show() flg = 1 '年齢が半角数字かの判定 ElseIf System.Text.RegularExpressions.Regex.IsMatch(age, "^[0-9]+$") = False Then agehankaku_error.Show() flg = 1 End If 'エラーが出なかったら自画面を閉じ、ユーザー一覧画面を再読込み If flg = 0 Then '自画面を非表示 Me.Close() 'Form3を表示 Dim f2 As New all_user End If End Sub 'キャンセル 押すと自画面を閉じる' Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '自画面を非表示 Me.Visible = False End Sub End Class

上記のように書いたところ、データーベースが更新されました。
DataGridViewを操作するとデーターベースも更新されると勘違いしていたのが原因でした。
下記サイトを参考にしました
https://itsakura.com/vbnet-sqlserver-insert#s1

ご回答ありがとうございました。

投稿2021/12/15 04:13

編集2021/12/23 07:11
mon121

総合スコア2

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

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

退会済みユーザー

退会済みユーザー

2021/12/15 04:31 編集

パスワード、ユーザーIDとかDBの情報書いてあるけど大丈夫ですか? 修正しても履歴に残るので、まずかったら運営にメールで相談してみてください。
guest

0

MST_USERTableAdapter と SHINAGAWA_TRAININGDataSet.MST_USER への参照を「新規登録 Form」のコンストラクタ経由で渡して、「新規登録 Form」の[登録]ボタンクリックのイベントハンドラで、

MST_USERTableAdapter.Fill(SHINAGAWA_TRAININGDataSet.MST_USER)

としてみたらどうなりますか?


【追伸】

行いたい動作としては、ユーザー一覧画面の「新規登録」をおすとユーザー登録画面が出てきます。ユーザーIDやパスワードを入力し、登録ボタンを押すと、ユーザー登録画面が消え、ユーザー一覧画面のDataGridviewが更新される。といった動きです。

今更ながらですが・・・

質問のコードを見る限り「登録ボタンを押す」のイベントハンドラ Button1_Click には SQL Server に新規データを INSERT するコードが見当たりません。

「ユーザー登録画面」でユーザーが入力したデータは SQL Server には INSERT しないで「ユーザー一覧画面」の DataGridView に追加表示したいということですか?

違いますよね?

まず、「ユーザー登録画面」の「登録ボタンを押す」で SQL Server に新規データを INSERT して、さらにその後で「ユーザー一覧画面」の DataGridView に追加して表示したいのでは?

投稿2021/12/14 08:49

編集2021/12/15 02:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mon121

2021/12/14 09:16

ご回答ありがとうございます。 明日上記の方法についても試してみます。
guest

0

ユーザ一覧画面のソースコードが提示されていないので、推測が入っていますが、同じ名前の「DataGridView1」というコントロールがあったとしても、ユーザ一覧画面のものと新規登録画面のものは別の物です。

つまり、新規登録画面で入力したユーザ情報は、ユーザ一覧画面のDataGridView1に追加してやらないといけません。いろいろ方法はあるとおもいますが、ユーザ一覧画面の新規登録ボタンクリックのイベントで
0. リスト新規登録画面表示(new_user.ShowDialog())
0. 番号リスト新規画面が閉じられたら、new_userクラスの各プロパティ経由で入力した値を取得し、DataGridViewに追加

という流れが理解しやすいと思います。
ユーザ一覧画面のボタン名なんかは適当ですが、ソースはこんな感じでしょうか。

VB

1Private Sub AddNewUserButton_Click(ByVal sender As System.Object,ByVal e As System.Event_Args) Handle AddNewUserButton.Click 2 Dim frm As New new_user() 3 frm.ShowDialog(Me) 4 5 Dim i As Integer = DataGridView1.Rows.Count - 1 6 7 '追加した行に値をセット 8 DataGridView1.Rows(i).Cells(0).Value = frm.id 9 DataGridView1.Rows(i).Cells(1).Value = frm.pass 10 DataGridView1.Rows(i).Cells(2).Value = frm.name 11 DataGridView1.Rows(i).Cells(3).Value = frm.gender 12 DataGridView1.Rows(i).Cells(4).Value = frm.age 13 14 '追加した行にフォーカスを移す 15 DataGridView1.CurrentCell = DataGridView1(0, i) 16 17End Sub

投稿2021/12/14 08:03

KoichiSugiyama

総合スコア3041

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

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

mon121

2021/12/14 08:47

早急なご回答ありがとうございます。 同じ名前のDataGridViewであったも別物なのですね。大変勉強になります。 いただいたコードを入力してみたのですが、下記の部分でエラーが発生してしまいます。 DataGridView1.Rows(i).Cells(0).Value = frm.id DataGridView1.Rows(i).Cells(1).Value = frm.pass DataGridView1.Rows(i).Cells(2).Value = frm.Name DataGridView1.Rows(i).Cells(3).Value = frm.gender DataGridView1.Rows(i).Cells(4).Value = frm.age 'age' は 'WindowsApplication7.new_user' のメンバーではありません。 'gender' は 'WindowsApplication7.new_user' のメンバーではありません。 'id' は 'WindowsApplication7.new_user' のメンバーではありません。 'pass' は 'WindowsApplication7.new_user' のメンバーではありません。 変数自体は同じスコープ内で宣言しているのですが、なぜこのようなエラーが発生するのでしょうか? お手数ですがご教授いただけますと幸いです。
mon121

2021/12/14 09:16

申し訳ありません。コードを誤って新規登録画面のコードと勘違いしておりました。 明日再度試してみます。
mon121

2021/12/14 13:16 編集

何度も質問申し訳ございません。DataGridViewについて質問があるのですが、 仮に上記の方法でDataGridViewに新規追加をし、データをユーザー一覧フォームへ渡した場合は、データーベースそのものを更新したことになるのでしょうか。それともユーザー一覧に表示してあるDataGridViewのデータを書き換えただけなのでしょうか。 理想としてはDataGridViewはあくまで表示のみで、データの追加、削除、更新を別のフォームで行いたい、データーベースの更新を行いたいのですが、この場合はTableAdapterのupdateメソッドを使用するのでしょうか。
KoichiSugiyama

2021/12/15 04:13

業務で開発されているのでしょうか?それとも学校の課題でしょうか?今回の質問は周りに誰も聞く人がいないため初心者が陥りやすい勘違いだと思って回答しましたが、重ねて質問されている内容についてはちょっとネットで検索すればいくらでも事例が見つかるものだと思います。 ヒントだけ出しておくと「DataGridView DB連携」などで検索してみてください。それでやってみてなお判らないところがあれば、参考にしたサイトのURLと一緒に再度質問してみてください。その方がご自身の力を向上させる近道になると思います。
mon121

2021/12/15 05:32

会社の研修での課題を行っております。 仰るとおりDataGridViewのデータ更新についてはすぐにネットで情報が見つかりました。もう少し調べてから質問をすればよかったと反省しております。 今回の件でDataGridViewの大まかなことは理解したつもりですが、おそらくまだ勘違いしている点や、わからない部分があるかと思います。その際は改めてご質問させていただきます。
退会済みユーザー

退会済みユーザー

2021/12/15 05:57 編集

研修で出すような課題なら、実際に客先に出すようなプログラムではないのですから、プログラムの完成自体を目的にしている訳ではなく、問題解決力、業務に必要なスキル、調査するスキルを身に着けさせるためのものなんじゃないですか?こういった質問サイトで他人に問題を解決して貰って作ったところで、あなた自身のスキルは1ミリも成長しないので研修の意味がないでしょう。もし何も理解せず、必要なスキルを身に付けないまま実際の業務に投入される事になっても平気ですか? 自力で調べながら試行錯誤して作成し、それでもどうしても判らなければ講師・上司に聞くべきでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問