Передача значений между вкладками в форме в Visual Basic 2010 - PullRequest
1 голос
/ 01 января 2012

У меня есть форма с 3 вкладками: одна вкладка предназначена для ввода пользователя и вычислений, вторая вкладка показывает значения, которые будут использоваться для вычислений, которые считываются из одной базы данных (я называю это настройками в том смысле, что значения являются константами для вычислений)но это не настройки приложения в том смысле, как люди думают об этом, чтобы быть понятным), а третье отображает таблицу из другой базы данных.Вторая вкладка имеет интерфейс адаптера таблицы для набора данных, который содержит значения, используемые для вычислений, которые можно изменить (для различных сценариев). Эти числа считываются из одной записи в базе данных, содержащей 20 полей, и считывались один раз, когда данныезагружается на вторую отображаемую вкладку.

Проблема, с которой я столкнулся, заключается в том, что я хотел бы использовать числа со второй вкладки (константы) в вычислениях, которые будут отображаться на первой вкладке.

Я пытался объявить переменные на второй вкладке как общедоступные, но они уже "дружат" с событием формы.Однако, когда я использую их в расчетах, они как бы не существуют.

Например, одним из расчетов, который я делаю, является стоимость топлива.Пользователь вводит мили, и это сохраняется как переменная, называемая пробегом.Чтобы рассчитать полученную топливную стоимость, я должен использовать два других поля, которые показаны на второй вкладке: MPG (мили на галлон) и fuelprice (цена на газ).Так что стоимость топлива = (пробег / миль на галлон) * стоимость топлива.Они считываются из таблицы данных, называемой testdata, которая на самом деле является частью проекта.Я хочу иметь возможность использовать эти переменные во всей программе, но объявление их как общедоступных не работает.

Как сделать переменные из одной вкладки пригодными для использования в другом месте программы?Другая вещь, которую я заметил, заключается в том, что значения переменных загружаются в текстовые поля и им присваиваются имена переменных путем присвоения имен текстовым полям. Использование val ([variablename] .text) также не решает проблему.Например, сказать, что milespergallon = val (mpg.text) не работает, потому что я получаю сообщение о том, что «текст» не является целым числом, когда я объявляю milespergallon.

Обновление

Вот код, который используется:

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

Ответы [ 2 ]

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

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

Хотя вы можете перетаскивать набор данных на вкладку для отображения, значения из набора данных должны быть сохранены в локальных переменных.Это должно происходить в событии загрузки формы после оператора заполнения dataadapter, чтобы числа, использованные в любом месте формы:

  Me.TestdataTableAdapter.Fill(Me.fooDataSet.testdata)

  variable1 = Me.fooDataSet.testdata(0).variable1
  variable2 = Me.fooDataSet.testdata(0).variable2

и так далее.В моем примере набор данных называется 'foo', поэтому это fooDataSet.Таблица называется «testdata» и представляет собой таблицу из одной строки с несколькими записями.Подумайте о листе Excel с одной строкой и несколькими столбцами ... вот как выглядят тестовые данные.Я в общем назвал каждую переменную 'column' n, где n - номер столбца для моего примера, хотя вы бы дали им более значимые имена.Пример:

  discountcost = Me.priceDataSet.pricetable(0).discountcost
  markup = Me.priceDataSet.pricetable(0).markup

Затем вы можете DIM эти переменные.В примере со скидкой и разметкой вы могли бы DIM их как десятичные, а затем использовать их в расчетах на любой вкладке в вашей форме.

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

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

Скажем, например, что текстовое поле, содержащее мили на галлон, имеет значение mpg и находится в форме 2, вы должны иметь возможностьwrite:

  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 автоматически создаст переменные, которые не объявлены, что может нанести ущерб вашему коду.

Параметр строгое предписывает корректность типов данных в вашем коде.Без этого VB будет пытаться автоматически изменить переменные на те, которые, по его мнению, являются правильными типами, но это не всегда правильно.

Обратите внимание, что вы также можете применить эти настройки для всего проекта, щелкнув правой кнопкой мыши напроект, выбрав Properties, нажав на вкладку Compile, выбрав All Configurations из Configuration dropdown и выбрав On из выпадающих списков 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...