3

Visual Studio 2008 / C# でデスクトップ アプリケーションを作成しています。

小さな会社の 1 週間の勤務スケジュールを生成するエンジンを (ほとんど) 書き終えました。コーススケジューリング問題の一種

現在、エンジンが準拠するための初期パラメーターまたは基準をユーザーが決定できるフォームを設計しています (一部の設定はオプションであるため)。

これらの設定をすべて保持する EngineParameters という名前のクラスがあります。

データバインディングのために、関連するすべてのフィールドをゲッターとセッターでカプセル化するbndEngineParametersクラスを作成しました。

public class bndEngineParameters
    {
        private engineParameters _parameters;

        public bndEngineParameters(engineParameters ep)
        {
            this._parameters = ep;                
        }

        public bool avoidGrouping
        {
            get { return _parameters.avoidGrouping; }
            set { _parameters.avoidGrouping = value; }
        }

        public bool avoidWeekends
        {
            get { return _parameters.avoidWeekends; }
            set { _parameters.avoidWeekends = value; }

        }

        public bool keyFlow
        {
            get { return _parameters.keyFlow; }
            set { _parameters.keyFlow = value; }
        }

        public bool keyFlowAssistants
        {
            get { return _parameters.keyFlowAssistants; }
            set { _parameters.keyFlowAssistants = value; }
        }        
    }

完全ではありません - int 値があります (作業できる最大時間数など)。これらの bool 値をフォームのチェックボックスにバインドしたい

そして、私が驚くべきことに問題に遭遇したのは、その些細な作業でした

「Add New DataSource」ウィザードを使用して、バインディング ソースを作成しました

private System.Windows.Forms.BindingSource bndEngineParametersBindingSource;

次に、Checkbox のCheckedプロパティをバインディング ソースのそれぞれのプロパティにバインドします。

代替テキスト

ユーザーが設定したパラメーターにアクセスできるように、ローカル変数boundParametersを実装しました

  public partial class formGenerateRota : Form
    {

        public bndEngineParameters boundParameters;

        // (...)

        public formGenerateRota()
        {
            InitializeComponent();
        }        

        private void formGenerateRota_Load(object sender, EventArgs e)
        {
            boundParameters = new bndEngineParameters(new engineParameters());
            bndEngineParametersBindingSource.Add(boundParameters);            
        }

        // (...)
}

そして何?何も起こりません。bndEngineParametersBindingSource.Current の下にbndEngineParametersオブジェクトがあります(もちろん実行時) が、avoidWeekendsの値は決して変化せず (チェックボックスのオンとオフをチェックしても)、bndEngineParametersBindingSource_CurrentItemChangedイベントは発生しません。

どうしたの?


ごめん!変更されますが、チェックボックスがフォーカスを失った後(検証後)のみです。

私は時々愚かです

とにかく私が何か間違ったことをしている場合 (私はデータバインディングが得意ではありません)、もちろん指摘していただければ幸いです!

4

2 に答える 2

5

2 つの一般的な問題:

  • に設定DataSourceUpdateModeしますOnPropertyChanged
  • (オプション)オブジェクトから{name}Changed変更を受け取る、イベント パターンを実装する、またはINotifyPropertyChanged

正直に言うと、そのほとんどは必要ないと確信しています。あなたはただ言うことができるはずです:

myCheckbox.Bindings.Add("Checked", myEngineParameters, "avoidWeekends",
    false, DataSourceUpdateMode.OnPropertyChanged);

完全な例:

using System;
using System.Diagnostics;
using System.Windows.Forms;

class EngineParameters {
    private bool avoidWeekends;
    public bool AvoidWeekends {
        get { return avoidWeekends; }
        set {
            avoidWeekends = value;
            Debug.WriteLine("AvoidWeekends => " + value);
        }
    }
}
static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();            
        using(Form form = new Form())
        using (CheckBox myCheckbox = new CheckBox()) {
            EngineParameters myEngineParameters = new EngineParameters();
            myEngineParameters.AvoidWeekends = true;    
            form.Controls.Add(myCheckbox);
            myCheckbox.DataBindings.Add("Checked", myEngineParameters, "AvoidWeekends",
                false, DataSourceUpdateMode.OnPropertyChanged);
            Application.Run(form);
        }
    }
}
于 2009-11-26T22:35:43.430 に答える
2

これの代わりに:

bndEngineParametersBindingSource.Add(boundParameters); 

これを行う:

bndEngineParametersBindingSource.DataSource = boundParameters; 
于 2009-11-26T22:39:25.600 に答える