【问题标题】:manipulating textbox variables in calculations在计算中操作文本框变量
【发布时间】:2012-01-02 21:34:58
【问题描述】:

我有一些代码试图在标签页中使用变量。第一个标签页只有一个用于用户输入的文本框 (miles.text) 和一个用于计算的按钮:旅行时间 = 里程/速度。来自miles.text 的值存储在一个名为mileage 的变量中,而使用的速度存储在一个名为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

【问题讨论】:

  • 不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过选中答案旁边的勾号来为好的答案投票并接受对您帮助最大的答案。在本网站上,点赞或接受的答案都算作“感谢”。

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


【解决方案1】:

在你做任何其他事情之前,你应该做以下事情:

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

  2. 点击Compile标签(左侧)

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

  4. Option Explicit 菜单中选择On

  5. Option Strict 菜单中选择On

  6. 保存项目

这很可能会导致显示大量错误,但修复这些错误将大大改善您的应用程序的运行状况。

现在,已经完成了,下面的代码将修复按钮单击中的问题:

    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

但是,您拥有的代码会产生正确的结果,因此肯定有其他问题。请先尝试上述方法,如果仍有问题,您可以使用详细信息更新您的问题。

【讨论】:

  • 相反,有没有一种方法可以让我说 tabpage2.speedtextbox.text = foodataset.testdata.speed 并像这样存储它,因为我正在从只有一个的数据库中读取数据行(它是 20 个字段之一)?不确定。
  • 是的,您绝对可以将值直接加载到文本框中。但请记住,您不需要在文本框前面添加tabpage2
  • 由于数据库只有一行,我想从中获取一个字段,我会不会写像 Me.speed = Me.foodataset.testdata.speed 这样的东西,因为 MDB 文件中的字段名称是确切的速度,因此保持名称相似并将其声明为整数?
  • 我正在尝试掌握如何编写 DIM 语句以从单行中提取项目。例如,我想将 mpg 存储到 Me.mpg 但我看到我必须使用像 Dim row As DataRow = fooDataSet.testdataRow.Equals.item("mpg") 之类的东西,显然我在这方面有太多参数线。我在想这些方面的东西会解决我的问题,但我不知道该怎么做。
  • 你很亲密:Me.Mpg = CDec(fooDataSet.testdataRow("mpg"))Item 属性返回具有指定名称的列的值,由于这是 DataRow 的默认属性,您可以使用上面的快捷方式。你也可以写成:Me.Mpg = CDec(fooDataSet.testdataRow.Item("mpg"))
【解决方案2】:

我会在一个单独的类中实现计算,然后使用对象绑定。以下是旅行时间计算器的外观:

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

当您输入速度和里程时,行程时间文本框将自动更新。非数字条目将自动被拒绝,所有文本数字转换都会自动发生。

【讨论】:

    【解决方案3】:

    我发现了问题所在。

    要将单行数据库中的字段存储到局部变量中进​​行计算,显然它必须发生在 form1_load 事件中,在 dataadapter 填充语句之后,如下所示:

    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
    

    确保将行程时间设为小数。

    有效!问题是 (0) 表示第 0 行(因为它只有一行。)谢谢大家的帮助,尤其是 Competent_Tech。我学到了一些东西,我很高兴能回到你们那里分享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2015-10-05
      相关资源
      最近更新 更多