【问题标题】:Getting the value of the label from other form using vb.net使用 vb.net 从其他表单获取标签的值
【发布时间】:2022-02-03 22:46:01
【问题描述】:

它不起作用,标签只会恢复到其默认值。你觉得问题出在哪里?

好的,这是我的代码:

其实我这里用的是mysql作为我的数据库

这是生成标签值的形式:

Private Sub ProfileControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Try
        Dim conn As New MySqlConnection(ServerString)
        Dim dap As New MySqlDataAdapter("select * from employee where LogInID = '" & Main.ID.Text & "'", conn)
        Dim dt As New DataTable
        dap.Fill(dt)

        employeenum = dt.Rows(0).Item("EmployeeID")
        position = dt.Rows(0).Item("Position")
        employeename = dt.Rows(0).Item("FirstName") + " " + dt.Rows(0).Item("LastName")

        lblemployeename.Text = employeename
        lblemployeenum.Text = employeenum
        EmpPosition.Text = position

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

这是检索 3 个标签值的表单。

Private Sub addsavebutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addsavebutton.Click
    Dim profile As New ProfileControl


    If txtbranchname.Text <> "" Then
        If addsavebutton.Text = "ADD" Then

            Dim zero As Integer = 0
            Dim SQLStatement As String = "INSERT INTO branch(BranchName,Centers)VALUES('" & txtbranchname.Text & "','0') "
            SaveCenter(SQLStatement)
            logdate = Convert.ToDateTime(Date.Now).ToString("yyyy-MM-dd hh:mm:ss")
            logdate2 = Format(Date.Now, "yyyy-MM-dd")
            status = "Added Branch " + txtbranchname.Text
            SQLStatement = "INSERT INTO log(EmployeeID,Name,EmployeePosition,Date,DateTime,Status)VALUES('" & profile.lblemployeenum.Text & "','" & profile.lblemployeename.Text & "','" & profile.EmpPosition.Text & "','" & logdate2 & "','" & logdate & "','" & status & "' )"
            Savelog(SQLStatement)
            txtbranchname.Clear()
        ElseIf addsavebutton.Text = "SAVE" Then
            Dim Query As String

            Dim con As MySqlConnection = New MySqlConnection(ServerString)
            con.Open()

            Query = "UPDATE branch SET  BranchName = '" & txtbranchname.Text & "' WHERE BranchCode = '" & txtbranchcode.Text & "'"


            Dim cmd As MySqlCommand = New MySqlCommand(Query, con)
            Dim i As Integer = cmd.ExecuteNonQuery()
            If (i > 0) Then

                'success
                Dim Successtext As New MsgSuccess
                Successtext.PassedText = "Record is Successfully Updated"
                Successtext.ShowDialog()


                Dim SQLStatement As String
                logdate = Convert.ToDateTime(Date.Now).ToString("yyyy-MM-dd hh:mm:ss")
                logdate2 = Format(Date.Now, "yyyy-MM-dd")
                status = "Updated Branch: " + txtbranchcode.Text + ", " + txtbranchname.Text
                SQLStatement = "INSERT INTO log(EmployeeID,Name,EmployeePosition,Date,DateTime,Status)VALUES('" & profile.lblemployeenum.Text & "','" & profile.lblemployeename.Text & "','" & Main.lbldate.Text & "','" & logdate2 & "','" & logdate & "','" & status & "' )"
                Savelog(SQLStatement)

                srchTextBox.Clear()
                con.Close()

            Else
                'error
                Dim Errortext As New Msgerror
                Errortext.PassedText = "Record is not Updated"
                Errortext.ShowDialog()



            End If


        End If
    Else
        Dim Errortext As New Msgerror
        Errortext.PassedText = "All Entries with * must be filled"
        Errortext.ShowDialog()

    End If
End Sub

【问题讨论】:

  • 哎呀,sql注入漏洞,烧死我们了!

标签: vb.net


【解决方案1】:

首先,在 form1 中创建一个 form2 的实例。

Dim secondform As New Form2

在您的表单 2 上,转到三个标签的“修饰符”属性并将其更改为公共。

然后你可以在form1中设置变量来获取标签的值,如下所示;

Dim a As String = secondform.lblemployeename.Text
Dim b As String = secondform.lblemployeenum.Text
Dim c As String = secondform.lblEmpPosition.Text

这应该使“a”、“b”和“c”成为标签的值

【讨论】:

  • 如果值发生变化,您必须更新它们,否则 a、b、c 将始终保留第一个值。
  • 那成功了吗?好吧,这就是OP要解决的问题。我已经给出了实现他所要求的方法。
  • 如果您需要以其他方式访问控件,我已经更新了我的答案。无论如何,以这种方式,如果您需要更新值,则应该从 lblName.TextChanged 事件中更改 a、b、c 值。
  • 我刚刚在 VS2010 VB.net 中制作了一个两种形式的应用程序,并复制了我的答案,它工作正常。发布一些代码,因为现在无法提供进一步的帮助
  • 编辑当前问题,而不是创建新问题。
【解决方案2】:

只需添加表单名称中的控件:

Form2.lblemployeename.Text
Form2.lblemployeenum.Text
Form2.lblEmpPosition.Text

对我来说,在带有 VS2005 的 VB.NET 2.0 中,控件是由 Friend 创建的。检查表单设计器并将您的控件放在PublicFriend(如果需要,还有With Events)上,以便在其他表单中使用它们。

【讨论】:

  • @user2083771 因为默认情况下它不是公开的。
  • @ShadowWizard 我刚从一个新项目中尝试过,默认情况下它声明为Friend,所以它可以工作=/。我使用 VS2005 和 .NET 2.0
  • 很奇怪,在 C# 中它是不同的。我很确定语言在这个主题上无关紧要.. :/
  • @ShadowWizard 是的,我刚刚在 C# 中尝试过,默认情况下是 private
  • @ShadowWizard 如果你有兴趣我发现了这个:stackoverflow.com/questions/3168711/…
【解决方案3】:

看起来您正在创建表单的实例 (Dim profile As New ProfileControl),然后您尝试访问他的控件值。你不是已经创建了ProfileControl 吗?

无论如何,如果ProfileControl 是一个表单,Load 事件只会在表单加载时执行(当您显示表单时),因此标签的值不会被加载。

如果您已经显示表单,请不要创建该实例并使用您显示的表单名称来访问标签。

如果您没有显示表单,则应考虑在另一个变量中创建该值,然后将其分配给标签或创建自己的类等。

【讨论】:

  • 对不起,ProfileControl 不是表单,而是用户控件。
  • 是的,我已经展示了表单,但是如何在不创建该实例的情况下访问标签?
【解决方案4】:

知道这有点晚了,但我花了 2 天时间才弄清楚(我从 Google、stackoverflow、VBforums 阅读了 100 多页……)。这里有解决方案:

创建constants.vb(类)并在下面输入代码:

Public Shared Property loading_window_status As String = ""

现在您可以从 form1、form2.ShowDialog()、form3.Show() 访问 loading_window_status。

表格1:

constants.loading_window_status = "Test"

表格2:

dim a as string
a = constants.loading_window_status

对我来说,当我想从 loading_screen timer1.tick 关闭 loading_screen.ShowDialog() 时,没有其他工作,但关闭的触发器在 form1 上。

示例:

Public Class form1
    Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'set status to show
        Constants.loading_window_status = "Show"
        'multitreads for spinner to run on loading_screen
        Application.DoEvents()
        'use ShowDialog or System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf form_loader_window.ShowDialog), Me)
        loading_screen.ShowDialog()

    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs)
        'close screen loader
        Constants.loading_window_status = "Close"
    End Sub
End Class
Public Class loading_screen

    Private Sub loading_screen(sender As Object, e As EventArgs) Handles MyBase.Load

        Timer1.Interval = 500
        Timer1.Start()

    End Sub


    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim what_todo As String
        'get status from "form1"
        what_todo = Constants.loading_window_state

        If what_todo = "Close" Then
        'if status close, close me (ShowDialog)
            Me.Close()
            Timer1.Stop()

        End If

    End Sub
End Class

在 Microsoft Visual Studio Community 2019 Preview 上测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多