0

10個のチェックボックスと列挙型があります。このチェックボックスを列挙型にバインドしたいと思います。問題は、コードの一貫性が非常に高いことです。

public partial class RightsSetForm : Form
    {
        public RightsEnum rights;
        public int count = 1;
        public RightsSetForm()
        {
            InitializeComponent();
            rights |= RightsEnum.notify;
        }

        private void chkNotify_CheckedChanged(object sender, EventArgs e)
        {

            if (chkNotify.Checked)
            {
                rights |= RightsEnum.notify;
                count++;
            }
            else
            {
                rights ^= RightsEnum.notify;
                count--;
            }
        }

        private void chkFriends_CheckedChanged(object sender, EventArgs e)
        {
            if (chkFriends.Checked)
            {
                count++;
                rights |= RightsEnum.friends;
            }
            else
            {
                rights ^= RightsEnum.friends;
                count--;
            }
        }
}

単純化することは可能ですか?

4

3 に答える 3

2

送信者をCheckBoxとしてキャストする各チェックボックスに1つのイベントハンドラーを割り当ててから、Nameプロパティ(CheckBoxのラベル)のステートメントを切り替えて列挙型を選択することができます。何かのようなもの:

private void checkbox_CheckedChanged(object sender, EventArgs e)
{
    var checkBox = (CheckBox)sender;

    RightsEnum rightsEnum = RightsEnum.notify;
    switch (checkBox.Name)
    {
        case "chkNotify":
            rightsEnum = RightsEnum.notify;
            break;
        case "chkFriends":
            rightsEnum = RightsEnum.friends;
            break;    
        // to do:  add the remaining 8       
    }

    if (checkBox.Checked)
    {
         count++;
         rights |= rightsEnum;
    }
    else
    {
         rights ^= rightsEnum;
         count--;
    }
}
于 2012-06-13T18:12:11.270 に答える
1

プロパティを使用しControl.Tagて各チェックボックスの列挙値を格納し、共通のCheckedChangedイベントハンドラーを使用します。

chkFriends.Tag = RightsEnum.friends;
chkNotify.Tag = RightsEnum.notify;

chkFriends.CheckedChanged += enumCheckedChanged;
chkNotify.CheckedChanged += enumCheckedChanged;

共通イベントハンドラーはCheckboxasを受け取り、以下senderから列挙値を抽出できますTag

void enumCheckedChanged(object sender, EventArgs e)
{
    var checkbox = (Checkbox)sender;

    var flag = (RightsEnum)checkbox.Tag;

    if (checkbox.Checked)
    {
        count++;
        rights |= flag;
    }
    else
    {
        rights ^= flag;
        count--;
    }
}
于 2012-06-13T18:13:09.033 に答える
1

Inmxは良いスタートを切っていますが、彼はいくつかのことを見逃していました。

private void enumCheckedChanged(Checkbox pBox, bool pbAddFirst) {
    if (!(pBox.Tag is RightsEnum)) return;

    RightsEnum flag = pBox.Tag as RightsEnum;

    if (pBox.Checked && pbAddFirst) {
         count++;
         rights |= flag;
    }
    else if (pBox.Checked && !pbAddFirst) {
         rights |= flag;
         count++;
    }
    // Having checked for both variations of pbAddFirst, the only thing left would be if pBox.Checked is false
    else {
         rights ^= flag;
         count--;
    }
}

最初にカウントを減算する必要がある場合は、いつでもpbAddFirstを使用してelseを再度変更できます。

次に、各チェックボックスのCheckイベントで、メソッドを呼び出すだけです。

private void chkFriends_CheckedChanged(object sender, EventArgs e){
    enumCheckedChanged(chkFriends, true);
}

チェックボックスのTagプロパティを使用することは間違いなく良い呼び出しです。これにより、データオブジェクトをUIオブジェクトに関連付けると、作業が大幅に楽になります。

于 2012-06-13T18:21:24.667 に答える