Hi everyone,
In my application, spatial query task will perform on multiple layers (for example 6 layers) in one map service. So I want to define a 2D string array with row representing layer name and column representing hit result.
If the first query task performed on layer1 returns a no_null result and the second query task performed on layer2 returns null result, the first row in this 2D array would be like this:
Wetland Resource found.
River Resource not found.
Then I want to use a datagrid to display the results. So can I bind this 2D array to the datagrid? Thank you:)
IDictionary<string, string> y = new Dictionary<string, string>();
y.Add(new KeyValuePair<string, string>("Wetland", "Resource found."));
y.Add(new KeyValuePair<string, string>("River", "Resource not found."));
this.testGrid.ItemsSource = y;
<slData:DataGrid x:Name="WirtReportDataGrid" Width="Auto" AutoGenerateColumns="False" HeadersVisibility="Column" Background="White" IsReadOnly="False" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto" Grid.Row="1" CanUserSortColumns="True"> <slData:DataGrid.Columns> <slData:DataGridTextColumn Header="Critical Resource"/> <slData:DataGridTextColumn Header="Resource in Vicinity of Project Polygon"/> </slData:DataGrid.Columns> </slData:DataGrid>
private void WirtQueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
{
FeatureSet featureSet = args.FeatureSet;
string url ="";
if (wirtMapLayer.Count != 0)
url = wirtMapLayer.Peek();
if (featureSet == null || featureSet.Features.Count < 1)
{
wirtReport.Add(new KeyValuePair<string, string>(url, "NO RESOURCE FOUND"));
}
else if (featureSet != null && featureSet.Features.Count > 0)
{
wirtReport.Add(new KeyValuePair<string, string>(url, "FOUND"));
}
wirtReportPage.WirtReportDataGrid.ItemsSource = wirtReport;
}
Hey Doc,
Thank you for the prompt reply. I have such datagrid in the xaml:
<slData:DataGrid x:Name="WirtReportDataGrid" Width="Auto" AutoGenerateColumns="False" HeadersVisibility="Column" Background="White" IsReadOnly="False" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto" Grid.Row="1" CanUserSortColumns="True"> <slData:DataGrid.Columns> <slData:DataGridTextColumn Header="Critical Resource"/> <slData:DataGridTextColumn Header="Resource in Vicinity of Project Polygon"/> </slData:DataGrid.Columns> </slData:DataGrid>
'Critical Resource' refers to the layer's name, like wetland, river.
'Resource in Vicinity of Project Polygon' refers to 'found' or 'not found'.
I wrote below in cs file and it doesn't return any results in the datagrid.
private void WirtQueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args) { FeatureSet featureSet = args.FeatureSet; string url =""; if (wirtMapLayer.Count != 0) url = wirtMapLayer.Peek(); if (featureSet == null || featureSet.Features.Count < 1) { wirtReport.Add(new KeyValuePair<string, string>(url, "NO RESOURCE FOUND")); } else if (featureSet != null && featureSet.Features.Count > 0) { wirtReport.Add(new KeyValuePair<string, string>(url, "FOUND")); } wirtReportPage.WirtReportDataGrid.ItemsSource = wirtReport; }
So If I use your method, do I need to also set any binding on the columns in xaml?
<slData:DataGrid x:Name="WirtReportDataGrid" Width="Auto" AutoGenerateColumns="False" HeadersVisibility="Column" Background="White"
IsReadOnly="False" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto" Grid.Row="1"
CanUserSortColumns="True">
<slData:DataGrid.Columns>
<slData:DataGridTextColumn Header="Critical Resource"/>
<slData:DataGridTextColumn Header="Resource in Vicinity of Project Polygon"/>
</slData:DataGrid.Columns>
</slData:DataGrid>
Hey Doc,
Thank you for the prompt reply. I have such datagrid in the xaml:
<slData:DataGrid x:Name="WirtReportDataGrid" Width="Auto" AutoGenerateColumns="False" HeadersVisibility="Column" Background="White" IsReadOnly="False" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto" Grid.Row="1" CanUserSortColumns="True"> <slData:DataGrid.Columns> <slData:DataGridTextColumn Header="Critical Resource" Binding="{Binding Key}"/> <slData:DataGridTextColumn Header="Resource in Vicinity of Project Polygon" Binding="{Binding Value}"/> </slData:DataGrid.Columns> </slData:DataGrid>
'Critical Resource' refers to the layer's name, like wetland, river.
'Resource in Vicinity of Project Polygon' refers to 'found' or 'not found'.
I wrote below in cs file and it doesn't return any results in the datagrid.
private void WirtQueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args) { FeatureSet featureSet = args.FeatureSet; string url =""; if (wirtMapLayer.Count != 0) url = wirtMapLayer.Peek(); if (featureSet == null || featureSet.Features.Count < 1) { wirtReport.Add(new KeyValuePair<string, string>(url, "NO RESOURCE FOUND")); } else if (featureSet != null && featureSet.Features.Count > 0) { wirtReport.Add(new KeyValuePair<string, string>(url, "FOUND")); } wirtReportPage.WirtReportDataGrid.ItemsSource = wirtReport; }
So If I use your method, do I need to also set any binding on the columns in xaml?
Try as highlighted in red... it worked for me
<slData:DataGridTextColumn Header="Resource within Buffer"/> <slData:DataGridTextColumn Header="Notes"/>
wirtReport.Add(new KeyValuePair<string, string>(url, "RESOURCE FOUND"));
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
IDictionary<string, object> y = new Dictionary<string, object>();
y.Add("URL1", new {
Prop1 = "A1",
Prop2 = "A2",
Prop3 = "A3"
});
y.Add("URL2", new {
Prop1 = "B1",
Prop2 = "B2",
Prop3 = "B3"
});
y.Add("URL3", new {
Prop1 = "C1",
Prop2 = "C2",
Prop3 = "C3"
});
this.testGrid.ItemsSource = y;
}
}<sdk:DataGrid AutoGenerateColumns="False"
Height="128"
HorizontalAlignment="Left"
Margin="18,43,0,0"
Name="testGrid"
VerticalAlignment="Top"
Width="370">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="Critical Resource"
Binding="{Binding Key}" />
<sdk:DataGridTextColumn Header="Resource in Vicinity of Project Polygon"
Binding="{Binding Value.Prop1}" />
<sdk:DataGridTextColumn Header="Resource within Buffer"
Binding="{Binding Value.Prop2}" />
<sdk:DataGridTextColumn Header="Notes"
Binding="{Binding Value.Prop3}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
IDictionary<string, object> wirtReport = new Dictionary<string, object>();
wirtReport.Clear();
for (int i = 0; i < wirtlayerlist.Count; i++)
{
if (wirtlayerlist.ElementAt(i) == 18)
wirtReport.Add(wirtResult[0, 0], new { Prop1 = wirtResult[0, 1], Prop2 = wirtResult[0, 2], Prop3 = wirtResult[0, 3] });
else if (wirtlayerlist.ElementAt(i) == 21)
wirtReport.Add(wirtResult[1, 0], new { Prop1 = wirtResult[1, 1], Prop2 = wirtResult[1, 2], Prop3 = wirtResult[1, 3] });
else if (wirtlayerlist.ElementAt(i) == 20)
wirtReport.Add(wirtResult[2, 0], new { Prop1 = wirtResult[2, 1], Prop2 = wirtResult[2, 2], Prop3 = wirtResult[2, 3] });
else if (wirtlayerlist.ElementAt(i) == 23)
wirtReport.Add(wirtResult[3, 0], new { Prop1 = wirtResult[3, 1], Prop2 = wirtResult[3, 2], Prop3 = wirtResult[3, 3] });
else if (wirtlayerlist.ElementAt(i) == 16)
wirtReport.Add(wirtResult[4, 0], new { Prop1 = wirtResult[4, 1], Prop2 = wirtResult[4, 2], Prop3 = wirtResult[4, 3] });
else if (wirtlayerlist.ElementAt(i) == 14)
wirtReport.Add(wirtResult[5, 0], new { Prop1 = wirtResult[5, 1], Prop2 = wirtResult[5, 2], Prop3 = wirtResult[5, 3] });
}
wirtReportPage.WirtReportDataGrid.ItemsSource = wirtReport;
wirtReportPage.ParentLayoutRoot = InfoStackPanel;
wirtReportPage.thisPass(this);
wirtReportPage.Show();