2016-10-11 5 views
2

を受けている:WPFのDataGrid無効セルは、3つの列を持つ次のDataGridを考えるテキスト入力

enter image description here

年齢は今まで-1対応するセルが無効になったとき。

無効なセルの値を変更することは理想的ではありません。しかし、ユーザーが行1にあり、キーボードのフォーカスが列Ageの対応するセルにあり、Enterキーを押すと、ユーザーは任意の数値を入力し、無効なセルはその値を取得するとみなされます。これは望ましい行動ですか?どうすればこの問題を回避できますか?

enter image description here

問題を再現するには、次の

:Age列
  • プレスの1行目で

    1. 選択セルは
    2. 種類数

    再現コードを入力してください

    XAML:

    <Window x:Class="wpf_behaviour.MainWindow" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         Title="DataGridDetailsSample" Height="200" Width="400"> 
        <Grid Margin="10"> 
         <DataGrid Name="dgUsers" AutoGenerateColumns="False"> 
          <DataGrid.Columns> 
           <DataGridTextColumn Header="ID" Binding="{Binding Id}"/> 
           <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
           <DataGridTextColumn Header="Age" Binding="{Binding Age}"> 
            <DataGridTextColumn.CellStyle> 
             <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
              <Style.Triggers> 
               <DataTrigger Binding="{Binding Age}" Value="-1"> 
                <Setter Property="IsEnabled" Value="False"/> 
                <Setter Property="ToolTip" Value="This filed is diabled."/> 
                <Setter Property="Background" Value="LightGray"/> 
               </DataTrigger> 
              </Style.Triggers> 
             </Style> 
            </DataGridTextColumn.CellStyle> 
           </DataGridTextColumn> 
          </DataGrid.Columns> 
         </DataGrid> 
        </Grid> 
    </Window> 
    

    Correspoinding CS:

    using System.Collections.Generic; 
    using System.Windows; 
    using System.Windows.Documents; 
    
    namespace wpf_behaviour 
    { 
        /// <summary> 
        /// Interaction logic for MainWindow.xaml 
        /// </summary> 
        public partial class MainWindow : Window 
        { 
         public MainWindow() 
         { 
          InitializeComponent(); 
    
          List<User> users = new List<User>(); 
          users.Add(new User() { Id = 1, Name = "Kumar", Age = 10 }); 
          users.Add(new User() { Id = 2, Name = "Sameer", Age = -1 }); 
          users.Add(new User() { Id = 3, Name = "Danny", Age= 16 }); 
    
          dgUsers.ItemsSource = users; 
         } 
    
         public class User 
         { 
          public int Id { get; set; } 
          public string Name { get; set; } 
          public int Age { get; set; } 
         } 
        } 
    } 
    
  • +0

    この記事を見http://stackoverflow.com/questions/37584559/datagridcheckboxcolumn-lose-is-on-application-style-when-applied-elementstyle –

    +0

    @ S.Akbari設定 ''は役に立ちませんでした! – Abbas

    答えて

    0

    私はなぜこのhappaningわからないが、あなたは、イベントを入力して、[編集]を取り消すキャッチすることができます:

    C#

    private void MyDataGrid_OnKeyDown(object sender, KeyEventArgs e) 
    { 
        var dg = sender as DataGrid; 
    
        // alter this condition for whatever valid keys you want - avoid arrows/tab, etc. 
        if (dg != null && !dg.IsReadOnly && e.Key == Key.Enter) 
        { 
         dg.CancelEdit(); 
         e.Handled = true; 
        } 
    } 
    

    XAML

    <DataGrid Grid.Column="1" Name="dgUsers" AutoGenerateColumns="False" PreviewKeyDown="MyDataGrid_OnKeyDown"> 
    
    +0

    私は 'Key.Enter'をすべて取り消したくありません。そして、谷を受け取っている障害のある細胞の出来事のどれもが引き起こされていません。だから私は絶対に、テキストを受け取っているセルが無効なセルであるかどうかを知る方法がない。 – Abbas

    0

    私は解決策を得た(PreviewKeyDownイベントハンドラを追加)し、ここにあると私は同様に任意のより良い解決策を知っていると思います:

    private void DataGridCell_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
        try 
        { 
         DataGridCell cl = (DataGridCell)sender; 
         //Get the Cell's parent row 
         //using System.Windows.Media; for VisaualTreeHelper 
         var DataGridRowParent = VisualTreeHelper.GetParent(cl); 
         while (DataGridRowParent != null && DataGridRowParent.GetType() != typeof(DataGridRow)) 
         { 
          DataGridRowParent = VisualTreeHelper.GetParent(DataGridRowParent); 
         } 
         //Get the Row's parent DataGrid 
         var DataGridParent = VisualTreeHelper.GetParent(DataGridRowParent); 
         while (DataGridParent != null && DataGridParent.GetType() != typeof(DataGrid)) 
         { 
          DataGridParent = VisualTreeHelper.GetParent(DataGridParent); 
         } 
    
         DataGrid dp = DataGridParent as DataGrid; 
         //Get the CurrentCell value of DataGrid 
         DataGridCellInfo cli = dp.CurrentCell; 
    
         var CellContent = cli.Column.GetCellContent(cli.Item); 
         if (CellContent != null) 
         { 
          //Get DataGridCell of DataGridCellInfo 
          DataGridCell dgc = (DataGridCell)CellContent.Parent; 
          if (dgc.IsEnabled == false) 
          { 
           //If the key pressed is Enter or Tab allow 
           if (e.Key == Key.Enter || e.Key == Key.Tab) 
           { 
            e.Handled = false; 
            return; 
           } 
           //If any other key is pressed don't allow. 
           e.Handled = true; 
           return; 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex.ToString()); 
        } 
    } 
    
    関連する問題