I think I've gotten close to getting this working but the function to read in the table stored in the .txt file can not read the table. I am probably using the wrong method, I'm using a FileSystemDatastore.OpenDataset(Of Table)(...).
Below is a sample of the list of layers .txt (organized like a .csv):
LayerName,Path
Annotation Text,DRIVE:\FileLocation\LayerFiles\ANNOTATION TEXT.lyr
-----Land & Property (Choose from items below)-----,NOTHING...
Below is a sample of the first read in of the table/.txt:
Public Async Sub UpdateCombo()
Dim WorkspaceF As FileSystemDatastore
Dim FileConnection As FileSystemConnectionPath
Dim Table As Table
Dim Cur As RowCursor
Dim Row As RowDim GDBLocation As Uri
GDBLocation = New Uri("DRIVE:\FileLocation\LayerFiles\")Try
Await QueuedTask.Run(Sub()
If Not File.Exists(FILE_NAME) Then
MsgBox("File Does Not Exist")End If
FileConnection = New FileSystemConnectionPath(GDBLocation, FileSystemDatastoreType.Shapefile)
WorkspaceF = New FileSystemDatastore(FileConnection)
Table = WorkspaceF.OpenDataset(Of Table)("coa_LAYERS_list.txt")
MsgBox(Table.GetCount)
Cur = Table.Search(Nothing, False)
Cur.MoveNext()
Row = Cur.Current
Do Until Row Is NothingAdd(New ComboBoxItem(Row.Item(0).ToString))
Cur.MoveNext()
Row = Cur.Current
LoopTable = Nothing
Row = Nothing
WorkspaceF = Nothing
FileConnection = Nothing
Cur = Nothing
GC.Collect()
End Sub)
I do use " (QF.WhereClause = "LayerName = '" & Value & "'") " later but for now I'm just trying to figure out why the table is not being read.
Hi,
Seeing you're reading just a .txt file - I would recommend using standard .NET read/write classes/methods to open your file rather than the FileSystemConnectionPath object.
This link has a code snippet which seems to suit your situation - opening a text file and reading lines.
Thanks
Narelle
A bit late on the response but Exams in college got the better of me. I was trying to avoid that since my focus for this project was to learn more about the add-in API. That being said, I went ahead and swapped to using the basic library (visual basic), and just used a delimited line reader, worked great.
Now I can not for the life of me figure out why it won't add the layer. I have the "OnSelectionChange" method overwritten with
Protected Overridable Overloads Sub OnSelectionChange(layerName As ComboBoxItem)
If (layerName.ToString = "") Then
MsgBox("Could not read layer name" + layerName.ToString)
Return
End If
MsgBox("getting layer file " + layerName.ToString)
GetLayerFile(layerName.ToString)
MyBase.OnSelectionChange(layerName)
End Sub
However neither msg box appears, and then GetLayerFile is
Public Sub GetLayerFile(ByVal layerName As String)
Dim activeView As MapView
activeView = MapView.Active
If Not File.Exists(FILE_NAME) Then
MsgBox("File Does Not Exist")
Return
End If
Using lineReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(FILE_NAME)
lineReader.TextFieldType = FileIO.FieldType.Delimited
lineReader.SetDelimiters(",")
Dim lineFields As String()
While Not lineReader.EndOfData
Try
lineFields = lineReader.ReadFields()
If (lineFields(0) = layerName) Then
AddLayerToActiveView(activeView, lineFields(1))
MsgBox(lineFields(1))
Return
End If
MsgBox("Could not find layer")
Catch ex As Exception
' Let the user know what went wrong.
MsgBox("The Layer Path Cannot be read: Line " & ex.Message & "is not valid and will be skipped.")
Return
End Try
End While
End Using
End Sub
I don't know if there's anything blaringly obvious, this is the AddLayerToActiveView method
Public Async Sub AddLayerToActiveView(ByVal activeView As MapView, ByVal layerPathFile As System.String)
Dim Path As Uri
Path = New Uri(layerPathFile)
Try
Await QueuedTask.Run(Sub()
LayerFactory.Instance.CreateLayer(Path, MapView.Active.Map)
End Sub)
Catch e As Exception
' Let the user know what went wrong.
MsgBox("The Layer Path Cannot be read: code2")
MsgBox(e.Message)
End Try
Hi,
Can you change the definition of your OnSelectionChange function to the following and see if that helps with the method firing when a choice is made in the combobox.
Protected Overrides Sub OnSelectionChange(layerName As ComboBoxItem)
(so it is Overrides not Overridable Overloads)
Narelle
I think that did it, now I just have to sort out my string comparison to identify the layers to add! Hopefully I'm good from here. Thank you, Narelle, for all the help.
I think I see why that was an issue, overridable overloads basically means that the method I wrote could be overridden and is just another overload for "onSelectionChange" so might not even be called since the program would just do a standard call not the overloaded version.