【问题标题】:C#: data binding a single, custom class to form controls (checkbox?)C#:将单个自定义类数据绑定到表单控件(复选框?)
【发布时间】:2010-12-20 19:52:58
【问题描述】:

我正在用 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 事件永远不会触发

怎么了?


对不起!它确实会改变,但只有在复选框失去焦点之后(验证之后)。

有时候我很傻

如果我做错了什么(我不擅长数据绑定),如果您指出这一点,我将不胜感激!

【问题讨论】:

  • 重新跟进;看到我说的第一件事:将 DataSourceUpdateMode 设置为 OnPropertyChanged;目前是 OnValidation - 即当你失去焦点时。

标签: c# .net data-binding checkbox bindingsource


【解决方案1】:

两个常见问题:

  • 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);
        }
    }
}

【讨论】:

    【解决方案2】:

    而不是这个:

    bndEngineParametersBindingSource.Add(boundParameters); 
    

    这样做:

    bndEngineParametersBindingSource.DataSource = boundParameters; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2012-01-25
      • 2013-12-26
      • 1970-01-01
      • 2020-05-29
      • 2018-06-08
      • 2011-02-22
      相关资源
      最近更新 更多