2017-07-26 11 views
0

Comment "BS" (alias Backspace, alias \ b) une valeur dans une propriété de chaîne qui est DataBound à un DataGridTextColumn:WPF DataGridTextColumn contient backspace omble

XAML

<toolkit:DataGridTextColumn Header="K" 
          Width="40" 
          Binding="{Binding Path=Category, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> 

C#

private string category = ""; 
public string Category 
{ 
    get { return category; } 
    set 
    { 
     category = value; 
     OnPropertyChanged("Category"); 
    } 
} 

J'ai trouvé des entrées dans la base de données contenant alors [BS] comme valeur de la catégorie. Garanti aucun autre code apporter des modifications à la propriété sur le chemin de la base de données. Impossible de recréer la situation pendant le débogage, car je ne sais pas comment taper [BS] dans un TextBox évidemment. Un seul client pourrait en faire quelque chose ...

Avez-vous des idées comment cela pourrait arriver? J'essayais de mettre en place une vérification dans la propriété-setter, ... mais j'essaie de comprendre le vrai problème ici.

+2

Vous pouvez facilement coller les caractères de contrôle du presse-papiers. L'utilisateur peut avoir copié une chaîne contenant le caractère de contrôle de retour arrière. Cela peut être un bogue dans l'application de source de texte ou une tentative d'exploitation par l'utilisateur. – dymanoid

+0

Je connais l'utilisateur en personne - à peu près sûr qu'elle a simplement tapé une seule lettre (ce qui est l'objectif habituel de la chaîne de catégorie) ... mais de toute façon je vais essayer de le retrouver avec quelques logs et voir si cela se reproduira. – user3559014

Répondre

0

J'ai créé une petite application WPF qui recrée quelque peu la situation. Je pourrais obtenir un caractère de contrôle tel que retour arrière (ASCII 8, Alt + 0008) en le copiant à partir d'un éditeur de texte, et en le collant dans la cellule DataGrid active. REMARQUE: Assurez-vous d'utiliser le pavé numérique pour le code ASCII

MainWindow.xaml:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:BackspaceInGrid" 
     x:Class="BackspaceInGrid.MainWindow" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel Orientation="Vertical"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Last Update Category Value: "/> 
      <TextBlock Name="LastUpdateTextBlock"/> 
     </StackPanel> 
     <DataGrid x:Name="MyDataGrid" Height="300" Width="500" DataContext="" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="K" Width="40" 
        Binding="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs:

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows; 

namespace BackspaceInGrid 
{ 
    public class Widget : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private string category; 
     public string Category 
     { 
      get { return category; } 
      set 
      { 
       category = value; 
       OnPropertyChanged("Category"); 
      } 
     } 

     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 

    public partial class MainWindow : Window 
    { 
     public void CategoryChangedEvent(object sender, PropertyChangedEventArgs e) 
     { 
      Widget widget = (Widget) sender; 
      string categoryChars = string.Empty; 
      for (int i = 0; i < widget.Category.Length; i++) 
      { 
       char c = widget.Category[i]; 
       if (char.IsControl(c)) 
       { 
        categoryChars = string.Format("{0}char {1} = ASCII({2}), ", categoryChars, i, (int) c); 
       } 
       else 
       { 
        categoryChars = string.Format("{0}char {1} = '{2}', ", categoryChars, i, c); 
       } 
      } 
      LastUpdateTextBlock.Text = categoryChars; 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      ObservableCollection<Widget> widgets = new ObservableCollection<Widget>(); 
      widgets.Add(new Widget { Category = "ABC" }); 

      char [] chars_abc = new char [] { (char) 97, (char) 98, (char) 99 }; 
      char [] chars_ab_back_c = new char [] { (char) 97, (char) 98, (char) 8, (char) 99 }; 

      widgets.Add(new Widget { Category = new string(chars_abc) }); 
      widgets.Add(new Widget { Category = new string(chars_ab_back_c) }); 

      foreach (Widget widget in widgets) 
      { 
       widget.PropertyChanged += CategoryChangedEvent; 
      } 
      MyDataGrid.ItemsSource = widgets; 
     } 
    } 
} 
+0

Merci pour l'exemple. Je suis assez sûr que l'utilisateur qui a produit le problème ne connaît pas les caractères de contrôle. Je vais essayer de suivre cela avec quelques logs et voir comment ça s'est passé ... Merci beaucoup – user3559014

+0

"Rien n'est infaillible pour un imbécile suffisamment talentueux" - La loi de Murphy –