2009-10-19 6 views
3

J'essaie de récupérer des données d'une Gridview que j'ai créée en XAML.Récupère les données de la ligne sélectionnée dans Gridview en C#, WPF

<ListView Name="chartListView" selectionChanged="chartListView_SelectionChanged"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="250"/> 
     <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}" Width="60"/> 
     <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="100"/> 
    </GridView> 
    </ListView.View> 
</ListView> 

J'ai vu un code comme ceci: -

GridViewRow row = GridView1.SelectedRow; 
TextBox2.Text = row.Cells[2].Text; 

Mais mon problème est que mon GridView est créé en XAML, et n'est pas nommé, à savoir que je ne peux pas (ou ne savent pas comment) crée une référence à 'gridview1', et ne peut donc pas accéder aux objets qui s'y trouvent. Puis-je nommer ou créer une référence à ma grille à partir de C# ou de XAML afin de pouvoir utiliser le code ci-dessus?

Deuxièmement, puis-je accéder ensuite les éléments du tableau par son nom au lieu de l'indice, quelque chose comme: -

TextBox2.Text = row.Cells["ID"].Text 

Merci pour toute aide.

Répondre

1

Oui, vous pouvez nommer votre gridview:

<GridView x:Name="chartGridView"> 
    ... 
</GridView> 

Assurez-vous que ce qui suit est inclus dans la définition de la fenêtre:

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

Cela vous permettra de faire référence à partir de votre code C#.

+0

désolé, c'était la première chose que j'ai essayé. VS dit: la propriété "Nom" n'a pas été trouvée dans le type GridView – Will

+0

Cela le rend visible dans le code derrière. Y at-il un moyen de le rendre visible à partir d'un modèle de vue? – Jeff

+0

@Jeff - Vous ne devriez pas mélanger votre vue et voir le modèle comme ça. – ChrisF

1

Vous faites quelque chose d'horriblement mal. Vous ne devriez pas essayer de lire des données à partir de cellules de la grille, mais directement à partir de vos objets métier. Et vous devriez éviter le code de procédure lorsqu'une solution pure XAML existe:

<TextBox x:Name="TextBox2" Text={Binding SelectedItem.ID, ElementName=chartListView}"/> 

WPF n'est pas destiné à être utilisé comme vous essayez de. Donc lire des cellules individuelles est un hack sale. Cela dit, il se passe quelque chose comme ceci:

string UglyHack(string name) 
{ 
    var columns = (chartListView.View as GridView).Columns; 
    int index = -1; 
    for (int i = 0; i < columns.Count; ++i) 
    { 
     if ((columns[i].Header as TextBlock).Text == name) 
     { 
      index = i; 
      break; 
     } 
    } 
    DependencyObject j = SelectedListView.ItemContainerGenerator.ContainerFromIndex(SelectedListView.SelectedIndex); 
    while (!(j is GridViewRowPresenter)) j = VisualTreeHelper.GetChild(j, 0); 
    return (VisualTreeHelper.GetChild(j, index) as TextBlock).Text; 
} 
Questions connexes