我有一些代码,我试图在tabpage中使用变量。第一个标签页只有一个用于用户输入的文本框(miles.text)和一个用于计算的按钮:traveltime = miles / speed。来自miles.text的值存储在名为里程的变量中,而使用的速度存储在名为speed(me.speedtextbox.text)的变量中。
通常,执行val(variable.text)就像魅力一样,在这种情况下它不会这样做。当用户输入100里程时,应将其除以65(数据库中的数字),因此答案应为1.53小时。在我的情况下,我得到“无穷大”,每当我对变量做任何其他事情时,我得到“当从数字中投射时,值必须是小于无穷大的数字。”但它是!它只有65,我仔细检查了数据集是否也表示了这一点。不知道为什么我收到这个错误...谢谢!
Public Class Form1
Private Property Traveltime As Decimal
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'fooDataSet.testdata' table. You can move, or remove it, as needed.
Me.TestdataTableAdapter.Fill(Me.foouDataSet.testdata)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mileage As Integer
Dim speed As Integer
mileage = Val(miles.Text)
speed = Val(Me.SpeedTextBox.Text)
traveltime = mileage / speed
txttraveltime.text = Traveltime.ToString
End Sub
Private Sub txtrate_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txttraveltime.TextChanged
End Sub
End Class
所以我做了一个测试程序,它只做了一件事就是简单地读取一行数据库中的一个数据列并将其存储到局部变量并将其乘以1.60,除非现在我得到“引用非共享成员需要一个对象引用“当我声明它时它似乎不能识别Me.Speed。我究竟做错了什么?
Public Class Form1
Dim Speed As Object
Dim Me.Speed As New Speed
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Speed = CDec(fooDataSet.testdataRow.Item("speed"))*1.60
Speedtextbox.text = Me.Speed.tostring
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'fooDataSet.testdata' table. You can move, or remove it, as needed.
Me.TestdataTableAdapter.Fill(Me.fooDataSet.testdata)
End Sub
End Class
答案 0 :(得分:1)
在您做任何其他事情之前,您应该执行以下操作:
打开项目的属性(右键单击项目,然后选择Properties
)
点击Compile
标签(左侧)
从下拉菜单中选择All Configurations
从On
菜单中选择Option Explicit
。
从On
菜单中选择Option Strict
。
保存项目
这很可能会导致显示很多错误,但修复这些错误会大大提高应用程序的运行状况。
现在,完成后,以下代码将解决按钮单击中的问题:
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
但是,你拥有它的代码会产生正确的结果,所以必然会有其他不妥之处。首先尝试以上操作,如果仍有问题,您可以使用详细信息更新您的问题。
答案 1 :(得分:0)
我会在一个单独的类中实现计算,然后使用对象绑定。以下是旅行时间计算器的外观:
Imports System.ComponentModel
Public Class TraveltimeCalculator
Implements INotifyPropertyChanged
Private _miles As Double
Public Property Miles() As Double
Get
Return _miles
End Get
Set(ByVal value As Double)
If _miles <> value Then
_miles = value
OnPropertyChanged("Miles")
OnPropertyChanged("Traveltime")
End If
End Set
End Property
Private _speed As Double
Public Property Speed() As Double
Get
Return _speed
End Get
Set(ByVal value As Double)
If _speed <> value Then
_speed = value
OnPropertyChanged("Speed")
OnPropertyChanged("Traveltime")
End If
End Set
End Property
Public ReadOnly Property Traveltime() As Double
Get
Return If(_speed = 0.0, 0.0, _miles / _speed)
End Get
End Property
#Region "INotifyPropertyChanged Members"
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Private Sub OnPropertyChanged(ByVal propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
#End Region
End Class
在Visual Studio中,在“数据源”面板中添加数据源。选择“对象”,然后选择TraveltimeCalculator
(必须先编译,然后才能执行此操作)。现在,您可以将速度,里程和行程时间字段从数据源面板拖到表单中。所有的电线都会自动发生。 VS会自动将BindingSource和导航器插入到表单中。您将不需要导航器并可以安全地删除它。您仍然需要做的唯一事情是在表单加载事件处理程序或表单构造函数中添加以下代码:
Private Sub frmTravelTime_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TraveltimeCalculatorBindingSource.DataSource = New TraveltimeCalculator()
End Sub
当您输入速度和里程数时,旅行时间文本框将自动更新。非数字条目将自动被拒绝,并且所有文本编号转换都会自动发生。
答案 2 :(得分:0)
我发现了问题所在。
要将一行数据库中的字段存储到本地变量进行计算,显然必须在dataadapter fill事件之后的form1_load事件中发生,如下所示:
Me.TestdataTableAdapter.Fill(Me.foouDataSet.testdata)
speed = Me.fooDataSet.testdata(0).speed
并且在公共类行之后仅将DIM速度设置为十进制。对于您希望在类似的单一数据路径中使用的任何其他字段,也可以这样做:
yourvarname = Me.yourdatasetname.yourtablename(0).the_database_field_you_want_to_fetch
(哇!我刚写了一些教科书吗?大声笑)
然后,在按钮单击后,进行计算,它是:
traveltime = CDec(miles.Text/ speed)
txttraveltime.Text = traveltime.ToString
确保DIM旅行时间为十进制。
作品!问题是(0)表示第0行(因为它只有一行。)谢谢大家的帮助,尤其是Competent_Tech。我学到了一些东西,我很高兴我可以回复你们并分享。