J'ai un datagrid qui génère 90 lignes après avoir été liée à un jeu de données. Les valeurs des lignes sont le 1-90 ascendant.
Ce que je veux réaliser: p>
Si le numéro est trouvé dans un tableau / une plage / liste des numéros, mettez-la en surbrillance. P>
J'ai réussi à le faire mettre en surbrillance la cellule en fonction de la valeur 1, mais je veux mettre en évidence plusieurs cellules si elles se trouvent dans la gamme. p> Vous pouvez voir avoir une propriété de déclenchement de la valeur 1. Cela fonctionne bien, mais comme ci-dessus, comment puis-je modifier cela, donc si une cellule est dans la plage définie En C # dans le backend, mettez-la en surbrillance. p> Reliure à DataTable: p> la fabrication effective du jeu de données: p> merci pour Toute aide les gars. Si vous avez besoin de plus d'informations ou que je suis allé à vague ou pas clair sur quoi que ce soit, veuillez demander et je ferai de mon mieux pour répondre dès que possible. Veuillez également excuser toute ignorance que je pourrais avoir, je suis très nouveau à WPF. Je ferai de mon mieux. p> p>
7 Réponses :
Une façon de faire est comme ça:
Supposons que vous liez les rangées vers une propriété appelée articles, qui est une liste de quelque chose. Vous devez créer une propriété comme "Ishatighlighted" comme si vous aviez été suggérée, et votre code doit le définir comme vrai ou faux en fonction de l'entrée de l'utilisateur. P>
Puis, pour mettre en évidence la ligne, vous devez joindre un événement. de loadingrow dans le datagramrid, comme: p> puis dans MyMethod fait quelque chose comme ceci: p> void myMethod(object sender, System.Windows.Controls.DataGridRowEventArgs e)
{
RowClass item = (RowClass)e.Row.Item;
if (item.IsHighlighted)
{
e.Row.Background = new SolidColorBrush(Colors.Green);
}
else
{
e.Row.Background = new SolidColorBrush(Colors.White);
}
}
Vous pouvez atteindre cet article en utilisant passe trois paramètres au convertisseur: p> convertisseur strong> p> xaml strong> p> Assurez-vous que vous ajoutez l'espace de nom correspondant au niveau de la racine: p> update strong> (dans le cas vouloir trouver un article dans un tableau de NUMÉROS) P> En supposant que votre réseau de chiffres existe dans le code arrière ou classe de modèle de modèle. em> p> Tout d'abord, vous devez tout d'abord que vous devez second, Maintenant, supposez que vous avez une propriété dire: p> Par défaut, il contiendra la liste des numéros que vous souhaitez mettre en évidence. p> xaml ressemblera à ceci: P> imultivalueconverter code> qui retournera true si le texte réside dans la plage, sinon retourne faux.
Basé sur la valeur renvoyée par convertisseur, modifiez la couleur de fond code>.
EchecsSource de DataGrid to DataTable code> au lieu de DataContext. P>
SET DataContext de DataGrid à ceci à partir de code derrière ou une instance de la classe de visionnelle P> P>. En outre, pour rafraîchir votre classe, votre classe devrait implémenter inotifyPropertychangned interface. P>
RangeNumbers = new int[] { 23, 45, 47, 69 };
OnPropertyChanged("RangeNumbers");
Est-ce que le XAML Snippet remplace mon DataGrid ou est-ce que cela va-t-il en dessous?
Remplacez votre section datagrid.resources code> avec mon extrait xaml de
datagrid.resources code>.
Cela fait donc de la valeur entre les gammes, mais qu'en est-il si un numéro est dans un tableau ou quelque chose comme dans la question?
Vous pouvez passer la plage comme l'une des liaisons code> à convertisseur et modifier
le code code> pour vérifier ce tableau passé. Faites-moi savoir au cas où vous auriez besoin d'aide dans cela.
D'accord merci. J'aimerais y donner un coup d'abord et postera une mise à jour demain une fois que j'ai essayé ce soir. Merci encore.
Bonjour, j'ai peut-être besoin de votre aide à ce sujet, ce que je travaille avec n'est pas une gamme. Ce que j'ai est un tableau, qui est au début vide, mais pendant les actions des utilisateurs, il remplit. Si un numéro à tout moment est dans cette liste, le nombre est vert.
Veuillez vérifier la réponse mise à jour et voir si cela fonctionne pour vous.
Est 'Définir les objets de DataGrid à DataTable' obtenu par: grid.datacontext = numérostable.defaultview;
Ya juste faire de cette façon grid.itemssource = numérostable.defaultview code>.
Donc j'ai public int [] rangenumbers {get; ensemble; } code> dans ma classe, mais vous dites à inclure:
Rangénumbers = NOUVEAU INT [] {23, 45, 47, 69}; Onpropertychanged ("Rangénumbers"); Code>? Quand je mets surpropertychangned n'importe où, il ne revient pas de type.
Laissez-nous Continuer cette discussion en chat
Je voudrais jeter cette option dans et pourrait être encore plus simple ... vous avez déjà une table de données d'une colonne avec des rangées 1-90. Pourquoi ne pas ajouter une autre colonne au jeu de données comme une colonne "showcolor". Blast à travers la liste une fois pour toute condition sur toutes les lignes et que la couleur de fond soit liée à celle de "Showcolor". Ensuite, aucun "convertisseur" spécial n'est requis. p>
En outre, vous vous référez à vouloir colorer de nombreuses cellules et que ce point est un peu vague. Voulez-vous dire sur une seule ligne qui peut être exposée à 10 colonnes, vous souhaitez que les cellules de la rangée 1, les colonnes 1, 2, 5, 8, 10 sont représentées en vert (non probable)? Ou ... Pour toute la rangée 1 qui qualifiait la condition, vous voulez que toutes les colonnes de cette ligne soient fond de vert. Deux réponses complètement différentes sortiraient. P>
Voici un exemple de fonctionnement en utilisant le modèle MVVM (qui fonctionnerait également si un numéro est modifié / modifié ou critères de mise en évidence des modifications) et de style setter avec multibindus:
MainWindowModel.cs fort> p> numbertexttobackgroundconverter.cs strong> p> mainwindow.xaml forte> p>
Salut, merci pour un code détaillé des extraits de code, a fière allure, problème est que je ne comprends pas la plupart des changements que vous avez faits. Il semble totalement changer mon code parce que vous suggérez peut-être que c'est une bonne façon de le faire?
Je ne suis pas vraiment un programmeur WPF, mais l'exemple ci-dessous doit être facilement convertible car les concepts sont identiques aux formulaires Windows pour faire ce dont vous avez besoin. L'exemple suivant accomplit les éléments suivants au démarrage:
de niveau de classe code> nommé m_dataset code>. li>
- ajoute une colonne
datatable code> appelé numéros code> dans le jeu de données code> et le charge avec des données d'échantillon.
- Les colonnes sont nommées
valeur code> et actif code>. li>
- Les types de données sont
int code> et bool code> respectivement. li>
ul> li>
- attribue les numéros
code> en tant que DataSource code> du contrôle code> DataGridView code> Contrôle. Cela entraîne la commande d'ajouter automatiquement les deux colonnes à partir de la table code> (code>. Ainsi, la valeur du datagridview1.columns ["actif"]. Visible code> Propriété est défini sur False. Cela laisse les numéros code> être lié à la commande code> datagridview code> sans avoir de colonnes cachées montrées à l'utilisateur. Le nombre de colonnes à montré est à vous. LI>
- crée des gestionnaires d'événements pour:
-
datagridview1_cellclick code> - Cela permet simplement de sélectionner des cellules aléatoires et de prouver le changement de cellule Backcolor code> Changement de sélection. C'est ici que la colonne «active» de la source de données bascule entre True et False. Li>
-
datagridview1_cellformatting code> - Ceci est lancé (dans Windows formes de toute façon) chaque fois qu'une cellule nécessite un formatage pour l'affichage. En manipulant cet événement pour affecter le Cell.backColor code>, nous n'avons pas à itérer toutes les lignes pour rafraîchir les couleurs car Windows le fait déjà pour toutes les cellules invalidées. Mettaient à jour le Backcolor code> immédiatement BOFORE La cellule est peinte. Il fonctionne également bien lorsque vous appelez manuellement invalider code> ou, lorsque les événements repeints accessoires se produisent que vous n'avez pas causé. Li>
-
bouton1_click code> - Enfin, il montre comment effacer tous les éléments sélectionnés dans le contrôle dataGridView code>. li>
ul> li>
ol> p> xxx pré> Voici ce que la sortie ressemble à des formulaires Windows. J'espère que cette réponse vous aide à résoudre votre problème. Prenez soin de vous. P>
p>
aussi de quoi J'ai lu, vous pouvez héberger des contrôles Windows Forms dans les applications WPF. Le dataGridView a des avantages de performance significatifs du contrôle DataGrid. Surtout avec de grands ensembles de données. P> p>
Ceci devrait être suffisamment simple si vous utilisez simplement un Datatrigger code>. Utilisez un
ivenueconverter code> pour renvoyer une valeur vraie / False basée sur la ligne. Vous pouvez soit un code difficile à coder la liste / la plage des numéros inclus dans le convertisseur, ou les transmettre à partir du paramètre XAML sous forme de paramètre:
<DataGrid.Resources>
<converter:HighlightConverter x:Key="HighlightConverter" />
<Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource HighlightConverter}">
<Binding RelativeSource="{RelativeSource AncestorType=Window}" Path="DataContext.HighlightedNumbers" />
<Binding />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="LightGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
Bonjour, merci pour le répondeur de réponses, apprécié. J'essaye maintenant et j'espère vous donner des commentaires d'ici demain. Merci.
Seul le problème que je peux voir avec ceci initialement est que je définirais «Inclusnumbers» en dehors de la classe de Concutiversterter.
@Ryanmurphy est-ce une valeur constante pour la vie de l'application? Si tel est le cas, alors peut-être le mettre sur le démarrage de l'application? Sinon, si cela change, vous voudrez probablement la multiplication multiple.
Difficile sans en savoir plus sur l'environnement autour de cela. Comment cette recherche est-elle faite par exemple. Je déclencherais la recherche dans le modèle d'affichage pour ce datagramrid, qui vient de définir une valeur sur chaque viewModel (ishatighlighted par exemple) et aurait un simple déclencheur dans XAML. Mais cela dépend vraiment du reste de votre code.
@Ryan Murphy - Vous pouvez atteindre cet article en utilisant
imultivalueconverter code>. J'ai ajouté une réponse. Voir si cela aide .. !!
Comme il s'agit de WPF, je voudrais essayer d'ajouter une propriété
isgreen code> (ou quelque chose nommé comme celui qui est logique selon votre logique d'entreprise) à votre objet de ligne de données rempli avec
true < / code> /
false code> et que votre interface utilisateur reflète cela.