2010-10-01 5 views
4

Comment puis-je déterminer SelectedCellValue Dans DataGrid? (WPF)Comment déterminer la valeur de la cellule sélectionnée dans DataGrid? (WPF)

Mon DataGrid a 9 coloums et 5 lignes et je veux savoir la Value de la ligne cliqué sur [0] 's Value.

J'ai utilisé ce code dans Windows Form:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    var a = dataGridView1[e.ColumnIndex, e.RowIndex].Value; 
} 

, mais je ne sais pas un code équivalent en WPF.

Répondre

3

Vous devez utiliser l'événement DataGrid_SelectedCellsChanged.

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 
     foreach (var item in e.AddedCells) 
     { 
      var col = item.Column as DataGridColumn; 
      var fc = col.GetCellContent(item.Item); 

      if (fc is CheckBox) 
      { 
       Debug.WriteLine("Values" + (fc as CheckBox).IsChecked); 
      } 
      else if(fc is TextBlock) 
      { 
       Debug.WriteLine("Values" + (fc as TextBlock).Text); 
      } 
      //// Like this for all available types of cells 
     } 
    } 

HTH

+0

THX beaucoup Avatar.je veux juste la valeur de datagrid [selectedrow] [première colomn]! Je veux dire que si je clique sur [3ème ligne , 5ème col] ça me donne [3ème rangée, premier col] – Shane

3

La détermination de la valeur d'une cellule sélectionnée est plus une chose WinForms. WPF est conçu pour fonctionner différemment; votre interface utilisateur est destinée à être séparée de la logique. Le DataGrid devient ainsi un instrument de présentation, pas quelque chose à piquer et à pousser pour des valeurs. Au lieu de cela, avec WPF, vous voulez traiter les objets que vous avez liés à la grille, indépendamment de la façon dont ils sont affichés. Oubliez la grille - trouvez simplement l'objet actuellement "sélectionné" par l'utilisateur dans une liste d'objets liés.

Le SelectedItem est une propriété sur la grille elle-même et grâce à des mécanismes de liaison supérieurs de WPF, vous pouvez lier cette valeur à une propriété sur un ViewModel via XAML:

ItemsSource="{Binding Orders, Mode=OneWay}" 
SelectedItem="{Binding SelectedOrder, Mode=TwoWay}" 

Lorsque l'utilisateur sélectionne un élément dans la Dans la grille, la liaison bidirectionnelle met à jour la propriété SelectedItem sur le ViewModel avec la valeur de cet objet dans cette ligne. De cette façon, vous n'avez même pas à faire face à la connaissance de la grille ou de l'interface utilisateur.

J'espère que cela a du sens. Je sais que c'est une approche différente et une façon différente de penser venant de WinForms.

+0

Celui-ci est une excellente solution :) –

+0

Je ne sais rien à propos de la liaison de données :( – Shane

0
private void dataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 
     var item = e.AddedCells[0]; 
     { 
      var col = item.Column as DataGridColumn; 
      var fc = col.GetCellContent(item.Item); 

      if (fc is CheckBox) 
      { 

      } 
      else if (fc is TextBlock && col.DisplayIndex == 0) 
      { 
       textBlock1.Text = (fc as TextBlock).Text; 
      } 

     } 
    } 
0

contraignant parfois à SelectedItem ne fonctionne pas (selon la façon dont votre modèle fou doit être. Je dois transposer le modèle, donc tout est à l'envers par défaut vers le bas et la normale n » t travailler tout le temps étant donné que, dans
dataGrid vous selectedCellChanged pouvez accéder à l'objet lié par:.

supposant de l'exemple précédent des ordres [] où chaque décret aura un tableau de Suborders

foreach (var selectedCell in e.AddedCells)  
{ 
    var order = (Order)selectedCell.Item; 
    var subOrder = order.SubOrders[selectedCell.Column.DisplayIndex-1]; 

    var someValue = subOrder.Value; 

}

Questions connexes