ج#:ربط البيانات بفئة واحدة مخصصة لعناصر التحكم في النموذج (مربع اختيار؟)

StackOverflow https://stackoverflow.com/questions/1805955

سؤال

أنا أكتب تطبيق سطح المكتب في Visual Studio 2008 / C#

لقد انتهيت (في الغالب) من كتابة محرك يقوم بإنشاء جدول عمل لمدة أسبوع لشركة صغيرة؛شكل من أشكال مشكلة جدولة المقرر الدراسي

أقوم الآن بتصميم نموذج يمكن للمستخدم من خلاله تحديد المعلمات أو المعايير الأولية التي يجب على المحرك الالتزام بها (نظرًا لأن بعض الإعدادات اختيارية)

لدي فئة تسمى EngineParameters، والتي تحتوي على كل هذه الإعدادات.

لغرض ربط البيانات، قمت بإنشاء ملف bndEngineParameters class، الذي يغلف جميع الحقول ذات الصلة باستخدام الحروف والمحددات

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;

ثم قمت بربط التحقق خاصية خانة الاختيار الخاصة بي إلى خاصية مصدر الربط الخاص بي:

alt text

لقد قمت بتنفيذ متغير محلي 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.Current (في وقت التشغيل بالطبع)، ولكن تجنبعطلات نهاية الأسبوع لا تتغير القيمة أبدًا (عندما أقوم بتحديد مربع الاختيار وإيقاف تشغيله)، و bndEngineParametersBindingSource_CurrentItemChanged لا يتم إطلاق الحدث أبدًا

ما هو الخطأ؟


آسف!إنه يتغير، ولكن فقط بعد أن تفقد خانة الاختيار التركيز (بعد التحقق من الصحة).

أنا غبي في بعض الأحيان

إذا كنت أفعل شيئًا خاطئًا على أي حال (لست جيدًا في ربط البيانات)، سأكون ممتنًا للغاية إذا أشرت إلى ذلك بالطبع!

هل كانت مفيدة؟

المحلول

مسألتان شائعتان:

  • تعيين 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; 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top