3

我正在 Visual Studio 2008 / C# 中编写桌面应用程序

我完成了(大部分)编写了一个引擎,它为一家小公司生成了一周的工作时间表;课程安排问题的一种形式

现在我正在设计一个表单,用户可以在其中确定引擎要遵守的初始参数或标准(因为某些设置是可选的)

我有一个名为 EngineParameters 的类,它包含所有这些设置。

出于数据绑定的目的,我创建了一个bndEngineParameters类,它用 getter 和 setter 封装了所有相关字段

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 值(一个人可以工作的最大小时数等);我希望将这些布尔值绑定到表单上的复选框

正是在那个微不足道的任务中,我出人意料地遇到了问题

使用“添加新数据源”向导,我创建了一个绑定源

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

两个常见问题:

  • 设置DataSourceUpdateModeOnPropertyChanged
  • (可选)从对象接收更改,实现{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 回答