WPF itérer datagrid
utiliser le code C du FPF.NET4.5 utilisant visual studio 2012 ulti.
ancien code winforms:
foreach (DataGridViewRow paretoRow in ParetoGrid.Rows)
{
if ((Convert.ToInt32(paretoRow.Cells["CurrentPareto"].Value) < (Convert.ToInt32(paretoRow.Cells["NewPareto"].Value))))
{
paretoRow.Cells["pNew"].Value = downArrow
}
}
comme vous pouvez le voir à chaque ligne, je parcours un cycle et je vérifie une cellule spécifique, si elle est vraie, je peuplerai alors une autre cellule. C'était du bon vieux code winforms que j'ai utilisé plusieurs fois auparavant...cependant. Le passage à la WPF a été beaucoup plus différent que je l'avais supposé.
DataGrid
ne contient pas l' Row
propriété. Au lieu de cela, je pense que vous devez utilisation:
DataGridRow paretoRow in paretogrid.Items
mais je ne sais toujours pas qui aura la cellule.
donc ma question Est, y a-t-il des changements de syntaxe à effectuer, si oui, où? Ou alors que je commence à croire que les datagrids dans WPF fonctionnent avec des objets plus que des winforms donc n'ont pas besoin d'utiliser un propertie appelé "row", si c'est le cas, quelle logique/syntaxe devrais-je savoir utiliser dans cet exemple?
Merci pour votre patience les gars, pensez quand je rentre à la maison pour le jour férié je vais faire un peu de WPF creuser pour voir comment les différents qu'il est réellement.
5 réponses
je pense tout d'abord pensez que vous voulez faire est d'obtenir toutes les lignes de 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;
}
}
et puis itérer sur votre grille:
var rows = GetDataGridRows(nameofyordatagrid);
foreach (DataGridRow row in rows)
{
DataRowView rowView = (DataRowView)row.Item;
foreach (DataGridColumn column in nameofyordatagrid.Columns)
{
if (column.GetCellContent(row) is TextBlock)
{
TextBlock cellContent = column.GetCellContent(row) as TextBlock;
MessageBox.Show(cellContent.Text);
}
}
Les gens semblent exagérer cela, cela a fonctionné pour moi:
foreach (System.Data.DataRowView dr in yourDataGrid.ItemsSource)
{
MessageBox.Show(dr[0].ToString());
}
dans WPF vous allez sur elle beaucoup plus dynamique et Objectorientrated. Vous pouvez lier la Colonne "pNew" sur une Propriété de l'élément que vous mettez dans le DataGrid
, qui revient en arrière.
Si la valeur change, vous pouvez augmenter l'Événement PropertyChanged
(Interface INotifyPropertyChanged
) et la propriété liée sera réévaluée.
aussi intéressant pour commencer avec WPF est DataTemplate
,ControlTemplate
,Converter
.
Le convertisseur change la valeur de la propriété en une valeur utilisable pour WPF (par exemple BoolToVisibility) lorsque la propriété est appelée.
DataTemplate
et ControlTemplate
peut être utilisé pour modifier l'apparence du Contrôle.
Il y a plusieurs bons Tutoriels pour WPF. Je recommande également d'examiner le MVVM-Pattern à utiliser comme une couche entre votre Businessobject et votre WPF-Control, en particulier pour gérer des choses comme ce que vous essayez de faire ici.
Oui, vous avez raison. WPF DataGrid
est construit autour de mieux soutenir l'utilisation des objets.
vous pouvez utiliser un modèle de vue similaire à ce qui suit. Construisez-les tous dans une collection et mettez cette collection comme votre ItemsSource
. Vous devez également utiliser un ValueConverter si vous voulez afficher et l'image au lieu d'un crochet pour que le pNew soit vrai/faux.
public class FooViewModel : INotifyPropertyChanged
{
private int currentPareto;
public int CurrentPareto
{
get
{
return currentPareto;
}
set
{
if (currentPareto == value)
return;
currentPareto = value;
OnPropertyChanged("CurrentPareto");
OnPropertyChanged("pNew");
}
}
private int newPareto;
public int NewPareto
{
get
{
return newPareto;
}
set
{
if (newPareto == value)
return;
newPareto = value;
OnPropertyChanged("NewPareto");
OnPropertyChanged("pNew");
}
}
public bool pNew
{
get
{
return CurrentPareto < NewPareto;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Modifier
pour simplifier un peu, vous pouvez utiliser une classe de base ViewModel et utiliser PropertyChanged
tissage. Le code de simplifier à ceci:
public class FooViewModel : ViewModelBase
{
public int CurrentPareto { get; set; }
public int NewPareto { get; set; }
public bool pNew { get { return CurrentPareto < NewPareto; } }
}
Pourquoi tu ne peux pas utiliser cette propriété pour obtenir le nombre de lignes et ensuite utiliser une boucle for Pour parcourir?
dataGridView1.Rows.Count