如何根据选中的项目动态激活/停用清单项目?

时间:2009-05-21 02:10:47

标签: c# .net asp.net visual-studio-2008

我有一个checkboxlist,其中包含从数据库表中加载的服务列表。这些服务中的每一项只能单独执行或与其他某些特定服务一起执行。例如,如果我选择“转移属性”,则无法同时选择“注册”。

我有一个表格,其中包含服务与可以与每项服务一起选择的服务之间的关系(我是否正确解释过了?)。

我需要的是点击服务,然后禁用/禁止检查与该服务无关的所有服务,并在取消选中父项时重新启用这些项...

这样做有好办法吗?我的意思是,有没有办法做到这一点?

4 个答案:

答案 0 :(得分:0)

    void ControlCheckBoxList(int selected, bool val)
    {
        switch (selected)
        {
            case 1:
            case 2:
            case 3:
                checkedListBox1.SetItemChecked(5, !val);
                break;
            case 6:
                checkedListBox1.SetItemChecked(1, true);
                break;
            default:
                checkedListBox1.ClearSelected();
                break;
        }
    }

    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        ControlCheckBoxList(e.Index, e.NewValue == CheckState.Checked ? true : false);
    }

答案 1 :(得分:0)

1)强制你的复选框自动回发,然后在帖子后面检查检查/取消选中的值,然后根据需要启用/禁用其他复选框。

2)尝试用AJAX做类似的事情。

答案 2 :(得分:0)

嗯,javascript可能最适合做这个客户端,否则你可以在代码中尝试这样的东西。

        List<Service> services = new List<Service>(); //get your services

        foreach (ListItem li in lstRoles.Items)
        {
            Predicate<Service> serviceIsAllowed = delegate (Service s) { return /*some expression using s and li.Value (or use a lambda expr) */; }

            li.Selected = services.Find(serviceIsAllowed) != null;
        }

答案 3 :(得分:0)

首先,你的CheckBoxList需要将AutoPostBack设置为true。

我相信你所寻找的关键是

   CheckBoxList1.Items.FindByText(service).Enabled = false;

或者这也有效

   CheckBoxList1.Items.FindByText(service).Attributes.Add("disabled", "disabled"); 

在上下文中,它可能看起来像这样:

    <asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="True" 
        onselectedindexchanged="CheckBoxList1_SelectedIndexChanged">        
    </asp:CheckBoxList>

    protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)
    {

        //first reset all to enabled
        for (int i = 0; i < CheckBoxList1.Items.Count; i++)
        {
            CheckBoxList1.Items[i].Attributes.Remove("disabled", "disabled");
        }

        for (int i = 0; i < CheckBoxList1.Items.Count; i++)
        {

            if (CheckBoxList1.Items[i].Selected)
            {
                //get list of items to disable
                string selectedService = CheckBoxList1.Items[i].Text;
                List<string> servicesToDisable = getIncompatibleFor(selectedService);//this function is up to u
                foreach (string service in servicesToDisable)
                {
                    CheckBoxList1.Items.FindByText(service).Attributes.Add("disabled", "disabled");                                                
                }                   
            }
        }
    }