3

私は C# Windows フォーム (.NET 3.5) を使用しており、ユーザーが詳細フォームのデータ バインドされた列を変更し、保存せずにフォームを閉じようとしたときに機能を実装しようとすると、システムは「保存します」というメッセージをポップアップ表示する必要があります変化?」

TextChangedイベントをいつでも使用できることはわかっていますTextboxが、それには複数のイベントコーディングが必要です。my に関連付けられているフィールドの値の変化を検出する特定のイベント ハンドラーを使用したいと考えていBindingSourceます。

次のように列を制限しました。

textbox1.DataBindings.Add("Text", this.bindingSource1, "dbcolumn_1", true);
4

3 に答える 3

1

このようなものは機能しますか?

  1. フォームで changedFlag 変数を定義します。デフォルト値は false です。

    private changedFlag = false; // form value(s) changed, check it on form close

  2. これを終了ボタンのイベント ハンドラーに入れるか、フォームを閉じるハンドラーに適応させます。

        if (this.changedFlag && MessageBox.Show("Save your changes before exit?", "Save changes?", MessageBoxButtons.OKCancel) == DialogResult.OK)
        {
            this.Save();
        }
    
  3. コントロール コンテナーを受け取り、そのコントロールを再帰的に調べて、変更ハンドラー (手順 4 で定義) を関連付ける関数を作成します。

    private void AddOnChangeHandlerToInputControls(Control ctrl)
    {
        foreach (Control subctrl in ctrl.Controls)
        {
            if (subctrl is TextBox)
            {
                ((TextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
            }
            else if (subctrl is CheckBox)
            {
                ((CheckBox)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
            }
            else if (subctrl is RadioButton)
            {
                ((RadioButton)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
            }
            else if (subctrl is ListBox)
            {
                ((ListBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
            }
            else if (subctrl is ComboBox)
            {
                ((ComboBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
            }
            else
            {
                if (subctrl.Controls.Count > 0)
                {
                    this.AddOnChangeHandlerToInputControls(subctrl);
                }
            }
        }
    }
    
  4. changedFlag = true を設定する一般的な変更ハンドラ関数を作成します

    private void InputControls_OnChange(object sender, EventArgs e)
    {
        this.changedFlag = true;
    }
    
  5. コントロールが構築されるとすぐに(動的に作成しているかどうかはわかりませんがtextbox1、例で使用したので、そうではないと思います)、ステップ3の関数を呼び出して、入力のコンテナコントロールに渡します。

    AddOnChangeHandlerToInputControls(panelFormContainer);

フォーム コントロールのコンテナーを渡すことで、各コントロールの変更ハンドラーを手動で接続する必要がなくなります。そして、Save() 関数を変更してリセットすることを忘れないでくださいchangedFlag = false;

于 2012-11-30T19:46:16.633 に答える
0

on_closing イベント ハンドラを定義します。 http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onclosing.aspx

その中で、フォームを保存してダイアログとして開くかどうかを尋ねるフォームを起動して、フォーカスをそのフォームに強制します (リンクのサンプル コードは、このすべてを行う方法を示しています)。

于 2012-10-31T21:25:29.670 に答える