2009-12-20 5 views
3

J'ai le code suivant où j'ai défini un contrôle DataGrid Toolkit WPF appelé dgQuery; J'ai rempli celui-ci avec des informations d'un ensemble de données, puis j'ai inséré une nouvelle colonne de cases à cocher dans dgQuery pour cocher/décocher certaines lignes, je montre une partie de mon code C#:Comment faire une boucle sur les lignes d'une boîte à outils WPF Datagrid

dgQuery.DataContext = dS.Tables[0]; 

DataGridTemplateColumn cbCol = new DataGridTemplateColumn(); 
cbCol.Header = "Opc"; 
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CheckBox)); 
Binding bind = new Binding("IsSelected"); 
bind.Mode = BindingMode.TwoWay; 
factory.SetValue(CheckBox.IsCheckedProperty, bind); 
DataTemplate cellTemplate = new DataTemplate(); 
cellTemplate.VisualTree = factory; 
cbCol.CellTemplate = cellTemplate; 
dgQuery.Columns.Insert(0, cbCol); 

Après vérification/décochant dans la nouvelle case à cocher colonne des lignes dgQuery Je clique sur un bouton pour enregistrer dans une base de données uniquement les lignes que j'ai cochées. La question est, comment puis-je développer la boucle pour lire toutes les lignes de dgQuery et la condition qui me permettra de savoir quelles lignes ont la case cochée/décochée? Aidez-moi avec un exemple, s'il vous plaît.

Merci!

Répondre

11

ce retourne une 'rangée' dans votre DataGrid

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid) 
    { 
     var itemsSource = grid.ItemsSource as IEnumerable; 
     if (null == itemsSource) yield return null; 
     foreach (var item in itemsSource) 
     { 
      var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow; 
      if (null != row) yield return row; 
     } 
    } 

dans WPF DataGrid, les lignes sont ItemSource.items ... pas propriété Rows!

Hope this helps ...

+1

Tnxs Tony! Laissez-moi vous demander comment je peux évaluer si la case à cocher que j'ai insérée est cochée/non cochée et en général, comment puis-je récupérer toutes les cellules de chaque DataGridRow? – Tristan

+1

Comment pouvons-nous obtenir l'index de la ligne en boucle pour chaque ligne – Gaurav123

1
var row = GetDataGridRows(dataGrid1); 
/// go through each row in the datagrid 
      foreach (Microsoft.Windows.Controls.DataGridRow r in row) 
      { 
       DataRowView rv = (DataRowView)r.Item; 

       // Get the state of what's in column 1 of the current row (in my case a string) 
       string t = rv.Row[1].ToString(); 


      } 
+0

Tony, merci encore. Une autre question s'il vous plaît, comment puis-je évaluer le contenu de la colonne "opc" où le checkBox est défini? Dans DataRowView, je ne peux voir que les colonnes de l'ensemble de données, pas la case à cocher. Cordialement. – Tristan

+0

Pourquoi n'essayez-vous pas la solution de MarkB pour accéder à votre checkbox dans votre DataGrid? –

+0

J'ai encore posé la question pour vous sur ce forum, parce que je ne pouvais pas trouver comment le faire moi-même, alors voici le fil avec une réponse: http://stackoverflow.com/questions/1936732/datagridtemplatecolumn-get- value-of-cell Utilisez la réponse que j'ai acceptée! Je ne l'ai pas essayé moi-même, mais on dirait que ça devrait marcher! Bonne chance! Faites-moi savoir ce qu'il s'est passé s'il vous plaît? –

1

Je ne sais pas si cela est utile, car elle suppose une approche différente de ce que vous avez commencé, mais plutôt que de travailler directement avec la grille, vous pouvez le lier à un ObservableCollection d'objets ayant des propriétés pour chaque colonne. Si vous ajoutez une propriété bool dans votre objet pour « sélectionné » et lier la colonne de case à cocher, vous pouvez interroger la collection à tout moment pour ce qui est actuellement sélectionné, comme ceci:

List<MemberEntity> selectedItems = 
      new List<MemberEntity>(from memberEntity in _memberEntities 
            where memberEntity.Selected == true 
            select memberEntity); 

     //now save selectedItems to the database... 

Alors MemberEntity est un classe qui a une propriété pour chacune des colonnes de votre grille, y compris un bool nommé Selected pour la colonne checkbox. _memberEntities est une ObservableCollection des instances MemberEntity. La propriété de grille ItemSource est liée à _memberEntities et chacune des propriétés de liaison de la colonne sont liés à une propriété MemberEntity comme celui-ci, en supposant que la sélection et le nom sont des propriétés dans MemberEntity:

<tk:DataGrid ItemsSource="{Binding _memberEntities}"> 
     <tk:DataGrid.Columns> 
      <tk:DataGridCheckBoxColumn Binding="{Binding Path=Selected}" /> 
      <tk:DataGridTextColumn Binding="{Binding Path=Name}" /> 
     </tk:DataGrid.Columns> 
</tk:DataGrid> 
+0

Mark, merci pour votre temps et votre aide. J'ai besoin de lire sur l'objet ObservableCollection avant de m'appliquer à ma situation. – Tristan

+0

Ça sonne bien Tristan. Le principal avantage de cette approche est la séparation de votre code de la présentation. Votre code se concentre donc sur une collection au lieu d'un contrôle d'interface utilisateur.Cela signifie que si vous modifiez le contrôle de l'interface utilisateur ultérieurement, votre code n'aura probablement pas à être modifié. En outre, le test unitaire est plus facile car vous pouvez configurer les éléments de sélection en manipulant la collection au lieu d'essayer de manipuler l'interface utilisateur. –

0
//Looping thought datagrid rows & loop though cells and alert cell values 

var row = GetDataGridRows(DataGrid_Standard); 
/// go through each row in the datagrid 
foreach (Microsoft.Windows.Controls.DataGridRow r in row) 
{ 
    DataRowView rv = (DataRowView)r.Item; 
    foreach (DataGridColumn column in DataGrid_Standard.Columns) 
    { 
     if (column.GetCellContent(r) is TextBlock) 
     { 
      TextBlock cellContent = column.GetCellContent(r) as TextBlock; 
      MessageBox.Show(cellContent.Text); 
     } 
     else if (column.GetCellContent(r) is CheckBox) 
     { 
      CheckBox chk = column.GetCellContent(r) as CheckBox; 
      MessageBox .Show (chk.IsChecked.ToString()); 
     }      
    } 
} 

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid) 
{ 
    var itemsSource = grid.ItemsSource as IEnumerable; 
    if (null == itemsSource) yield return null; 
    foreach (var item in itemsSource) 
    { 
     var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow; 
     if (null != row) yield return row; 
    } 
} 
Questions connexes