Получить нажатие кнопки для заполнения полей формы самой последней собранной точки

#wpf #vb.net

#wpf #vb.net

Вопрос:

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

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

Биты рабочего кода SaveAddNext :

 Public Sub New(ByVal Record As Feature, 
               ByVal previousRecord As Till_NonTillStation, 
               ByVal SurficialType As enumTillTypes)

    MyBase.New(Record, Constants.COL_TILL_CREATED_BY, 
               Constants.COL_TILL_CREATION_DATE, Constants.COL_TILL_EDITED_BY, 
               Constants.COL_TILL_EDIT_DATE, 
               DirectCast(previousRecord.Geometry, Esri.ArcGISRuntime.Geometry.MapPoint))

    If MessageBox.Show("Autopopulate fields from last point collected?", "Record Autopopulation", MessageBoxButton.YesNo) = vbYes Then

        Me.EXPOSURE_TYPE = previousRecord.EXPOSURE_TYPE
        Me.EXPOSURE_HEIGHT = previousRecord.EXPOSURE_HEIGHT
        Me.UNIT_THICKNESS = previousRecord.UNIT_THICKNESS
        Me.UNIT_TYPE = previousRecord.UNIT_TYPE
        Me.TILL_FACIES = previousRecord.TILL_FACIES
        Me.PERCENT_CLAY = previousRecord.PERCENT_CLAY
        Me.FIRST_LITHOFACIES_TYPE = previousRecord.FIRST_LITHOFACIES_TYPE
        Me.CONSISTENCY = previousRecord.CONSISTENCY
        Me.COLOUR = previousRecord.COLOUR
        Me.CLAST_PROVIDENCE = previousRecord.CLAST_PROVIDENCE
        Me.CLAST_ROUNDNESS = previousRecord.CLAST_ROUNDNESS
        Me.NOTES = previousRecord.NOTES

    End If
 

Пока что код кнопки. Я делаю вызов подразделу New, он переходит во всплывающее окно, но не считывает никаких данных. Я не уверен, как обращаться к данным :

 Private Sub btnAutopopulate_Click(sender As Object, e As RoutedEventArgs) Handles btnAutopopulate.Click

    previousRecord = New Till_NonTillStation(Constants.TillNonTillFeatureTable.CreateFeature, 
                                             _feature, enumTillTypes.Non_Till)

End Sub
 

Ответ №1:

В VB.NET Sub new — это конструктор объекта.

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

Не используйте (вызов) Sub New(конструктор) . Создайте другую функцию или метод для установки предыдущих данных.

Вот мое предложение, основанное на ваших последних комментариях:

1. Создайте глобальные переменные для хранения ваших данных: например, используйте

Общедоступный общий EXPOSURE_TYPE в виде строки Это отличается от использования Me.EXPOSURE_TYPE, который зависит от экземпляра формы.

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

Комментарии:

1. Хм — понятно. Создаем новый вспомогательный UsePreviousData(), который будет использовать btnAutopopulate_Click, но я все еще, кажется, натыкаюсь на ту же стену. Не уверен, как ссылаться на данные предыдущей записи в этой функции / без использования подстановки new .

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

3. Убедитесь, что вы не вызываете Sub new в своем коде. Я обновлю свой ответ.