WinForm নিয়ন্ত্রণের দায়িত্ব পালনে - একে অপরের কর্ম সম্পর্কে সচেতন থাকতে হবে?

আমি একটি ফর্ম উপর নিয়ন্ত্রণ একটি মুষ্টিমেয় আছে:

  • একটি চেক বাক্স যা তার চেকযুক্ত অবস্থার উপর ভিত্তি করে পৃষ্ঠায় অন্যান্য সমস্ত নিয়ন্ত্রণগুলি সক্ষম/অক্ষম করতে দায়ী।
  • কয়েকটি রেডিও বোতাম যা তাদের চেকডেড স্টেটগুলির উপর ভিত্তি করে পৃষ্ঠাটিতে নির্দিষ্ট নিয়ন্ত্রণগুলি সক্ষম/অক্ষম করতে দায়বদ্ধ।
  • উপরের নিয়ন্ত্রণগুলি দ্বারা ব্যবহৃত হয় এমন অন্যান্য নিয়ন্ত্রণ।

কিছু পরিস্থিতিতে উঠতে পারে:

  • যখন ফর্ম শুরু হয়, আমি চেকবক্সের অবস্থা লোড করি। তারপর, এটি ফর্মের বাকি নিয়ন্ত্রণকে সক্ষম বা অক্ষম করে।
  • ফর্মটি শুরু হওয়ার সাথে সাথে, আমি রেডিও বোতামগুলির অবস্থা লোড করি। একটি রেডিও বাটন চেক করা কিন্তু অক্ষম থাকলে এটি পূর্ববর্তী প্রয়োজনীয়তা পূর্বাবস্থায় ফেলার সুযোগ রয়েছে। যেমন, আমি প্রথমে নিশ্চিত করতে চাই যে রেডিও বোতামটি প্রথমে সক্রিয় আছে।
  • ফর্মটি লোড করার পরে ব্যবহারকারী রেডিও বাটন চেক বা আনচেক করতে পারেন। এটি একটি তুচ্ছ মামলা, আমি শুধু কোড যা শেষ প্রয়োজন পূর্ণ চালানো। আরেকটি কেস, যদিও, ব্যবহারকারী চেকবক্সটি চেক/অনির্ধারণ চেক করতে পারেন। যখন চেকবক্সটি সক্ষম হয়ে যায় তখন এটি সমস্ত নিয়ন্ত্রণগুলিকে পুনরায় পৃষ্ঠাতে সক্ষম করতে চায় কারণ এটি তাদের অক্ষম করেছে এমন করলে রেডিও বোতামের প্রয়োজনীয়তাগুলি ভেঙ্গে যাবে।

এই দৃশ্যকল্প প্রাণঘাতী বল সঙ্গে হ্যান্ডেল চমত্কার তুচ্ছ হয়। হাইলাইট করার জন্য আমি কয়েকটি পদ্ধতি তৈরি করেছি:

private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
{
    snmpSettingsErrorProvider.Clear();

    foreach (Control control in grpBxSNMPv3.Controls)
    {
        if (control != sender)
            control.Enabled = ((CheckBox)sender).Checked;
    }
}

private void rdBtnAuthNoPriv_CheckedChanged(object sender, EventArgs e)
{
    RadioButton authNoPrivRadioButton = ((RadioButton)sender);

    if (authNoPrivRadioButton.Enabled)
    {
        bool isChecked = authNoPrivRadioButton.Checked;

        SetControlState(cmbBxAuthProtocol, isChecked);
        SetControlState(mskdTxtBxAuthPassword, isChecked);
        SetControlState(mskdTxtBxAuthPasswordConfirm, isChecked);

        SetControlState(cmbBxPrivacyProtocol, !isChecked);
        SetControlState(mskdTxtBxPrivacyPassword, !isChecked);
        SetControlState(mskdTxtBxPrivacyPasswordConfirm, !isChecked);
    }
}
//More methods for other checkedChange and also for when rdBtn's enable.

বিন্যাসের রুক্ষ ধারণা:

enter image description here

যে সব বলেন, আমার প্রশ্ন 'সহজ':

  • অন্য পদ্ধতির বিদ্যমান অনুমান ছাড়া পদ্ধতিগুলি কাজ করা উচিত। তবুও, যদি আমি chkBx এর অস্তিত্বের rdBtn এর লজিক নাচ রাখি তবে আমার কাছে কোড থাকবে যা একে অপরকে যুদ্ধ করতে হবে।

আমি এই মত আমার কোড লিখতে পারে:

private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
{
    snmpSettingsErrorProvider.Clear();

    txtBxEngineID = ((CheckBox)sender).Checked;
    rdBtnAuthNoPriv = ((CheckBox)sender).Checked;
    rdBtnAuthPriv = ((CheckBox)sender).Checked;
    rdBtnNoAuthNoPriv = ((CheckBox)sender).Checked;

    //Pass work for enabling Auth and Priv fields to rdBtn events.
}

এই সমাধান আরও দক্ষ এবং গ্যারান্টী আমি কোন ঝিকিমিকি দেখতে পাবেন না। তবুও, এর মানে হল যে আমার 'chkBx' পৃষ্ঠায় সমস্ত নিয়ন্ত্রণ সক্রিয় করার একটি 'সফল সমাপ্তির' জন্য এখন rdbtn এর যুক্তি উপর নির্ভর করতে হয়। এই ভাল প্রোগ্রামিং অনুশীলন হয়?

3
যোগ সম্পাদিত
মতামত: 1
আরে, দুঃখিত। আমি সম্মত - আমার প্রাথমিক পোস্ট যথেষ্ট জ্ঞান করা হয় না। আমি আজকে এটি সম্পাদনা করব যখন আমার কিছুটা সময় আছে যা ঐতিহ্যগত উদ্দেশ্যের জন্য আরও বোধগম্য হতে পারে। আমি আপনার দ্বিতীয় পয়েন্ট দ্বারা বিভ্রান্ত করছি, যদিও। যদি একক শ্রেণী জড়িত থাকে তবে কি ঘটবে না? আপনি কি আমার জন্য যে পড়া আপ পড়া আছে? কোড একটি ইউজার কন্ট্রোলের উপর থাকে যা একটি ফর্মের উপর লোড করা হয়।
যোগ লেখক Sean Anderson, উৎস
প্রশ্ন অনেক বুঝতে পারে না, এইগুলি ইতিমধ্যেই ফর্ম এ বিদ্যমান কোডগুলির স্নিপেট। অথবা ইউজার কন্ট্রোল, বলতে পারবে না। কন্ট্রোল ক্লাসের ভিতরে যে কোড নেই কোন কোনটি ঘটনাগুলি ঘটছে, কোন ধরণের অন্য কোড জানাচ্ছে যে কিছু আকর্ষণীয় ঘটনা ঘটেছে। এই কোডটি অনেকটা ফর্মের অন্তর্গত, কেবলমাত্র বর্গ নিয়ন্ত্রণের সংগ্রহ সম্পর্কে কিছু জানে যা হোস্ট করে।
যোগ লেখক Hans Passant, উৎস

2 উত্তর

আমি মনে করি এই ফর্ম রাখতে বুদ্ধিমান কোড, তবে আমি কিছু পরামর্শ করতে চাই;

1) কাস্টিং একটি ছোট প্রক্রিয়াজাতকরণ খরচ আছে তাই আপনি একটি লুপ ভিতরে কাস্টিং এড়ানোর উচিত। প্রকৃতপক্ষে, একটি সাধারণ ধারণা হিসাবে, ফলাফলটি একই অবস্থায় থাকা নিশ্চিত করা হলে আপনি একটি লুপের মধ্যে কোনও পুনরাবৃত্তিমূলক পদক্ষেপ না করা উচিত। তাই আপনি আপনার মত প্রথম পদ্ধতি উন্নত করতে পারে;

private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
{
    snmpSettingsErrorProvider.Clear();

   //cast the sender once only
    CheckBox cb = sender as CheckBox;
    if (null == cb) return;

    foreach (Control control in grpBxSNMPv3.Controls)
    {
        if (control != sender)
            control.Enabled = cb.Checked;
    }
}

2) আমি একটি আলাদা পদ্ধতি সক্রিয়/নিষ্ক্রিয় যুক্তি আউট সরানোর সুপারিশ চাই, এবং তারপর আপনার নিয়ন্ত্রণ ইভেন্ট হ্যান্ডলার থেকে এটি কল এটি আপনি অন্য যুক্তি থেকে সিদ্ধান্ত নিতে হবে একই যুক্তি পুনঃব্যবহার করতে সক্ষম হবে। ইভেন্টগুলি নিয়ন্ত্রণ করার জন্য কঠোরভাবে কৌশলের আচরণ, আমি খুঁটিনাটি কোডের দিকে পরিচালিত করি। তাই ভালো;

private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
{
    snmpSettingsErrorProvider.Clear();

   //cast the sender once only
    CheckBox cb = sender as CheckBox;
    if (null == cb) return;

    SetEnabled(grpBxSNMPv3, cb.Checked, new[] { cb });
}

private void SetEnabled(Control parent, bool isEnabled, Control[] exludeControls)
{
    if (null == parent) return;

    foreach (Control control in parent.Controls)
    {
        if (!excludeControls.Contains(control))
            control.Enabled = isEnabled;
    }
}

আপনি এখন অন্য দ্বারা নিয়ন্ত্রিত সমস্ত নিয়ন্ত্রণ সক্ষম/নিষ্ক্রিয় করার জন্য একটি পুনর্ব্যবহারযোগ্য পদ্ধতি পেয়েছেন।

3) আপনার চূড়ান্ত প্রশ্ন সম্পর্কে, হ্যাঁ আমি এই পদ্ধতিটি সূক্ষ্ম মনে হয়। কম কাপলিং সবসময় ভাল জিনিস। আরো পদ্ধতিতে পুনর্ব্যবহারযোগ্য করার জন্য আপনার পদ্ধতিগুলি ডিজাইন করার বিষয়ে চিন্তা করুন, এবং আমি মনে করি আপনি একটি পরিষ্কার সমাধান নিয়ে আসবেন।

1
যোগ
প্রস্তাবনার জন্য +1 আমি আসলে আমার থ্রেড আপডেট করার আগে এই সমস্ত পরামর্শ অনুসরণ শেষ করেছি - তাই মহান মন একইভাবে মনে করি। আমি এগিয়ে গিয়ে ভবিষ্যতের লোকেদের জন্য একটি পরিষ্কার সমাধান পোস্ট করেছি। যদি আপনি এটি সম্পর্কে দরিদ্র কিছু দেখতে আমাকে জানাতে হবে। :)
যোগ লেখক Sean Anderson, উৎস

এই আমি শেষ সঙ্গে যাচ্ছি। আমি তালিকায় এর পাশাপাশি একেবারে ঠিক আছি আমি শুরু করছি। তাদের সম্ভবত তাদের নিজস্ব নিয়ন্ত্রণ থাকা উচিত, কিন্তু আমি নিজেকে এখনও তা করতে পারি না।

public partial class DeviceSnmpSettings : UserControl, INotifyPropertyChanged
{
    private readonly List AuthenticationControls = new List(6);
    private readonly List PrivacyControls = new List(6);
    public event PropertyChangedEventHandler PropertyChanged;

    public DeviceSnmpSettings()
    {
        InitializeComponent();
        InitializeAuthControls();
        InitializePrivacyControls();
    }

    public DeviceSnmpSettings(Point location)
        : this()
    {
        Location = location;
    }

    //TODO: Move out into sub-user control?
    private void InitializeAuthControls()
    {
        AuthenticationControls.Add(lblAuthPassword);
        AuthenticationControls.Add(mskdTxtBxAuthPassword);
        AuthenticationControls.Add(lblAuthProtocol);
        AuthenticationControls.Add(cmbBxAuthProtocol);
        AuthenticationControls.Add(lblAuthPasswordConfirm);
        AuthenticationControls.Add(mskdTxtBxAuthPasswordConfirm);
    }
    //TODO: Move out into sub-user control?
    private void InitializePrivacyControls()
    {
        PrivacyControls.Add(lblPrivacyPassword);
        PrivacyControls.Add(mskdTxtBxPrivacyPassword);
        PrivacyControls.Add(lblPrivacyProtocol);
        PrivacyControls.Add(cmbBxPrivacyProtocol);
        PrivacyControls.Add(lblPrivacyPasswordConfirm);
        PrivacyControls.Add(mskdTxtBxPrivacyPasswordConfirm);
    }

    private bool SNMPv3Enabled
    {
        get { return chkBxSNMPv3.Checked; }
        set { chkBxSNMPv3.Checked = value; }
    }

    private SNMPV3Mode SecurityMode
    {
        get
        {
            SNMPV3Mode mode = SNMPV3Mode.NoAuthNoPriv;

            if (rdBtnAuthNoPriv.Checked)
                mode = SNMPV3Mode.AuthNoPriv;
            else if(rdBtnAuthPriv.Checked)
                mode = SNMPV3Mode.AuthPriv;

            return mode;
        }
        set
        {
            switch (value)
            {
                case SNMPV3Mode.NoAuthNoPriv:
                    rdBtnNoAuthNoPriv.Checked = true;
                    break;
                case SNMPV3Mode.AuthNoPriv:
                    rdBtnAuthNoPriv.Checked = true;
                    break;
                default:
                    rdBtnAuthPriv.Checked = true;
                    break;
            }

            OnSecurityModeChanged();
        }
    }

    protected virtual void OnSecurityModeChanged()
    {
        AuthenticationControls.ForEach(control => SetControlEnabledState(control, AuthenticationEnabled));
        PrivacyControls.ForEach(control => SetControlEnabledState(control, PrivacyEnabled));
        NotifyPropertyChanged("SecurityMode");
    }

    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }

    private bool AuthenticationEnabled
    {
        get
        {
            return SNMPv3Enabled && (SecurityMode == SNMPV3Mode.AuthPriv || SecurityMode == SNMPV3Mode.AuthNoPriv);
        }
    }

    private bool PrivacyEnabled
    {
        get { return SNMPv3Enabled && SecurityMode == SNMPV3Mode.AuthPriv; }
    }

    private void ChkBxSnmPv3OnCheckedChanged(object sender, EventArgs eventArgs)
    {
        SetControlEnabledStates();
    }

    private void SetControlEnabledStates()
    {
        snmpSettingsErrorProvider.Clear();

        foreach (Control control in grpBxSNMPv3.Controls)
        {
            //Check each of the lists for the control to prevent flickering.
            if (control != chkBxSNMPv3 && !AuthenticationControls.Contains(control) && !PrivacyControls.Contains(control))
                control.Enabled = SNMPv3Enabled;
        }

        //Need to validate that our radio button's checked state is reflected properly.
        AuthenticationControls.ForEach(control => SetControlEnabledState(control, AuthenticationEnabled));
        PrivacyControls.ForEach(control => SetControlEnabledState(control, PrivacyEnabled));
    }

    public void LoadFields(NetworkDiscovery networkDiscovery)
    {
        SNMPv3Enabled = networkDiscovery.Snmpv3Enabled;
        SecurityMode = networkDiscovery.SecurityMode;
        txtBxSNMPv3Username.Text = networkDiscovery.Username;
        mskdTxtBxAuthPassword.Text = networkDiscovery.AuthPassword;
        mskdTxtBxAuthPasswordConfirm.Text = networkDiscovery.AuthPassword;
        cmbBxAuthProtocol.SelectedItem = networkDiscovery.AuthProtocol.ToString();
        mskdTxtBxPrivacyPassword.Text = networkDiscovery.PrivacyPassword;
        mskdTxtBxPrivacyPasswordConfirm.Text = networkDiscovery.PrivacyPassword;
        cmbBxPrivacyProtocol.SelectedItem = networkDiscovery.PrivacyProtocol.ToString();

        SetControlEnabledStates();
    }

    private void SetControlEnabledState(Control control, bool enabled)
    {
        control.Enabled = enabled;
                    //Clear errors set on errorProvider when control is disabled.
        if (!control.Enabled)
            snmpSettingsErrorProvider.SetError(control, string.Empty);
    }

    private void rdBtnNoAuthNoPriv_CheckedChanged(object sender, EventArgs e)
    {
        if (((RadioButton)sender).Checked)
            SecurityMode = SNMPV3Mode.NoAuthNoPriv;
    }

    private void rdBtnAuthNoPriv_CheckedChanged(object sender, EventArgs e)
    {
        if (((RadioButton)sender).Checked)
            SecurityMode = SNMPV3Mode.AuthNoPriv;
    }

    private void rdBtnAuthPriv_CheckedChanged(object sender, EventArgs e)
    {
        if (((RadioButton)sender).Checked)
            SecurityMode = SNMPV3Mode.AuthPriv;
    }
}
0
যোগ