RecordOrganizer/app/DD-Record-Organizer/frmGeodataNavigation.vb
2017-04-03 13:01:57 +02:00

413 lines
16 KiB
VB.net

Imports DevExpress.XtraMap
Imports DevExpress.XtraEditors
Imports DevExpress.XtraGrid
Imports DevExpress.Map
Imports DevExpress.Utils
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraEditors.Repository
Public Class frmGeodataNavigation
Private BING_KEY As String = "hQUTlqLLK70bETnonpfi~0jx1pIAq1yQ7gXqbIyzKrg~Au-Tewbty8afAxdbNilSv4JlU7qwU-fQKu0ouH9e1uJmpIyVdA3jugVEWMdy1Rbt"
Private EntityId As Integer = Nothing
Private EntitySql As String = Nothing
Private EntityDataTable As DataTable = Nothing
Private ConstructorMain_Grid As GridControl = Nothing
Private CurrentPoint As GeoPoint = Nothing
#Region "MAP CONTROL"
Private ReadOnly Property ImageLayer() As ImageTilesLayer
Get
Return CType(MapControl1.Layers("ImageLayer"), ImageTilesLayer)
End Get
End Property
Private ReadOnly Property VectorLayer() As VectorItemsLayer
Get
Return CType(MapControl1.Layers("VectorLayer"), VectorItemsLayer)
End Get
End Property
Private Function CreateItemList()
' Liste für PushPins anlegen
'Dim items As New List(Of MapPushpin)
Dim items As New List(Of MapCustomElementEx)
' Datensätze mit Lat,Lon Werten laden
Dim rows As DataRow() = EntityDataTable.Select("LATITUDE IS NOT NULL AND LONGITUDE IS NOT NULL")
' PushPins
For Each row As DataRow In rows
Dim lat As Double = row.Item("LATITUDE")
Dim lon As Double = row.Item("LONGITUDE")
Dim customElement = New MapCustomElementEx() With {
.Location = New GeoPoint(lat, lon),
.Text = row.Item("Record-ID").ToString(),
.Information = row.Item("Record-ID")
}
customElement.Image = New Bitmap(My.Resources.pushpin, New Size(30, 30))
customElement.Padding = New Padding(10, 5, 10, 5)
customElement.SelectedFill = Color.White
items.Add(customElement)
Next
Return items
End Function
Private Sub LoadItemList()
'Dim items As List(Of MapPushpin) = CreateItemList()
Dim items As List(Of MapCustomElementEx) = CreateItemList()
Dim storage As New MapItemStorage()
storage.Items.Clear()
storage.Items.AddRange(items.ToArray())
VectorLayer.Data = storage
tsLabelRecordCount.Text = String.Format("{0} Elemente mit Koordinaten gefunden", items.Count)
'MapControl1.ZoomToFitLayerItems()
End Sub
#End Region
Public Sub New(ByRef gridControl As GridControl, ByVal EntityId As Integer)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
Me.ConstructorMain_Grid = gridControl
'Me.EntityId = EntityId
'Me.EntitySql = String.Format("SELECT T.*, T1.LATITUDE, T1.LONGITUDE from VWPMO_ENTITY_TABLE{0} T,TBPMO_RECORD_GEODATA T1 WHERE T.[Record-ID] = T1.RECORD_ID", Me.EntityId)
End Sub
Private Sub frmGeodataNavigation_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Dim dataProvider As New BingMapDataProvider()
dataProvider.BingKey = BING_KEY
ImageLayer.DataProvider = dataProvider
Dim XMLPath = Get_Settings_Filename()
Dim layout As New ClassLayout(XMLPath)
Dim settings As New System.Collections.Generic.List(Of ClassSetting)
settings = layout.Load()
Dim centerX, centerY As Double
For Each setting In settings
Select Case setting._name
Case "MapControl_ZoomLevel"
MapControl1.ZoomLevel = Double.Parse(setting._value)
Case "MapControl_CenterX"
centerX = Double.Parse(setting._value)
Case "MapControl_CenterY"
centerY = Double.Parse(setting._value)
End Select
Next
Dim center As New GeoPoint(centerY, centerX)
MapControl1.SetCenterPoint(center, False)
EntitySql = Get_Grid_Sql(CURRENT_CONSTRUCTOR_ID, CURRENT_ENTITY_ID, CURRENT_CONSTRUCTOR_DETAIL_ID, frmConstructor_Main.GridType.Grid, USER_GUID, String.Empty, False, 1, 0, GridControlGeo, grvwMain, True)
LoadData()
Catch ex As Exception
MsgBox("Error while loading GeoData: " & vbNewLine & ex.Message)
End Try
End Sub
Private Sub frmGeodataNavigation_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Try
Dim gridView As Views.Grid.GridView = Me.ConstructorMain_Grid.FocusedView
gridView.ActiveFilterString = Nothing
Dim zoomLevel = MapControl1.ZoomLevel
Dim xCoord = MapControl1.CenterPoint.GetX
Dim yCoord = MapControl1.CenterPoint.GetY
Dim XMLPath = Get_Settings_Filename()
Dim layout As New ClassLayout(XMLPath)
Dim settings As New System.Collections.Generic.List(Of ClassSetting)
settings.Add(New ClassSetting("MapControl_ZoomLevel", zoomLevel))
settings.Add(New ClassSetting("MapControl_CenterX", xCoord))
settings.Add(New ClassSetting("MapControl_CenterY", yCoord))
layout.Save(settings)
Catch ex As Exception
MsgBox("Error in frmGeodataNavigation_FormClosing: " & vbNewLine & ex.Message)
End Try
End Sub
Private Function Get_Settings_Filename()
Dim Filename As String = String.Format("{0}-Geodata-Layout.xml", CURRENT_CONSTRUCTOR_ID)
Return System.IO.Path.Combine(Application.UserAppDataPath(), Filename)
End Function
Private Sub LoadData()
Dim rowhandle As Integer = grvwMain.FocusedRowHandle
EntityDataTable = ClassDatabase.Return_Datatable(EntitySql)
LoadItemList()
LoadGridData()
grvwMain.FocusedRowHandle = rowhandle
End Sub
Private Sub LoadGridData()
If IsNothing(EntityDataTable) Then
Exit Sub
End If
Dim gridFormatter As New ClassGridFormatter.ConstructorView(EntityDataTable, CURRENT_ENTITY_ID)
Dim DT_RESULT As DataTable = gridFormatter.FormatDatatable()
GridControlGeo.DataSource = DT_RESULT
gridFormatter.FormatGridView(grvwMain)
'Dim listcheck As List(Of String) = ClassHelper.Return_listcheck(CURRENT_ENTITY_ID)
'Dim listdate As List(Of String) = ClassHelper.Return_listdate(CURRENT_ENTITY_ID)
'Dim CheckBoxEditorForDisplay = New RepositoryItemCheckEdit()
'CheckBoxEditorForDisplay.ValueChecked = 1
'CheckBoxEditorForDisplay.ValueUnchecked = 0
'GridControlGeo.RepositoryItems.Add(CheckBoxEditorForDisplay)
'' Alle Checkbox Spalten durchgehen und CheckBoxEditor zuweisen
'For Each col As String In listcheck
' If Not IsNothing(grvwMain.Columns(col)) Then
' grvwMain.Columns(col).ColumnEdit = CheckBoxEditorForDisplay
' End If
'Next
'For Each col As String In listdate
' Dim date_edit As New DevExpress.XtraEditors.Repository.RepositoryItemTimeEdit
' Dim date_column As GridColumn = grvwMain.Columns(col)
' date_column.DisplayFormat.FormatType = FormatType.DateTime
' date_column.DisplayFormat.FormatString = CURRENT_DATE_FORMAT
' date_column.OptionsFilter.FilterPopupMode = FilterPopupMode.Date
' date_column.ColumnEdit = date_edit
' date_column.FilterMode = ColumnFilterMode.Value ' was DisplayText
' date_edit.DisplayFormat.FormatType = FormatType.DateTime
' date_edit.DisplayFormat.FormatString = CURRENT_DATE_FORMAT
' date_edit.Mask.MaskType = Mask.MaskType.DateTime
' date_edit.Mask.EditMask = CURRENT_DATE_FORMAT
' date_edit.Mask.UseMaskAsDisplayFormat = True
'Next
' Styles for GridControl
grvwMain.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.None
grvwMain.OptionsBehavior.Editable = False
grvwMain.OptionsSelection.EnableAppearanceFocusedCell = False
grvwMain.OptionsSelection.EnableAppearanceFocusedRow = False
grvwMain.OptionsSelection.EnableAppearanceHideSelection = False
grvwMain.Columns("AddedWhen").DisplayFormat.FormatType = FormatType.DateTime
grvwMain.Columns("AddedWhen").DisplayFormat.FormatString = CURRENT_DATE_FORMAT & " HH:MM:ss"
grvwMain.Columns("ChangedWhen").DisplayFormat.FormatType = FormatType.DateTime
grvwMain.Columns("ChangedWhen").DisplayFormat.FormatString = CURRENT_DATE_FORMAT & " HH:MM:ss"
grvwMain.Columns("Record-ID").Visible = False
grvwMain.Columns("Form-ID").Visible = False
grvwMain.Columns("ROW_COLOR").Visible = False
End Sub
Private Sub SetGridFilter(records As List(Of Integer))
Try
Dim filter As New List(Of String)
For Each id As Integer In records
filter.Add(String.Format("[Record-Id] = {0}", id))
Next
Dim gridView As Views.Grid.GridView = Me.ConstructorMain_Grid.FocusedView
gridView.ActiveFilterString = String.Join(" OR ", filter.ToArray())
Catch ex As Exception
MsgBox("Error in SetGridFilter: " & vbNewLine & ex.Message)
End Try
End Sub
Private Sub MapControl1_SelectionChanged(sender As Object, e As MapSelectionChangedEventArgs) Handles MapControl1.SelectionChanged
Dim items As List(Of Object) = e.Selection
Dim records As New List(Of Integer)
For Each item As Object In items
Try
'Dim pin As MapPushpin = CType(item, MapPushpin)
'Dim recordId As Integer = pin.Information
Dim el As MapCustomElementEx = CType(item, MapCustomElementEx)
Dim recordId As Integer = el.Information
records.Add(recordId)
Catch ex As Exception
MsgBox("Cannot convert selection to MapCustomElementEx")
End Try
Next
SetGridFilter(records)
End Sub
Class MapCustomElementEx
Inherits MapCustomElement
Public Property Information As Object
End Class
Private Sub XtraTabControl1_TabIndexChanged(sender As Object, e As EventArgs) Handles XtraTabControl1.TabIndexChanged
End Sub
Private Sub grvwMain_RowStyle(sender As Object, e As Views.Grid.RowStyleEventArgs) Handles grvwMain.RowStyle
If e.RowHandle = DevExpress.XtraGrid.GridControl.AutoFilterRowHandle Then
e.Appearance.BackColor = Color.Orange 'LemonChiffon
End If
If e.RowHandle > 0 Then
Dim row As DataRowView = grvwMain.GetRow(e.RowHandle)
Dim LATITUDE = row.Item("LATITUDE")
Dim LONGITUDE = row.Item("LONGITUDE")
If IsDBNull(LATITUDE) Or IsDBNull(LONGITUDE) Then
e.Appearance.BackColor = Color.Red
e.HighPriority = True
End If
End If
End Sub
Private Sub grvwMain_FocusedRowChanged(sender As Object, e As Views.Base.FocusedRowChangedEventArgs) Handles grvwMain.FocusedRowChanged
Dim currentRow As DataRowView = grvwMain.GetFocusedRow()
Dim lat, lon As Decimal
If currentRow Is Nothing Then
Exit Sub
End If
If currentRow IsNot Nothing AndAlso Not IsDBNull(currentRow.Item("LATITUDE")) And Not IsDBNull(currentRow.Item("LONGITUDE")) Then
Dim validLat As Boolean = Decimal.TryParse(currentRow.Item("LATITUDE"), lat)
Dim validLon As Boolean = Decimal.TryParse(currentRow.Item("LONGITUDE"), lon)
If validLat And validLon Then
txtLat.Text = lat
txtLon.Text = lon
Else
txtLat.Text = String.Empty
txtLon.Text = String.Empty
End If
Else
txtLat.Text = String.Empty
txtLon.Text = String.Empty
End If
End Sub
Private Sub btnOpenMap_Click(sender As Object, e As EventArgs) Handles btnOpenMap.Click
Dim point As GeoPoint = GetCurrentPoint()
Dim frm As New frmGeodataSelect(point)
Dim result = frm.ShowDialog()
If result = System.Windows.Forms.DialogResult.OK Then
Dim SelectedPoint As GeoPoint = frm.SelectedPoint
txtLat.Text = SelectedPoint.Latitude
txtLon.Text = SelectedPoint.Longitude
SaveCurrentPoint()
End If
End Sub
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
SaveCurrentPoint()
End Sub
Private Sub SaveCurrentPoint()
Dim point As GeoPoint = GetCurrentPoint()
If point Is Nothing Then
' TODO: Add Error Mesg
Exit Sub
End If
Try
Dim currentRow As DataRowView = grvwMain.GetFocusedRow()
Dim RecordId As Integer = currentRow.Item("Record-ID")
Dim geoDataExists As Boolean = ClassDatabase.Execute_Scalar("SELECT RECORD_ID FROM TBPMO_RECORD_GEODATA WHERE RECORD_ID = " & RecordId)
If geoDataExists Then
Dim SQL As String = "UPDATE TBPMO_RECORD_GEODATA SET LATITUDE = @lat, LONGITUDE = @lon, CHANGED_WHO = @who WHERE RECORD_ID = @recordid"
Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(MyConnectionString)
Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(SQL, conn)
cmd.Parameters.Add("@lat", SqlDbType.Decimal).Value = point.Latitude
cmd.Parameters.Add("@lon", SqlDbType.Decimal).Value = point.Longitude
cmd.Parameters.Add("@who", SqlDbType.VarChar).Value = Environment.UserName
cmd.Parameters.Add("@recordid", SqlDbType.Int).Value = RecordId
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
Else
Dim SQL As String = "INSERT INTO TBPMO_RECORD_GEODATA (LATITUDE,LONGITUDE,ADDED_WHO,RECORD_ID) VALUES (@lat,@lon,'@who',@recordid)"
Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(MyConnectionString)
Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(SQL, conn)
cmd.Parameters.Add("@lat", SqlDbType.Decimal).Value = point.Latitude
cmd.Parameters.Add("@lon", SqlDbType.Decimal).Value = point.Longitude
cmd.Parameters.Add("@who", SqlDbType.VarChar).Value = Environment.UserName
cmd.Parameters.Add("@recordid", SqlDbType.Int).Value = RecordId
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
End If
LoadData()
Catch ex As Exception
MsgBox("Error while saving Coordinates: " & vbNewLine & ex.Message)
End Try
End Sub
Private Function GetCurrentPoint() As GeoPoint
Dim lat, lon As Decimal
Dim validLat As Boolean = Decimal.TryParse(txtLat.Text, lat)
Dim validLon As Boolean = Decimal.TryParse(txtLon.Text, lon)
If validLat And validLon Then
Return New GeoPoint(lat, lon)
Else
Return Nothing
End If
End Function
Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles btnReload.Click
LoadData()
End Sub
Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
Try
Dim result As DialogResult = MessageBox.Show("Wollen Sie die Koordinaten für diesen Datensatz löschen?", "Koordinaten löschen", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If result = System.Windows.Forms.DialogResult.Yes Then
Dim currentRow As DataRowView = grvwMain.GetFocusedRow()
Dim RecordId As Integer = currentRow.Item("Record-ID")
Dim sql = "DELETE FROM TBPMO_RECORD_GEODATA WHERE RECORD_ID = " & RecordId
ClassDatabase.Execute_Scalar(sql)
LoadData()
End If
Catch ex As Exception
MsgBox("Error while deleting Coordinates:" & vbNewLine & ex.Message)
End Try
End Sub
End Class