0

我有十个复选框和枚举。我想将此复选框绑定到枚举。问题是代码有很多一致性。

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,然后在 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

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。

然后在每个 CheckBox 的 Check 事件中,您只需调用方法:

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

使用 Checkbox 的 Tag 属性绝对是一个很好的调用。如果您将数据对象绑定到 UI 对象,这将使您的生活更轻松。

于 2012-06-13T18:21:24.667 回答
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 回答