2012-03-29 45 views
2

Windows窗體應用程序。 VB .NET 4.0在我的應用程序中,我有一個全局布爾變量,用於跟蹤更改何時發生以及何時保存,稱爲changesSaved。關閉它甚至在關閉窗口之前檢查此變量的值..我正在使用textchanged事件來自動更改文本更改時changesSaved的值爲FALSE ..問題:動態填充組框項目,以便用戶可以編輯值或只是查看它們。此動態填充正在導致textchanged事件觸發,因爲程序正在更改框的文本值,以將值存儲在數據庫中。 textchanged事件不應該觸發,除非用戶自己在文本框中輸入一個或多個值。有沒有一種方法可以指定源,我想你可以說爲文本更改事件或其他方式,以便它只會觸發當用戶輸入信息時。函數如下:第一個被load事件調用,將值放在方框中......下一個是第一個被調用的那個,也是導致問題的那個..將textchanged事件設置爲僅當用戶不是程序實際輸入文本時觸發

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 
+0

也許只是移動ChangesSaved =虛假陳述你的KeyUp事件。然後它知道用戶何時鍵入了某些內容,而不是程序改變某些內容。 – APrough 2012-03-29 19:22:29

回答

2

幾種不同的方法。

因爲你只是在做ChangesSaved = FalseTextChanged事件,只是將其設置爲True後您以編程方式更新。

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

或者只是刪除TextChanged處理程序,更新文本框編程,然後添加處理回。

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

再次感謝...您的解決方案解決了一些其他問題,以及我會碰到..感謝所有的建議,我決定對keyup事件,因爲如果用戶在窗口會單獨使用Tab鍵, changesSaved = False ... – Skindeep2366 2012-03-29 20:10:30

+2

@ Skindeep2366別說使用鼠標右鍵單擊並粘貼文本。沒有鍵盤事件。 – LarsTech 2012-03-29 20:12:09

0

我會建議使用Validated()代替TextChanged事件。僅當所述元素的焦點被用戶輸入改變時才調用Validated()。這樣你就可以保存以便通過外部來源填充你的TextBox

Control.Validated Event @ MSDN

相關問題