//(不要であれば削除すること) // P層フレームワークのイベント処理機能へ // コントロール イベントを追加するコード #region コントロールの検索、取得、イベントハンドラの設定処理 /// <summary>イベント追加処理</summary> private void addControlEvent() { if (!this.IsInitializedEvent) { #region Formイベント // Formイベント this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_CMNEventHandler); // FormのKeyイベント this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_KeyDownEventHandler); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_CMNEventHandler); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_KeyPressEventHandler); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_CMNEventHandler); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form_KeyUpEventHandler); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form_CMNEventHandler); #endregion #region Controlイベント // コントロール検索&イベントハンドラ設定 RcMyCmnFunction.GetCtrlAndSetClickEventHandler2(this, this.MyCreatePrefixAndEvtHndHt(), this.ControlHt); #endregion } }
/// <summary> /// 未処理例外をキャッチするイベント・ハンドラ /// </summary> /// <remarks> /// メイン・スレッド以外の例外はUnhandledExceptionでハンドル /// </remarks> public static void Application_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Exception ex = e.ExceptionObject as Exception; if (ex != null) { RcMyCmnFunction.ShowErrorMessageWin(ex, "Application_UnhandledExceptionによる例外通知です。"); } }
//(不要であれば削除すること) // P層フレームワークのイベント処理機能へ // コントロール イベントを追加するコード #region コントロールの検索、取得、イベントハンドラの設定処理 /// <summary>イベント追加処理</summary> private void addControlEvent() { #region Formイベント // Formイベント this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_CMNEventHandler); // FormのKeyイベント this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_KeyDownEventHandler); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_CMNEventHandler); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_KeyPressEventHandler); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_CMNEventHandler); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form_KeyUpEventHandler); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form_CMNEventHandler); #endregion #region コントロール取得処理 #region 旧処理 //// CHECK BOX //RcMyCmnFunction.GetCtrlAndSetClickEventHandler( // this, GetConfigParameter.GetConfigValue(MyLiteral.PREFIX_OF_CHECK_BOX), // new System.EventHandler(this.Check_CheckedChanged), this.ControlHt); ////// TOOL STRIP MENU ITEM(再起でファインドできないので各画面で設定) ////RcMyCmnFunction.GetCtrlAndSetClickEventHandler( //// this, GetConfigParameter.GetConfigValue("FxPrefixOfToolStripMenuItem"), //// new System.EventHandler(this.Button_Click), this.ControlHt); #endregion // プレフィックス string prefix = ""; // プレフィックスとイベント ハンドラのディクショナリを生成 Dictionary <string, object> prefixAndEvtHndHt = new Dictionary <string, object>(); // CHECK BOX prefix = GetConfigParameter.GetConfigValue(MyLiteral.PREFIX_OF_CHECK_BOX); if (!string.IsNullOrEmpty(prefix)) { prefixAndEvtHndHt.Add(prefix, new System.EventHandler(this.Check_CheckedChanged)); } // コントロール検索&イベントハンドラ設定 RcMyCmnFunction.GetCtrlAndSetClickEventHandler2(this, prefixAndEvtHndHt, this.ControlHt); #endregion }
/// <summary>動的に追加したコントロールをLstUserControlに追加する</summary> /// <param name="sender">object</param> /// <param name="e">ControlEventArgs</param> private void groupBox_ControlAdded(object sender, ControlEventArgs e) { // UOC_イベントハンドラ内で追加/削除すると例外が発生するのでBeginInvokeで書く。 this.BeginInvoke( (MethodInvoker <Control>)((x) => { // UserControlの追加処理 if (x is UserControl) { // コントロール検索&イベントハンドラ設定(ルートから1回だけ行う) RcFxCmnFunction.GetCtrlAndSetClickEventHandler2( x, this.CreatePrefixAndEvtHndHt(), this.ControlHt); // Base RcMyCmnFunction.GetCtrlAndSetClickEventHandler2( x, this.MyCreatePrefixAndEvtHndHt(), this.ControlHt); // MyBase // UserControlのLstUserControlへの追加(は再帰的に行う) this.AddToLstUserControl(x); } }), new object[] { e.Control }); }
//(不要であれば削除すること) // P層フレームワークのイベント処理機能へ // コントロール イベントを追加するコード #region コントロールの検索、取得、イベントハンドラの設定処理 /// <summary>イベント追加処理</summary> private void addControlEvent() { #region Formイベント // Formイベント this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_CMNEventHandler); // FormのKeyイベント this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_KeyDownEventHandler); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form_CMNEventHandler); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_KeyPressEventHandler); this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form_CMNEventHandler); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form_KeyUpEventHandler); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form_CMNEventHandler); #endregion #region コントロール取得処理 #region 旧処理 //// CHECK BOX //RcMyCmnFunction.GetCtrlAndSetClickEventHandler( // this, GetConfigParameter.GetConfigValue(MyLiteral.PREFIX_OF_CHECK_BOX), // new System.EventHandler(this.Check_CheckedChanged), this.ControlHt); ////// TOOL STRIP MENU ITEM(再起でファインドできないので各画面で設定) ////RcMyCmnFunction.GetCtrlAndSetClickEventHandler( //// this, GetConfigParameter.GetConfigValue("FxPrefixOfToolStripMenuItem"), //// new System.EventHandler(this.Button_Click), this.ControlHt); #endregion // コントロール検索&イベントハンドラ設定 RcMyCmnFunction.GetCtrlAndSetClickEventHandler2(this, this.MyCreatePrefixAndEvtHndHt(), this.ControlHt); #endregion }
// .NET TIPS > 適切に処理されなかった例外をキャッチするには? // http://www.atmarkit.co.jp/fdotnet/dotnettips/320appexception/appexception.html /// <summary> /// 未処理例外をキャッチするイベント・ハンドラ /// </summary> public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { RcMyCmnFunction.ShowErrorMessageWin(e.Exception, "Application_ThreadExceptionによる例外通知です。"); }
/// <summary>参照処理</summary> /// <remarks> /// 非同期フレームワークを使用してB層の呼び出し処理を非同期化 /// (結果表示にだけ匿名デリゲードを使用するパターン) /// </remarks> private void button6_Click(object sender, RoutedEventArgs e) { // 非同期処理クラスを生成 AsyncFunc af = new AsyncFunc(this); // 引数を纏める TestParameterValue testParameterValue = new TestParameterValue( this.Name, ((Button)sender).Name, "Select", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, this.myUserInfo); // 情報の設定 testParameterValue.ShipperID = int.Parse(this.textBox1.Text); // 引数を非同期処理クラスに設定 af.Parameter = testParameterValue; // 画面上のデータは退避する(オブジェクトであれば、クローンする。) af.LogicalName = ((ComboBoxItem)this.ddlTransmission.SelectedItem).Value; // 非同期実行するメソッドを指定 // ここは副スレッドから実行されるので注意。 af.AsyncFunc = new BaseAsyncFunc.AsyncFuncDelegate(af.btn6_Exec); // 結果表示のメソッドを指定(匿名デリゲード) // このメソッドは必ず主スレッドで実行される。 af.SetResult = delegate(object retVal) { if (retVal is Exception) { // 例外発生時 RcMyCmnFunction.ShowErrorMessageWPF((Exception)retVal, "非同期処理で例外発生!"); } else { // 正常時 // 戻り値(キャスト) TestReturnValue testReturnValue = (TestReturnValue)retVal; // 結果表示するメッセージ エリア this.labelMessage.Content = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) this.labelMessage.Content = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; this.labelMessage.Content += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; this.labelMessage.Content += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.textBox1.Text = testReturnValue.ShipperID.ToString(); this.textBox2.Text = testReturnValue.CompanyName; this.textBox3.Text = testReturnValue.Phone; } } }; // 非同期実行する。 if (!af.StartByThreadPool()) { MessageBox.Show("別の非同期処理が実行中です。"); } }
/// <summary>件数取得</summary> /// <remarks> /// 非同期フレームワークを使用してB層の呼び出し処理を非同期化 /// (非同期実行、結果表示の双方に匿名デリゲードを使用するパターン) /// </remarks> private void button1_Click(object sender, RoutedEventArgs e) { // 非同期処理クラスを生成 // 匿名デリゲードの場合は、ベース2で良い。 MyBaseAsyncFunc af = new MyBaseAsyncFunc(this); // 引数を纏め非同期処理クラスに設定 af.Parameter = (object)new TestParameterValue( this.Name, ((Button)sender).Name, "SelectCount", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, this.myUserInfo); // 画面上のデータは退避する //(オブジェクトであれば、クローンする。) string logicalName = ((ComboBoxItem)this.ddlTransmission.SelectedItem).Value; // 非同期実行するメソッドを指定(匿名デリゲード) // ここは副スレッドから実行されるので注意 // (画面上のメンバに触らないこと!)。 af.AsyncFunc = delegate(object param) { // 引数クラス(キャスト) TestParameterValue testParameterValue = (TestParameterValue)param; // 戻り値 TestReturnValue testReturnValue; // 呼出し制御部品(スレッドセーフでないため副スレッド内で作る) CallController callCtrl = new CallController(""); // Invoke testReturnValue = (TestReturnValue)callCtrl.Invoke( logicalName, testParameterValue); //// 進捗表示のテスト //af.ChangeProgress = delegate(object o) //{ // MessageBox.Show(o.ToString()); //}; //af.ExecChangeProgress("進捗表示"); //// 非同期メッセージボックス表示のテスト //MessageBoxResult mr = af.ShowAsyncMessageBoxWPF( // "メッセージ", "タイトル", MessageBoxButton.YesNo, MessageBoxImage.Information); //// 非同期メッセージボックス表示のテスト(エラー) //System.Windows.Forms.DialogResult dr = af.ShowAsyncMessageBoxWin("メッセージ", "タイトル", // System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information); // 結果表示 return(testReturnValue); }; // 結果表示のメソッドを指定(匿名デリゲード) // このメソッドは必ず主スレッドで実行される。 // (画面上のメンバを更新できる!)。 af.SetResult = delegate(object retVal) { if (retVal is Exception) { // 例外発生時 RcMyCmnFunction.ShowErrorMessageWPF((Exception)retVal, "非同期処理で例外発生!"); } else { // 正常時 // 戻り値(キャスト) TestReturnValue testReturnValue = (TestReturnValue)retVal; // 結果表示するメッセージ エリア this.labelMessage.Content = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) this.labelMessage.Content = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; this.labelMessage.Content += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; this.labelMessage.Content += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.labelMessage.Content = testReturnValue.Obj.ToString() + "件のデータがあります"; } } }; // 非同期実行する。 if (!af.StartByThreadPool()) { MessageBox.Show("別の非同期処理が実行中です。"); } }
/// <summary>件数取得</summary> /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param> /// <remarks> /// 非同期フレームワークを使用してB層の呼び出し処理を非同期化 /// (非同期実行、結果表示の双方に匿名デリゲードを使用するパターン) /// </remarks> protected void UOC_btnButton1_Click(RcFxEventArgs rcFxEventArgs) { // ↓カバレージ上げ //// Web認証情報 //this.CallCtrl.NetworkCredentialToWAS // = new NetworkCredential("test", "test", "test"); //// プロキシ(認証)情報 //this.CallCtrl.ProxyUrl = "http://xxx.xxx.xxx.xxx:8080"; //this.CallCtrl.NetworkCredentialToProxy // = new NetworkCredential("ptest", "ptest", "ptest"); // 非同期処理クラスを生成 // 匿名デリゲードの場合は、ベース2で良い。 MyBaseAsyncFunc af = new MyBaseAsyncFunc(this); // 引数を纏める af.Parameter = (object)new TestParameterValue( this.Name, rcFxEventArgs.ControlName, "SelectCount", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, MyBaseControllerWin.UserInfo); // 画面上のデータは退避する //(オブジェクトであれば、クローンする。) string logicalName = ((ComboBoxItem)this.ddlTransmission.SelectedItem).Value; // 非同期実行するメソッドを指定(匿名デリゲード) // ここは副スレッドから実行されるので注意 // (画面上のメンバに触らないこと!)。 af.AsyncFunc = delegate(object param) { // 引数クラス(キャスト) TestParameterValue testParameterValue = (TestParameterValue)param; // 戻り値 TestReturnValue testReturnValue; // 呼出し制御部品(スレッドセーフでないため副スレッド内で作る) CallController callCtrl = new CallController(Program.AccessToken); // Invoke testReturnValue = (TestReturnValue)callCtrl.Invoke( logicalName, testParameterValue); //// 進捗表示のテスト //af.ChangeProgress = delegate(object o) //{ // MessageBox.Show(o.ToString()); //}; //af.ExecChangeProgress("進捗表示"); //// 非同期メッセージボックス表示のテスト //DialogResult dr = af.ShowAsyncMessageBoxWin( // "メッセージ", "タイトル", MessageBoxButtons.YesNo, MessageBoxIcon.Information); ////// 非同期メッセージボックス表示のテスト(エラー) ////System.Windows.MessageBoxResult mr = af.ShowAsyncMessageBoxWPF("メッセージ", "タイトル", //// System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Information); // 結果表示 return(testReturnValue); }; // 結果表示のメソッドを指定(匿名デリゲード) // このメソッドは必ず主スレッドで実行される。 // (画面上のメンバを更新できる!)。 af.SetResult = delegate(object retVal) { if (retVal is Exception) { // 例外発生時 RcMyCmnFunction.ShowErrorMessageWin((Exception)retVal, "非同期処理で例外発生!"); } else { // 正常時 // 戻り値(キャスト) TestReturnValue testReturnValue = (TestReturnValue)retVal; // 結果表示するメッセージ エリア this.labelMessage.Text = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) this.labelMessage.Text = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; this.labelMessage.Text += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; this.labelMessage.Text += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.labelMessage.Text = testReturnValue.Obj.ToString() + "件のデータがあります"; } } }; // 非同期実行する。 if (!af.Start()) { MessageBox.Show("別の非同期処理が実行中です。"); } }
/// <summary>参照処理</summary> /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param> /// <remarks> /// 非同期フレームワークを使用してB層の呼び出し処理を非同期化 /// (結果表示にだけ匿名デリゲードを使用するパターン) /// </remarks> protected void UOC_btnButton6_Click(RcFxEventArgs rcFxEventArgs) { // 非同期処理クラスを生成 AsyncFunc af = new AsyncFunc(this); af.LogicalName = ((ComboBoxItem)this.ddlTransmission.SelectedItem).Value; // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.Name, rcFxEventArgs.ControlName, "Select", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, MyBaseControllerWin.UserInfo); // 情報の設定 testParameterValue.ShipperID = int.Parse(this.textBox1.Text); // 引数を非同期処理クラスに設定 af.Parameter = testParameterValue; // 非同期実行するメソッドを指定 // ここは副スレッドから実行されるので注意。 af.AsyncFunc = new BaseAsyncFunc.AsyncFuncDelegate(af.btn6_Exec); // 結果表示のメソッドを指定(匿名デリゲード) // このメソッドは必ず主スレッドで実行される。 af.SetResult = delegate(object retVal) { if (retVal is Exception) { // 例外発生時 RcMyCmnFunction.ShowErrorMessageWin((Exception)retVal, "非同期処理で例外発生!"); } else { // 正常時 // 戻り値(キャスト) TestReturnValue testReturnValue = (TestReturnValue)retVal; // 結果表示するメッセージ エリア this.labelMessage.Text = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) this.labelMessage.Text = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; this.labelMessage.Text += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; this.labelMessage.Text += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.textBox1.Text = testReturnValue.ShipperID.ToString(); this.textBox2.Text = testReturnValue.CompanyName; this.textBox3.Text = testReturnValue.Phone; } } }; // 非同期実行する。 if (!af.Start()) { MessageBox.Show("別の非同期処理が実行中です。"); } }