6
votes

Sélectionnez les cellules si trouvées

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:

Si le numéro est trouvé dans un tableau / une plage / liste des numéros, mettez-la en surbrillance.

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. xxx

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.

Reliure à DataTable: xxx

la fabrication effective du jeu de données: xxx

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.


3 commentaires

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 . 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 (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 et que votre interface utilisateur reflète cela.


7 Réponses :


0
votes

Vous devez utiliser un convertisseur conditionnel. Voir Cet article .


0 commentaires

0
votes

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> xxx pré>

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);
        }
}


0 commentaires

3
votes

Vous pouvez atteindre cet article en utilisant 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>.

passe trois paramètres au convertisseur: p>

  1. Valeur de texte réelle. LI>
  2. Valeur minimale. LI>
  3. Valeur maximale. Li> ol>

    convertisseur strong> p> xxx pré>

    xaml strong> p> xxx pré>

    Assurez-vous que vous ajoutez l'espace de nom correspondant au niveau de la racine: p> xxx pré>


    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 EchecsSource de DataGrid to DataTable code> au lieu de DataContext. P>

    second, 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>

    Maintenant, supposez que vous avez une propriété dire: p> xxx pré>

    Par défaut, il contiendra la liste des numéros que vous souhaitez mettre en évidence. p>

    xaml ressemblera à ceci: P>

    RangeNumbers = new int[] { 23, 45, 47, 69 };
    OnPropertyChanged("RangeNumbers");
    


11 commentaires

Est-ce que le XAML Snippet remplace mon DataGrid ou est-ce que cela va-t-il en dessous?


Remplacez votre section datagrid.resources avec mon extrait xaml de datagrid.resources .


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 à convertisseur et modifier le 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 .


Donc j'ai public int [] rangenumbers {get; ensemble; } dans ma classe, mais vous dites à inclure: Rangénumbers = NOUVEAU INT [] {23, 45, 47, 69}; Onpropertychanged ("Rangénumbers"); ? Quand je mets surpropertychangned n'importe où, il ne revient pas de type.


Laissez-nous Continuer cette discussion en chat



0
votes

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.

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.


0 commentaires

3
votes

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 xxx

numbertexttobackgroundconverter.cs xxx

mainwindow.xaml xxx


1 commentaires

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?



0
votes

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:

  1. crée un fichier de données de niveau de classe nommé m_dataset .
  2. ajoute une colonne datatable appelé numéros dans le jeu de données et le charge avec des données d'échantillon.
    • Les colonnes sont nommées valeur et actif .
    • Les types de données sont int et bool respectivement.
    • attribue les numéros en tant que DataSource du contrôle DataGridView Contrôle. Cela entraîne la commande d'ajouter automatiquement les deux colonnes à partir de la table (code>. Ainsi, la valeur du datagridview1.columns ["actif"]. Visible Propriété est défini sur False. Cela laisse les numéros être lié à la commande datagridview sans avoir de colonnes cachées montrées à l'utilisateur. Le nombre de colonnes à montré est à vous.
    • crée des gestionnaires d'événements pour:
      • datagridview1_cellclick - Cela permet simplement de sélectionner des cellules aléatoires et de prouver le changement de cellule Backcolor Changement de sélection. C'est ici que la colonne «active» de la source de données bascule entre True et False.
      • datagridview1_cellformatting - 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 , 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 immédiatement BOFORE La cellule est peinte. Il fonctionne également bien lorsque vous appelez manuellement invalider ou, lorsque les événements repeints accessoires se produisent que vous n'avez pas causé.
      • bouton1_click - Enfin, il montre comment effacer tous les éléments sélectionnés dans le contrôle dataGridView .

        xxx

        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.

        Entrez la description de l'image ici

        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.


0 commentaires

0
votes

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>


3 commentaires

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.