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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

XAML

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

Q&A

2回答

2403閲覧

WPF(Prism+ReactiveProperty)の環境で、DataGirdで最後に発生したエラーメッセージを取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

XAML

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

0グッド

0クリップ

投稿2018/08/29 05:50

編集2022/01/12 10:55

前提・実現したいこと

DataGridでの入力チェック結果を取得する処理を考えているのですが
エラー結果が正しく取得できず悩んでいます。
現状では、DataGridの先頭セルで発生したエラーメッセージしか取得できません。

Q1.先頭以外のセルで発生したエラーメッセージを取得するにはどうすればよろしいでしょうか?
Q2.複数セルでエラーが発生した場合に、最後に発生したエラーのエラーメッセージを取得するにはどの様にすればよいでしょうか?

[参考HP] https://blog.okazuki.jp/entry/2014/05/07/014133

ViewModel

1public class MainWindowViewModel : BindableBase 2{ 3 public List<Person> People { get; } 4 5 public ReactiveProperty<string> Result { get; private set; } 6 7 public MainWindowViewModel() 8 { 9 this.People = new List<Person> 10 { 11 new Person() { Name = new ReactiveProperty<string>("aaa") }, 12 new Person() { Name = new ReactiveProperty<string>("bbb") }, 13 new Person() { Name = new ReactiveProperty<string>("ccc") } 14 }; 15 16 // チェック処理実施 17 this.People.ForEach(z => z.Name = z.Name.SetValidateAttribute(() => z.Name)); 18 19 // 先頭のエラーメッセージを取得したいが 20 this.Result = this.People.Select(z => z.Name 21 // エラーが発行されるIO<IE>を変換する 22 .ObserveErrorChanged 23 // エラーがない場合nullになるので空のIEにする 24 .Select(e => e ?? Enumerable.Empty<object>()) 25 // 最初のエラーメッセージを取得する 26 .Select(e => e.OfType<string>().FirstOrDefault()) 27 // ReactiveProperty化 28 .ToReactiveProperty()) 29 30 // ★★★これだと先頭セルのエラーしか取得できない 31 .First(); 32 } 33} 34 35public class Person 36{ 37 [Required(ErrorMessage = "必須エラー")] 38 public ReactiveProperty<string> Name { get; set; } 39}

View

1<Window x:Class="BlankApp3.Views.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 Width="525" 6 Height="350" 7 prism:ViewModelLocator.AutoWireViewModel="True"> 8 <StackPanel Margin="0,3,0,-3"> 9 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding People}"> 10 <DataGrid.Columns> 11 <DataGridTextColumn Binding="{Binding Name.Value, Mode=TwoWay}" Header="名前" IsReadOnly="False" /> 12 </DataGrid.Columns> 13 </DataGrid> 14 <StackPanel Orientation="Horizontal"> 15 <TextBlock Text="結果" /> 16 <TextBlock Text="{Binding Result.Value}" /> 17 </StackPanel> 18 </StackPanel> 19</Window>

上記のソースだと、一番上のセルしかエラーメッセージが取得できず
その他のセルの値を空にしてもエラーメッセージが取得できない

・1番目のセルを空に(エラーメッセージが取得できる)
イメージ説明

・2番目のセルを空に(エラーにはなるがエラーメッセージが取得できない)
イメージ説明


【追記】
例外内容
イメージ説明

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

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

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

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

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

guest

回答2

0

やりたいことはこれかな?

this.Result = this.People.Select(z => z.Name // エラーが発行されるIO<IE>を変換する .ObserveErrorChanged // エラーがない場合nullになるので空のIEにする .Select(e => e ?? Enumerable.Empty<object>()) // 最後のエラーメッセージを取得する .Select(e => e.OfType<string>().LastOrDefault()) // エラーのないものをスキップする .Where(n => n.Any() ) // 最後の行 .Last() // ReactiveProperty化 .ToReactiveProperty();

投稿2018/08/29 11:00

編集2018/08/29 11:02
kiichi54321

総合スコア1984

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

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

退会済みユーザー

退会済みユーザー

2018/08/29 23:13

ご回答ありがとうございます。 取り敢えずいただいたソースをそのまま貼り付けてみました。 結果、コンパイルエラーが出たので修正してみました。 その後、実行してみたのですが例外が発生しました。 例外の内容は質問に追加しておきました。 もう少し悩んでみます。
guest

0

// ★★★これだと先頭セルのエラーしか取得できない

.First();

'.First()'を、とればいいんじゃね?

public ReactiveProperty<string> Result { get; private set; }

複数の返り値があることを期待しているのに、なんで単数なの?

なお、文字列連結には

String.join("区切り文字",string_list);

を使います。

Q2.複数セルでエラーが発生した場合に、最後に発生したエラーのエラーメッセージを取得するにはどの様にすればよいでしょうか?

 

// ★★★これだと先頭セルのエラーしか取得できない

.Last();

に変更。

投稿2018/08/29 08:23

編集2018/08/29 08:26
kiichi54321

総合スコア1984

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

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

退会済みユーザー

退会済みユーザー

2018/08/29 08:46

ご回答ありがとうございます。 Q1.First()をとって複数(IEnumerable<ReactiveProperty<string>>)にしても  そこから、最後に発生したエラーをどうやって取得するかがわかりませんでした。 >複数の返り値があることを期待しているのに、なんで単数なの? 最終的に表示したいエラーメッセージは1つだけなので、Viewにバインドしている Resultは単数にしています。 ※イメージとしてはFirst()の辺りをいじって最後に発生したエラー1つだけがResutに入る  事を想定していました。 Q2.Last()にすると今度は最終セルのエラーメッセージしか取得できませんでした。
kiichi54321

2018/08/29 08:55 編集

???  // 最初のエラーメッセージを取得する .Select(e => e.OfType<string>().FirstOrDefault()) じゃぁ、ここでしょ。自分でコメントを書いているじゃん。 これをLastOrDefault()にすればいいだけ。
退会済みユーザー

退会済みユーザー

2018/08/29 09:22

そのコメントは参考ページのコメントそのままなんですが そこでいう「最初のエラーメッセージ」というのは、1セルに複数エラーがあった場合の 最初のエラーメッセージを取得するという事だと認識しています。 欲しいエラーメッセージは、複数セルでエラーがあった際の最後にエラーが発生したセルの エラーメッセージという意味です。 あと、.FirstOrDefault()を.LastOrDefault()に変更してやってみましたが .First()を.Last()に変更した際と同じ結果で最後のセルでのエラーメッセージしか 取得できませんでした。 何か根本的に間違っているのでしょうか・・・・
kiichi54321

2018/08/29 10:39

一つ一つやっていることを理解しよう。 Firstとかそういうのを消して、 IEnumerable<IEnumerable<string>> の形で出してみて、それを加工するという形にしたほうがいいと思う。
kiichi54321

2018/08/29 11:01

勘違いしていた。回答追加した。
kiichi54321

2018/08/29 12:03

間違えていたので削除依頼出しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問