манипулирование переменными текстового поля в вычислениях - PullRequest
0 голосов
/ 03 января 2012

У меня есть код, где я пытаюсь использовать переменные на вкладке.Первая вкладка имеет только одно текстовое поле для ввода пользователя (miles.text) и кнопку для расчета: время в пути = пробег / скорость.Значение из miles.text сохраняется в переменной с именем m miles, а используемая скорость сохраняется в переменной с именем 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 ]

1 голос
/ 03 января 2012

Прежде чем делать что-либо еще, вы должны сделать следующее:

  1. Откройте свойства проекта (щелкните проект правой кнопкой мыши, затем выберите Properties)

  2. Нажмите на вкладку Compile (левая сторона)

  3. Выберите All Configurations из выпадающего меню

  4. Выберите On в меню Option Explicit.

  5. Выберите On в меню Option Strict.

  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

Однако код, который у вас есть, даст правильные результаты, поэтому должно быть что-то еще не так. Сначала попробуйте описанное выше, и если проблемы не устранены, вы можете обновить свой вопрос с указанием деталей.

0 голосов
/ 05 января 2012

Я обнаружил, в чем проблема.

Чтобы сохранить поле из однострочной базы данных в локальной переменной для вычислений, очевидно, это должно происходить в событии form1_load, после оператора заполнения dataadapter, напримеритак:

Me.TestdataTableAdapter.Fill(Me.foouDataSet.testdata)
  speed = Me.fooDataSet.testdata(0).speed

и просто скорость DIM в виде десятичной дроби после строки Public Class.То же самое можно было бы сделать для любой другой области, с которой вы хотите работать в подобном виде одиночного datarow:

yourvarname = Me.yourdatasetname.yourtablename(0).the_database_field_you_want_to_fetch

(Вау! Я только что написал что-то учебное? LOL)

после нажатия кнопки, чтобы выполнить расчет, это:

traveltime = CDec(miles.Text/ speed) 
txttraveltime.Text = traveltime.ToString

, убедившись, что время прохождения DIM в десятичном формате.

Работает!Проблема заключалась в (0), чтобы указать строку 0 (потому что это только одна строка.) Спасибо всем за вашу помощь, особенно Competent_Tech.Я кое-что узнал, и я счастлив, что смогу вернуться к вам, ребята, и поделиться.

0 голосов
/ 04 января 2012

Я бы реализовал вычисление в отдельном классе, а затем использовал бы привязку объекта.Вот как будет выглядеть калькулятор времени в пути:

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

Когда вы вводите скорости и мили, текстовое поле времени прохождения будет автоматически обновляться,Нечисловые записи будут автоматически отклонены, и все преобразования чисел в текст произойдут автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...