在 Visual Basic 2010 中的表单中的选项卡之间传递值
Posted
技术标签:
【中文标题】在 Visual Basic 2010 中的表单中的选项卡之间传递值【英文标题】:Passing values between tabs in a form in Visual Basic 2010 【发布时间】:2012-01-01 02:02:03 【问题描述】:我有一个带有 3 个选项卡的表单:一个选项卡用于用户输入和计算,第二个选项卡显示将用于从一个数据库读取的计算的值(我称之为设置,因为这些值是用于计算的常量但它不是人们想象的应用程序设置,要清楚),第三个显示来自另一个数据库的表。第二个选项卡有一个用于数据集的表适配器接口,其中包含用于计算的值,这些值可以更改(以执行不同的场景。)这些数字是从具有 20 个字段的数据库中的单个记录中读取的,并且在数据时读取一次加载到要显示的第二个选项卡中。
我遇到的问题是我想在计算中使用第二个选项卡中的数字(常量)来显示在第一个选项卡上。
我已尝试将第二个选项卡上的变量声明为公开,但它们已经是表单事件的“朋友”。但是,当我在计算中使用它们时,就好像它们不存在一样。
例如,我正在做的一项计算是燃料成本。用户输入里程,并将其存储为称为里程的变量。要计算结果燃料成本,我必须使用第二个选项卡中显示的其他两个字段:MPG(英里每加仑)和燃料价格(汽油价格)。所以燃料成本=(里程/mpg)*燃料价格。这些是从名为 testdata 的数据表中读取的,该数据表实际上是项目的一部分。我希望能够在整个程序中使用这些变量,但将它们声明为 public 是行不通的。
如何使一个选项卡中的变量在程序的其他地方可用?我注意到的另一件事是,由于变量的值被加载到文本框中并通过命名文本框来分配变量名称,因此使用 val([variablename].text) 也不能解决问题。例如,说milespergallon = val(mpg.text) 并不奏效,因为当我声明milespergallon 时,我收到一条消息'text' 不是整数。
更新
这里是正在使用的代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mileage = Int32.Parse(Miles.Text)
Dim rate = 0
Dim baserate = 0
Dim rateper = 0
Dim ratemile As Integer
Dim Mpg As Decimal
Dim milespergallon As Decimal
milespergallon = CDec(Mpg.Text)
' Ensure the value is numeric
If IsNumeric(Mpg) Then
Mpg = CDec(Mpg)
Else
milespergallon = CDbl(Mpg.Text)
End If
txtmilespergallon.Text = milespergallon.ToString
End Sub
TabPage2 是显示我想在 TabPage1 中使用的变量的位置。
Private Sub TabPage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage2.Click
End Sub
【问题讨论】:
【参考方案1】:应该没有什么可以阻止您在另一个选项卡的一个选项卡中使用文本框中的值。
比如说,每加仑英里数的文本框是 mpg 并且在 form2 上,你应该可以这样写:
Dim milesPerGallon As Decimal
' Ensure the value is numeric before trying to use it
If IsNumeric(mpg.Text) Then
milesPerGallon = CDec(mpg.Text)
Else
' Do something here
End If
请注意,在尝试转换之前,您应该尝试验证文本框的内容。
将以下选项添加到源代码文件的最顶部也非常重要:
Option Explicit On
Option Strict On
如果您的变量名称略有不同并且没有注意到它,这将有所帮助。如果没有显式打开选项,VB 将自动创建未声明的变量,这会对您的代码造成严重破坏。
Option strict 强制数据类型在您的代码中正确。如果没有这个,VB 将尝试自动将变量更改为它认为正确的类型,但这并不总是正确的。
请注意,您还可以通过右键单击项目,选择Properties
,单击Compile
选项卡,从Configuration dropdown
中选择All Configurations
,然后选择@987654327 来为整个项目强制执行这些设置@ 来自 Option explicit
和 Option strict
下拉菜单。
有问题的新代码更新
鉴于问题中的以下代码:
Dim Mpg As Decimal
Dim milespergallon As Decimal
milespergallon = CDec(Mpg.Text)
' Ensure the value is numeric
If IsNumeric(Mpg) Then
Mpg = CDec(Mpg)
Else
milespergallon = CDbl(Mpg.Text)
End If
有一个错字,因为 Mpg 被声明为 Decimal 类型的局部变量,所以它没有 .Text 属性。我怀疑这至少会导致一些问题。
假设 Mpg 是 tab2 上的文本框的名称,我将如何重写该代码块:
Dim milespergallon As Decimal
' Ensure the value is numeric
If Not IsNumeric(Mpg.Text) Then
milespergallon = 0
Else
milespergallon = CDec(Mpg.Text)
End If
更新
以下是我将如何重写您的按钮点击代码:
Dim mileage As Integer
Dim speed As Integer
If IsNumeric(Me.Miles.Text) Then
mileage = CInt(Me.Miles.Text)
End If
If IsNumeric(Me.SpeedTextBox.Text) Then
speed = CInt(Me.SpeedTextBox.Text)
End If
If speed <> 0 Then
Traveltime = CDec(mileage / speed)
Else
Traveltime = 0
End If
txttraveltime.text = Traveltime.ToString
【讨论】:
我认为您的分配顺序可能倒退。我相信你想要的是milespergallon = CDec(txtMilesPergallon.text)
。
感谢 Competent_Tech!还是有问题。尝试了上面的转换方法。为了测试该变量是否被捕获以供使用,我将它放入屏幕上的一个文本框中,当 TabPage2 中显示的值为 5.0 时,它显示为零。我用来执行此操作的文本框是 txtMilespergallon.text = milespergallon.tostring。 val([variablename].text) 不应该工作有什么原因吗?它通常效果最好,但不确定为什么这次不是。我想知道是不是因为当我查看代码而不是共享时,我的数据似乎显示为“私人子”的 TabPage?
我现在收到一个错误回复:milespergallon = CDec(txtMilesPergallon.text),上面写着“从数字转换时,值必须来自小于无穷大的数字”(它是)并且还建议“确保源类型可转换为目标类型”。 mdb 文件中的源类型是数字,所以我不确定为什么会挂掉:/
好的,听起来你正在取得进展。这个错误的意思是 txtMilesPerGallon.Text 是空的(这就是为什么我建议在尝试转换值之前使用 IsNumeric 函数)。为什么它是空的是下一个问题。我会做几件事:1)在表单设计器中三重检查文本框的名称,以确保它是你认为的(我有过复制一个字段的情况,它就在实际的顶部字段) 2) 在调试器中单步执行代码并查看 txtMilesPerGallon.Text 在每一站的值。当它变为空白时,这就是你的问题。
大家新年快乐!检查字段和文本框的名称,它们是正确的。我尝试通过使用“步入”(这是我第一次使用它)来使用调试器,并且我设置了一个即时窗口,但它显示“跨过非用户代码”并且没有显示变量值。此外,更改包含我想要公开的数据或私有以外的数据的文本框的属性是否会使我的数据在其他选项卡中可见?其他一切似乎都不起作用,我认为如果将变量设为 Public,它就可以在程序的任何地方使用。【参考方案2】:
这与我关于从数据库中操作值的另一篇文章有关,因此我的回答假设用户已从单行数据库加载数据并将其显示在标签页中,但还希望在程序的其他地方使用该数据.
虽然您可以将数据集拖到要显示的标签页中,但数据集中的值必须存储到局部变量中。这必须在 dataadapter 填充语句之后的表单加载事件中发生,以便在表单中的任何位置使用数字:
Me.TestdataTableAdapter.Fill(Me.fooDataSet.testdata)
variable1 = Me.fooDataSet.testdata(0).variable1
variable2 = Me.fooDataSet.testdata(0).variable2
等等。在我的示例中,数据集称为“foo”,因此它是 fooDataSet。该表称为“testdata”,是具有多条记录的单行表。想想一个有一行和几列的 Excel 表……这就是 testdata 的样子。对于我的示例,我通常将每个“列”变量称为 n,其中 n 是列的编号,尽管您会给它们起更有意义的名称。示例:
discountcost = Me.priceDataSet.pricetable(0).discountcost
markup = Me.priceDataSet.pricetable(0).markup
然后您可以对这些变量进行 DIM 处理。在折扣成本和加价示例中,您可以将它们调暗为十进制,然后可以在表单上的任何标签页中的计算中使用它们。
【讨论】:
以上是关于在 Visual Basic 2010 中的表单中的选项卡之间传递值的主要内容,如果未能解决你的问题,请参考以下文章
Visual Basic 2010 Express 中的免费水晶报表
C++ 中的多个定义 (Visual Basic 2010)
在 Visual Basic VB.Net 2010 中使用 System.DateTime 类型作为可选参数