【解決方法】クラスレベルのブール値に基づいた if ステートメントを処理するサブルーチンを取得できないのはなぜですか?


私の vb.net winforms プロジェクトでは、特定のフラグ ブール変数 (flagDataLoading) が true の場合、何もせずに終了したいフォーム クラスにサブがあります。 ただし、if ステートメントの内容の実行に進みます。 なぜこれを行うのですか?

Imports System.Configuration
Imports System.Data.SqlClient
Public Class Form1
    Private flagDataLoading As Boolean = True
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        DataGridView1.DataSource = GetTestTable()
        flagDataLoading = False

    End Sub
    Private Function GetTestTable()
        Dim dtTest As New DataTable
        Dim connString As String = ConfigurationManager.ConnectionStrings("dbx").ConnectionString
        Using conn As New SqlConnection(connString)
            Using cmd As New SqlCommand("SELECT * FROM dbo.testTable", conn)
                conn.Open()
                Dim reader As SqlDataReader = cmd.ExecuteReader
                dtTest.Load(reader)
            End Using
        End Using
        Return dtTest
    End Function



    Private Sub DataGridView1_RowEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.RowEnter
        If flagDataLoading = False Then
            Dim reply As DialogResult = MessageBox.Show("Save the current record?", "Question:", MessageBoxButtons.YesNo)
            If reply = DialogResult.Yes Then
                Dim connectionString As String = "Data Source=(localdb)\ProjectModels;Initial Catalog=master;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
                Using conn As New SqlConnection(connectionString)
                    conn.Open()

                    Dim insertSql As String = "INSERT INTO dbo.testTable(testColumn) VALUES (@value)"
                    Using transaction As SqlTransaction = conn.BeginTransaction
                        Try
                            For Each row As DataGridViewRow In DataGridView1.Rows
                                If Not row.IsNewRow Then
                                    Using cmd As New SqlCommand(insertSql, conn, transaction)
                                        cmd.Parameters.AddWithValue("value", row.Cells("column1").Value)
                                        cmd.ExecuteNonQuery()
                                    End Using
                                End If
                            Next
                        Catch ex As Exception

                        End Try
                    End Using
                End Using
            Else
                Return
            End If

        End If

    End Sub

End Class

サブ DataGridView1_RowEnter は、入力された行を保存するかどうかをユーザーに確認することになっていますが、Form1_Load サブ中にデータベースのすべての既存のレコードに対してこれを行うため、If ステートメントに入れました。 flagDataLoading は、データ グリッドにデータベース テーブルからのデータがまだ入力されているかどうかを示すことになっています。

私が試したこと:

if ステートメントの前でブレークすると、ブール値が 真実つまり、if ステートメントは実行されるべきではありませんが、実行されます。

解決策 1

DataSource を設定した後でフラグに値を割り当てますが、RowEnter イベントは Load イベント メソッドが終了するまで実行されません。 その時までに、フラグはすでにリセットされています。

Load ではなく Shown イベントでフラグを false に設定してみてください。 コードが機能するのに十分なほど遅延する可能性がありますが、そうでない場合は、機能が完了するまで「待機」するタイマーを追加する必要があります。

コメント

タイトルとURLをコピーしました