2017-01-30 1 views
1

Ich könnte dies in die falsche Richtung gehen, aber ich bin mir nicht sicher. Ich habe eine Suchleiste, dass ein Benutzer eine Adresse eingeben kann. Dann wird die Anfrage an die API von Google gesendet und die Adressen, die der eingegebenen Adresse entsprechen, werden in meiner RadGridView angezeigt. Ich habe die Adresse in Ordnung.Zugriff auf Zeilenwerte von RadGridView in C#

Jetzt möchte ich die lat und lng Werte der Adressen nehmen und sie auf meiner Karte finden. Das Problem, das ich habe, ist, dass ich nicht auf die Zeilenwerte in meinem RadGridView zugreifen kann, wenn ich die Adresse auswähle. Ich habe eine Methode erstellt, die aufgerufen wird, wenn ein Benutzer eine Adresse auswählt, aber das grid.SelectedItem gibt null zurück.

Ich könnte dies in die falsche Richtung gehen. Irgendwelche Ideen?

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> 

Antwort

0

Sie könnten den Absender Argument der Ereignisbehandlungsroutine zu einem Border gegossen und dann das aktuelle Datenobjekt zugreifen seine Datacontext-Eigenschaft mit:

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)) 
    { 
     //... 
    } 
} 
Verwandte Themen