質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

5351閲覧

C#、WPF、DataGridでセルに対して入力完了のタイミングを取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2021/09/09 02:51

編集2021/09/13 11:37

前提・実現したいこと

実現したいこと
列3の入力が確定した時点で 列4、5の値を参照して
入力値が範囲内ならOK、範囲外ならエラーとして
そのセルからフォーカス移動をさせない
出来ていること
マウスで選択した場合、選択したセルの値と
列4,5の値の取得まで
知りたいこと
上記の状態からセルのマウス選択ではなく、セルの入力完了で連携をさせたいのですが
その方法がわかりませんでした。
アドバイス等よろしくお願いします。

現在のソースコード

MainWindow.xaml

<Window x:Class="WPFGetDataGridCell.MainWindow" 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:WPFGetDataGridCell" mc:Ignorable="d" Title="MainWindow" Height="300" Width="600" > <Grid> <DataGrid Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single" SelectionUnit="Cell" MouseLeftButtonDown="DataGrid_MouseLeftButtonDown"/> </Grid> </Window>

MainWindow.xaml.cs

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WPFGetDataGridCell { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // データグリッドに5列設定 for (int i = 0; i < 5; ++i) { //追加する列はテキストカラムとしてます。 var column = new DataGridTextColumn(); column.Header = $"{i}"; column.Binding = new Binding($"[{i}]"); dataGrid.Columns.Add(column); } // データグリッドに3行設定 var row1 = new string[] { "あああ", "AAAAAA", "0", "0", "90" }; var row2 = new string[] { "いいい", "BBBBBB", "0", "0", "91" }; var row3 = new string[] { "ううう", "CCCCCC", "0", "0", "92" }; var rows = new List<object>(); rows.Add(row1); rows.Add(row2); rows.Add(row3); dataGrid.ItemsSource = rows; } private void DataGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var dataGrid = sender as DataGrid; // 行位置を取得します。 var rowIndex = dataGrid.Items.IndexOf(dataGrid.CurrentItem); // 列位置を取得します。 var columnIndex = dataGrid.CurrentCell.Column.DisplayIndex; var row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow; var cell = dataGrid.Columns[columnIndex].GetCellContent(row); var cellMin = dataGrid.Columns[3].GetCellContent(row); var cellMax = dataGrid.Columns[4].GetCellContent(row); // セルのテキストブロックキャスト var textBlock = cell as TextBlock; var textBlockMin = cellMin as TextBlock; var textBlockMax = cellMax as TextBlock; //全セル値の表示 MessageBox.Show("入力値="+ textBlock.Text +" 最小値="+ textBlockMin.Text + " 最大値=" + textBlockMax.Text); } } }

補足情報(FW/ツールのバージョンなど)

環境: Win10 、VS2019、C#
フレームワーク:なし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/07/29 05:12 編集

> 都合により削除することとなりました。 そんな事情はありません。速やかに元に戻してください。 teratailでは原則質問も回答も削除できません。 [投稿の削除ポリシー|teratail(テラテイル)](https://teratail.com/help/delete-policy そもそも編集履歴で丸見えです。退会しようが運営が元に戻します。 回答者にも大変失礼です。
guest

回答1

0

列3の入力が確定した時点で 列4、5の値を参照して
入力値が範囲内ならOK、範囲外ならエラーとして
そのセルからフォーカス移動をさせない

はっきり言ってこのような操作妨害はどうかと思います(通常バリデーション(validation 値の検証)で、エラーが分かれば十分だと思いますが)

しかしやりたい方もいるようですね^^;
c# - Keep cursor in cell after cancel in WPF DataGrid CellEditEnding event with MVVM - Stack Overflow

CellEditEndingの時点ではまだ値が反映されていない(だからキャンセルできるわけですが)のが非常に面倒です。
DataGrid.CellEditEnding イベント (System.Windows.Controls) | Microsoft Docs

提示条件しか考慮していません(MaxValue以下にしたらどうなるかとか)

xml

1<Window 2 x:Class="Questions358523.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <Grid> 8 <DataGrid 9 AutoGenerateColumns="False" 10 CellEditEnding="DataGrid_CellEditEnding" 11 ItemsSource="{Binding Items}"> 12 <DataGrid.Columns> 13 <DataGridTextColumn 14 Width="200" 15 Binding="{Binding Name}" 16 Header="名前" /> 17 <DataGridTextColumn 18 Width="100" 19 Binding="{Binding Value}" 20 Header="" /> 21 <DataGridTextColumn 22 Width="100" 23 Binding="{Binding Min}" 24 Header="最小値" /> 25 <DataGridTextColumn 26 Width="100" 27 Binding="{Binding Max}" 28 Header="最大値" /> 29 </DataGrid.Columns> 30 </DataGrid> 31 </Grid> 32</Window>

cs

1using System; 2using System.Collections.ObjectModel; 3using System.Windows; 4using System.Windows.Controls; 5 6namespace Questions358523 7{ 8 public class Item 9 { 10 public string Name { get; set; } 11 public int Value { get; set; } 12 public int Min { get; set; } 13 public int Max { get; set; } 14 } 15 16 public partial class MainWindow : Window 17 { 18 public ObservableCollection<Item> Items { get; } = new(); 19 20 public MainWindow() 21 { 22 InitializeComponent(); 23 DataContext = this; 24 25 Items.Add(new() { Name = "あああ", Min = 0, Max = 90, }); 26 Items.Add(new() { Name = "いいい", Min = 0, Max = 91, }); 27 Items.Add(new() { Name = "ううう", Min = 0, Max = 92, }); 28 } 29 30 private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 31 { 32 if (e.EditAction != DataGridEditAction.Commit) return; 33 if (sender is not DataGrid dataGrid) return; 34 if (e.EditingElement is not TextBox textBox) return; 35 if (e.Row.Item is not Item item) return; 36 if (e.Column.SortMemberPath != nameof(Item.Value)) return; 37 if (!int.TryParse(textBox.Text, out var value)) return; 38 39 if (item.Min <= value && value <= item.Max) return; // ok- 40 41 // [c# - Keep cursor in cell after cancel in WPF DataGrid CellEditEnding event with MVVM - Stack Overflow](https://stackoverflow.com/questions/52981358/keep-cursor-in-cell-after-cancel-in-wpf-datagrid-celleditending-event-with-mvvm) 42 e.Cancel = true; 43 dataGrid.Dispatcher.BeginInvoke((Action)(() => 44 { 45 dataGrid.SelectedIndex = e.Row.GetIndex(); 46 e.EditingElement.Focus(); 47 })); 48 } 49 } 50}

C# 9.0です。9以前だと下記2つがエラーになると思われます。
ターゲットからの new 型推論 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

not パターン - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

投稿2021/09/14 03:33

編集2023/07/29 05:14
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/09/14 03:34

通報して元に戻してもらった手前、閲覧者向けに回答しておきます。 なんだかわからない自分勝手な理由で削除しようとする失礼な質問者向けではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問