2017-05-03 16 views
0

私は、ユーザーが整数値を入力できるウィンドウ形式を持っています。この値は、特定の有効範囲内にある限り、別のクラス(foo)のメンバーを更新するために使用されます。ユーザーが無効なものを入力した場合、パラメータのデフォルト値が使用されることをユーザーに伝えるエラーメッセージが表示されます。エラーメッセージをC#のプロパティ設定ツールからユーザーに "返す"方法

これを達成するために、私は問題のフィールドを設定する前に、ウィンドウフォームのコード内のユーザー入力をチェックしてエラーをチェックしています。

私がしたいのは、生のユーザー入力をクラスfoo内のプロパティ設定ツールに送信し、プロパティ設定ツールですべてのエラーチェックを処理することです。 fooの他の関数では、ユーザインタフェース上にメッセージを表示する必要があるかもしれませんが、文字列を返すだけですが、私の知る限り、プロパティセッターからステータスや値を返す方法はありません。プロパティセッターから別の関数へのある種のステータスメッセージをバブルさせるには、優雅な方法がありますか?私はfooがユーザーインターフェースを直接変更しないようにしたい。

任意のヘルプやヒントについては、事前のおかげで、私は私の質問があまりにも漠然としているか、私は私の問題を修正し

+2

あなたは[INotifyDataErrorInfo]に興味があるかもしれません(https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo(V = vs.110).aspxの) –

+0

@ScottChamberlain私を許して、私はC#の新機能です。これは、何らかの形でWindowsフォームに捕まえることができるイベントを発生させる方法になりますか? – Cobalt

+0

はい、インタフェースを実装して、それを使ってどのプロパティにエラーがあるかに関する情報を提供することができます。それを実装する方法を学ぶためのGoogleチュートリアルは、WinFormsとWPFの両方に統合されています –

答えて

0

StackOverflowのために新しいですと異なって尋ねた(だけでなく、返却する必要性を除去しなければならない場合には謝罪私のクラスfooでINotifyPropertyChangedを実装し、何かが変更されたことをユーザーに知らせる必要があるときはいつでもWindowsフォームでPropertyChangedイベントを発生させることによって、

クラスの

foo-

public class foo : INotifyPropertyChanged { 

    public event PropertyChangedEventHandler PropertyChanged; 
    public int bar; 

    private void NotifyPropertyChanged(string type) { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(type)); 
     } 
    } 

    private void test(){ 
     bar = 1; 
     NotifyPropertyChanged("changed int"); 
    } 

} 
Windowsフォームで

public partial class GUI : Form { 
    foo fooinstance = new foo(); 

    public GUI(){ 
      InitializeComponent(); 
      fooinstance.PropertyChanged += doEvent; 
    } 

    private void doEvent(object sender, PropertyChangedEventArgs e){ 
     foo updated = sender as foo; 
     if (object.ReferenceEquals(e.PropertyName, "changed int")) { 
      ShowWhatChanged(updated.bar); //show on GUI 
     } 
    } 

}

EDIT: 私が使用して終了し、より優雅できれいな方法は、コールバックを利用することでした。 GUIはインスタンス化時に関数ポインタをfooに渡し、fooはそれをデリゲートとして使用して、必要に応じて文字列をGUIに戻しました。いいえイベントは必要ありません:

public class foo { 

    public delegate void UpdateCallback(string msg); 
    private UpdateCallback _ucb; 
    public foo(UpdateCallback cb){ 
     _ucb = cb; 
    } 

    private void test(){ 
     if(_ucb != null) { 
      _ucb("Message Here"); 
     } 
    } 
} 

public partial class GUI : Form { 

    public GUI(){ 
      InitializeComponent(); 
      foo fooinstance = new foo(showmessage); 

    } 

    private void showmessage(string msg){ 
      //do whatever with the message 
    } 
} 
関連する問題