C#: привязка данных к одному пользовательскому классу для формирования элементов управления (флажок?)



Я пишу настольное приложение в Visual Studio 2008 / C#



Я закончил (в основном) писать движок, который генерирует рабочий график на неделю для небольшой компании; форма задачи планирования курса



Прямо сейчас я разрабатываю форму, в которой пользователь может определить начальные параметры или критерии, которых должен придерживаться движок (поскольку некоторые настройки необязательны)



У меня есть класс с именем Engineerparameters, который содержит все эти настройки.



Для с целью привязки данных я создал класс 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 были привязаны к флажкам в моей форме



И именно на этой тривиальной задаче я неожиданно столкнулся с проблемами



Используя мастер "Добавить новый источник данных", я создал источник привязки



private System.Windows.Forms.BindingSource bndEngineParametersBindingSource;


Я тогда привязал свойство Checked моего Checkbox к соответствующему свойству моего источника привязки:



Alt текст http://i49.tinypic.com/muyhhi.jpg



Я реализовал локальную переменную 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);
}

// (...)
}


И что? Ничего не происходит. Существует объект bndEngineParameters под bndEngineParametersBindingSource.Текущий (во время выполнения, конечно), но avoidWeekends значение никогда не изменяется (когда я устанавливаю флажок ВКЛ. и выкл.), а событие bndEngineParametersBindingSource_currentitemchanged никогда не запускается



Что случилось?





Извините! он меняется, но только после того, как флажок теряет фокус (после проверки).



Иногда я веду себя глупо



Если я все равно делаю что-то не так (я не очень хорошо справляюсь с привязкой данных), я был бы очень признателен, если бы вы указали на это, конечно!

613   2  

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

Вместо этого:

bndEngineParametersBindingSource.Add(boundParameters); 

Сделайте так:

bndEngineParametersBindingSource.DataSource = boundParameters; 

Comments

    Ничего не найдено.