Установка события с измененным текстом, чтобы оно срабатывало только тогда, когда текст фактически вводится пользователем, а не программой - PullRequest
2 голосов
/ 29 марта 2012

Windows формирует приложение.VB .NET 4.0 В моем приложении у меня есть глобальная логическая переменная, которая отслеживает, когда вносятся изменения и когда они сохраняются, называется changeSaved.При закрытии даже он проверяет значение этой переменной перед закрытием окна. Я использую текстовое событие для автоматического изменения значения changeSaved на FALSE при изменении текста. Проблема: элементы группового блока заполняются динамически, чтобы пользователь могизменить значения или просто просмотреть их.Это динамическое заполнение вызывает событие textaged, потому что программа изменяет текстовое значение поля, чтобы поместить значения, хранящиеся в базе данных.Событие textaged не должно запускаться, пока пользователь сам не введет значение или значения в текстовые поля. Есть ли способ указать источник, который, как я полагаю, вы могли бы сказать для события с измененным текстом, или другой способ, чтобы он срабатывал толькокогда пользователь вводит информацию. ???Функции следующие: первая вызывается событием load для помещения значений в поле ... следующая - та, которая вызывается в результате первой, а также та, которая вызывает проблемы...

Private Sub loadProperty(ByVal x As Integer)
    Dim _property As property_info = db.property_info.Single(Function(s) s.idProperties = x)
    p_settingsCity.Text = _property.city.ToString
    p_settingsState.Text = _property.state.ToString
    p_settings_PropertyName.Text = _property.property_Name.ToString
    p_settingsZipCode.Text = _property.zipcode.ToString
    p_settings_Address.Text = _property.address1.ToString
    p_settingsCity.Text = _property.city.ToString
    p_settingsState.Text = _property.state.ToString
        If _property.AllowRentProration = 1 Then
          RentProrate.Checked = True
        Else
          RentProrate.Checked = False
        End If
    RentProrate.Visible = True
End Sub


Private Sub PropertyTextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles PropertyDetailsGroup.TextChanged
    ChangesSaved = False
End Sub   

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Пара разных способов.

Поскольку вы просто делаете ChangesSaved = False в событии TextChanged, просто установите его на True после , вы программно обновите его.

Private Sub loadProperty(ByVal x As Integer)
  '// code
  RentProrate.Visible = True
  ChangesSaved = True
End Sub

Или просто удалите обработчик TextChanged, обновите TextBox программно, затем добавьте обработчик обратно.

RemoveHandler PropertyDetailsGroup.TextChanged, AddressOf PropertyTextChanged
PropertyDetailsGroup.Text = "value from database"
AddHandler PropertyDetailsGroup.TextChanged, AddressOf PropertyTextChanged

Реализация INotiftyPropertyChanged интерфейс и использование Databinding было бы другим способом, более чистым на самом деле.Вам не понадобится флаг на уровне формы, вы можете отследить любые изменения, сделанные пользователем на уровне класса, примерно так:

Public Class TestClass
  Implements INotifyPropertyChanged

  Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

  Private _IsDirty As Boolean = False
  Private _TextValue As String = String.Empty

  Private Sub OnPropertyChanged(ByVal propertyName As String)
    _IsDirty = True
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
  End Sub

  Public ReadOnly Property IsDirty() As Boolean
    Get
      Return _IsDirty
    End Get
  End Property

  Public Property TextValue() As String
    Get
      Return _TextValue
    End Get
    Set(ByVal value As String)
      If value <> _TextValue Then
        _TextValue = value
        OnPropertyChanged("TextValue")
      End If
    End Set
  End Property

End Class
0 голосов
/ 29 марта 2012

Я бы предложил использовать Validated() вместо TextChanged Событие.Validated() вызывается только тогда, когда фокус указанного элемента изменяется при вводе пользователем.Таким образом, вы сохраните, чтобы заполнить свои TextBox внешним источником.

Control.Validated Event @ MSDN

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