代码之家  ›  专栏  ›  技术社区  ›  Konrad Morawski

C:将单个自定义类绑定到表单控件的数据(复选框?)

  •  3
  • Konrad Morawski  · 技术社区  · 15 年前

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

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

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

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

    为了进行数据绑定,我创建了一个 bn线性参数 类,它用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值(一个人可以工作的最大小时数等);我希望将这些bool值绑定到表单上的复选框

    在那件小事上,我意外地遇到了问题

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

    private System.Windows.Forms.BindingSource bndEngineParametersBindingSource;
    

    然后我把 选中的 我的复选框属性到绑定源的相应属性:

    alt text http://i49.tinypic.com/muyhhi.jpg

    我实现了一个局部变量 边界参数 以便访问用户设置的参数

      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);            
            }
    
            // (...)
    }
    

    那又怎样?什么都没发生。下有一个bndengineParameters对象 bndengineParameters绑定源。当前 (当然是在运行时),但是 避免周末 值永远不会改变(当我选中复选框打开和关闭时),并且 bndengineparametersbindingsource_currentItemChanged 事件从不激发

    发生了什么?


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

    我有时候很笨

    如果我做错了什么(我不擅长数据绑定),我会非常感谢你指出的当然!

    2 回复  |  直到 15 年前
        1
  •  4
  •   Marc Gravell    15 年前

    两个常见问题:

    • 设置 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
  •  2
  •   Pavel Minaev    15 年前

    而不是这个:

    bndEngineParametersBindingSource.Add(boundParameters); 
    

    这样做:

    bndEngineParametersBindingSource.DataSource = boundParameters;