在计算中操纵文本框变量

时间:2012-01-02 21:34:59

标签: vb.net visual-studio-2010 textbox

我有一些代码,我试图在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

3 个答案:

答案 0 :(得分:1)

在您做任何其他事情之前,您应该执行以下操作:

  1. 打开项目的属性(右键单击项目,然后选择Properties

  2. 点击Compile标签(左侧)

  3. 从下拉菜单中选择All Configurations

  4. On菜单中选择Option Explicit

  5. On菜单中选择Option Strict

  6. 保存项目

  7. 这很可能会导致显示很多错误,但修复这些错误会大大提高应用程序的运行状况。

    现在,完成后,以下代码将解决按钮单击中的问题:

        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。我学到了一些东西,我很高兴我可以回复你们并分享。