2011-03-03 6 views
2

Je vais commencer par dire que je suis complètement nouveau à WPF. Mais, j'ai 20 ans d'expérience en développement et environ 5 ans d'expérience en Webforme C#.La cellule DataGrid WPF est-elle entourée de rouge? (Noobie)

J'essaie de diagnostiquer une application WPF qui utilise un contrôle DataGrid.

Je vais essayer de décrire un scénario qui se passe dans ce applicaiton ..

Voici les étapes qui produisent la « erreur ». J'essaie de comprendre ce qui se passe:

L'utilisateur ajoute une ligne à la table DataGrid. L'utilisateur modifie la première colonne (Qté) à 1. Les onglets de l'utilisateur dans les colonnes. Une fois que le curseur passe la colonne "Discount Pct" et entre dans la colonne suivante. A ce moment, la cellule "Discount Pct" devient rouge. Aucune autre cellule ne peut être modifiée tant que la colonne "Discount Pct" n'a pas été "fixée". La chose amusante est, vous pouvez effacer la cellule et tapez les mêmes données et le rouge disparaît. Je pensais que c'était peut-être parce que le champ est un champ "pourcentage" (quand vous tapez .10, il devient "10%" quand vous quittez la cellule), mais la même chose se passe avec un autre (texte brut/varchar).

D'autres choses étranges que je l'ai remarqué:

Si l'utilisateur ne saisit rien dans la cellule Qté, mais seulement des onglets directement à travers toutes les colonnes, à la fin, aucun des cellules en rouge.

Si l'utilisateur clique (au lieu de l'onglet) sur la cellule Pct Discount (si une Qté est entrée ou NON), puis quitte cette cellule (avec un clic ou un onglet), la cellule ne devient pas rouge.

Des idées ce qui se passe ici? Je suppose qu'il y a un certain type de validation de cellule échouant, mais pourquoi seulement dans ces circonstances spécifiques?

Comment diagnostiqueriez-vous cela? Puis-je afficher l'erreur de validation d'une manière ou d'une autre (je suis sûr qu'il doit y avoir un gestionnaire auquel je peux m'attacher), peut-être que cela me dira quelque chose.

Pensées? Des idées?

Ajout de code par les demandes:

 <DataGrid x:Name="myDataGrid" 
       ItemsSource="{Binding}" 
       CanUserAddRows="False" 
       CanUserDeleteRows="True" 
       CanUserResizeRows="False" 
       SelectionUnit="CellOrRowHeader" 
       ColumnHeaderStyle="{StaticResource lclDataGridColumnHeaders}" 
       RowHeaderStyle="{StaticResource lclDataGridRowHeaders}" 
       CellStyle="{StaticResource lclDataGridCellStyle}" 
       HorizontalGridLinesBrush="LightBlue" 
       VerticalGridLinesBrush="LightBlue" 
       AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" 
       Loaded="DataGrid_Loaded" 
       LoadingRow="DataGrid_LoadingRow" 
       CurrentCellChanged="DataGrid_CurrentCellChanged" 
       CellEditEnding="DataGrid_CellEditEnding"> 
    </DataGrid> 

je me suis dit comment appliquer un style à la "EditCell" et UED les éléments suivants (d'un autre site):

 <Style x:Key="lclDataGridCellEditStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Setter Property="Padding" Value="0"/> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
         Value="{Binding RelativeSource={RelativeSource Self}, 
           Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

Ensuite, J'ai assigné cela à EditingElementStyle sur le DataGrid (dans le code derrière).

L'erreur de validation générée (confirme mes soupçons) est: "La valeur '10% 'n'a pas pu être convertie".

Cela a du sens, car il veut que l'utilisateur entre ".10" ou quelque chose de similaire (un float/double/décimal/etc) ... sans le "%" (traiter l'entrée comme char/texte) .

Le problème est que cette ligne est "importée" (copiée à partir d'une autre table) dans le DataGrid et que, par conséquent, le champ est déjà rempli.Alors, comment puis-je obtenir le DataGrid pour accepter simplement la "valeur d'affichage" (lancer des termes et deviner ici) pour la "valeur d'édition"?

Et, pourquoi seulement lorsque vous modifiez la cellule Qté puis onglet à travers elle, ne se produit cette erreur de validation?

En savoir plus sur l'autre champ plus tard ... une fois que je « Solve » celui-ci, je soupçonne que la solution sera similaire ...

je peux donner plus de code, mais il y a beaucoup. J'essaie juste de donner ce qui est nécessaire. Si je peux poster un de l'autre code (comme AutoGeneratingColumn, qui est très basique), faites le moi savoir!

informations Nouveau ... Je devine la raison pour laquelle la boîte rouge apparaît après la Qté change, est parce que déclenche un changement de ligne, ce qui fait une validation. Et, pour fixer le scénario décrit ci-dessus pourcentage I, il semble que je vais devoir mettre en œuvre un « convertisseur » comme décrit ici: http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

Une autre mise à jour ....

Cela a fonctionné. J'ai ajouté le convertisseur au champ de pourcentage et maintenant tout est bon pour celui-là.

L'autre domaine qui me donne des problèmes est une colonne « entier » qui autorise les valeurs NULL. Lorsque l'enregistrement est importé, cette colonne est nulle, mais il est évident que DataGridTextColumn veut que la valeur ints ne soit pas NULL. Y a-t-il une propriété que je peux définir pour autoriser les valeurs nulles? Ou, ai-je simplement besoin de faire un autre convertisseur pour convertir entre..um ... null (string) et int ?? lol

Shayne

+0

Got code pour montrer? Cela aiderait. – itsmatt

+0

Pourriez-vous poster le code correspondant pour le 'DataGrid' et tout code de validation que vous utilisez peut-être? –

+0

Code ajouté à la publication. :) – Shayne

Répondre

1

Vous pourriez être en mesure d'avoir une colonne qui est de type int? ce qui permettrait des nulls.

+0

Oui, c'est-ce que je supposais les AutoGenerateColumns serait « lier » la columm, depuis la colonne de base de données type int et n'allow nulls. Évidemment, cela ne dérange pas de voir si la colonne devrait permettre NULLS ... – Shayne

Questions connexes