2017-01-30 1 views
1

Je pourrais aller à ce sujet dans le mauvais sens, mais je ne suis pas sûr. J'ai une barre de recherche qu'un utilisateur peut entrer une adresse. Ensuite, la demande est envoyée à l'API de Google et l'ensemble des adresses correspondant à l'adresse entrée sera affiché dans mon RadGridView. J'ai l'adresse montrant bien.Valeurs de ligne d'accès de RadGridView en C#

Maintenant, je veux prendre les valeurs lat et lng des adresses et les trouver sur ma carte. Le problème que je suis est que je suis incapable d'accéder aux valeurs de ligne dans mon RadGridView lors de la sélection de l'adresse. J'ai créé une méthode qui est atteinte lorsqu'un utilisateur sélectionne une adresse, mais le grid.SelectedItem renvoie null.

Je pourrais aller à ce sujet dans le mauvais sens. Des idées?

xaml.cs

private void SearchTB_KeyDown(object sender, KeyEventArgs e) 
{ 
searchclose.Opacity = 1; 
    if (e.Key == Key.Enter) 
    { 
     var address = SearchTB.Text; 

    var requestUri = string.Format("http://localhost/media/TextToSpeech/TextToSpeechService.svc/getDataProxy?url=https://maps.googleapis.com/maps/api/geocode/json?address={0}&key=AIzaSyCgsNpuUoH7m6U7lqeZjlLZ3MgM15PW15o", Uri.EscapeDataString(address)); 

     HttpWebRequest request = WebRequest.Create(requestUri) as HttpWebRequest; 
     request.Method = "GET"; 
     IAsyncResult result = request.BeginGetResponse(new AsyncCallback(RequestCompleted), request); 
    } 
} 

private void RequestCompleted(IAsyncResult result) 
{ 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = (HttpWebResponse)request.EndGetResponse(result); 
    Stream stream = response.GetResponseStream(); 

    try 
    { 
     StreamReader reader = new StreamReader(stream); 
     string text = reader.ReadToEnd(); 

     Regex rgx = new Regex("<.*\\>"); 
     string newResult = rgx.Replace(text, ""); 

     JObject json = JObject.Parse(newResult); 
     JArray results = (JArray)json["results"]; 

     List<object> locationList = new List<object>(); 
     ObservableCollection<object> AddressList = new ObservableCollection<object>(); 

     if (results.Count == 0) 
     { 
      Dispatcher.BeginInvoke(new Action(() => MessageBox.Show("No results found"))); 
     } 
     else 
     { 
      foreach (JObject obj in results) 
      { 
       if (obj == null) 
       { 
        Dispatcher.BeginInvoke(new Action(() => MessageBox.Show("Address returned no results"))); 
       } 
       string formattedAddress = (string)obj["formatted_address"]; 
       AddressList.Add(formattedAddress); 

       object loc = (object)obj["geometry"]["location"]; 
       locationList.Add(loc); 
       //TODO Add exception handling 
      } 
      Dispatcher.BeginInvoke(new Action(() => addressGrid.ItemsSource = AddressList)); 
     } 

    } 
    catch (Exception ex) 
    { 
     Dispatcher.BeginInvoke(new Action(() => MessageBox.Show("Error" + ex.Message))); 
    } 

} 

    private void SelectedAddress_Click(object sender, RoutedEventArgs e) 
    { 
     object dodo = ""; 
     dodo = addressGrid.SelectedItem; 
    } 

XAML

<!--Address Results--> 
<telerik:RadGridView Grid.Row="2" AutoGenerateColumns="False" x:Name="addressGrid" Margin="18 0 0 18" CanUserFreezeColumns="False" CanUserSelect="True" 
     EnableColumnVirtualization="True" EnableRowVirtualization="True" ShowGroupPanel="False" ScrollViewer.VerticalScrollBarVisibility="Visible" 
     CanUserDeleteRows="False" RowIndicatorVisibility="Collapsed" DataLoadMode="Asynchronous" HeaderRowStyle="{StaticResource ZoneActivityHeaderRowStyle}" 
     GroupPanelStyle="{StaticResource GroupPanelStyle}" Background="#00000000" VerticalGridLinesBrush="#00000000" HorizontalGridLinesBrush="#00000000" AlternationCount="2" 
     RowHeight="32" ShowColumnHeaders="False" RowStyle="{StaticResource ActivityRowStyle}" AlternateRowStyle="{StaticResource ActivityAlternateRowStyle}"> 

    <telerik:RadGridView.Columns> 

     <telerik:GridViewDataColumn Header="Targetting" Width="35" IsReadOnly="True" IsFilterable="False" ShowDistinctFilters="True" IsGroupable="False" IsVisible="True"> 
      <telerik:GridViewDataColumn.CellTemplate> 
       <DataTemplate> 
        <ctrl:TargetButton x:Name="targetButton" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="Visible" /> 
       </DataTemplate> 
      </telerik:GridViewDataColumn.CellTemplate> 
     </telerik:GridViewDataColumn> 

     <telerik:GridViewDataColumn Header="Address" Width="*" IsReadOnly="True" 
       IsFilterable="False" ShowDistinctFilters="True" IsGroupable="False"> 
      <telerik:GridViewDataColumn.CellTemplate> 
       <DataTemplate> 
        <Grid> 
         <TextBlock Text="{Binding}" Foreground="White" FontFamily="Segoe UI" 
            FontSize="12" VerticalAlignment="Center" Margin="5" TextWrapping="Wrap" /> 
         <Border Background="#00000000" Height="40" Margin="-5 0" Cursor="Hand" MouseLeftButtonDown="SelectedAddress_Click" /> 
        </Grid> 
       </DataTemplate> 
      </telerik:GridViewDataColumn.CellTemplate> 
     </telerik:GridViewDataColumn> 

    </telerik:RadGridView.Columns> 
</telerik:RadGridView> 

Répondre

0

Vous pouvez jeter l'argument de l'expéditeur du gestionnaire d'événements à une frontière, puis accéder à l'objet de données en cours en utilisant sa propriété DataContext:

private void SelectedAddress_Click(object sender, RoutedEventArgs e) 
{ 
    Border border = sender as Border; 
    object dodo = border.DataContext; 
    string address = dodo as string; 
    if (!string.IsNullOrEmpty(address)) 
    { 
     //... 
    } 
}