Как динамически активировать / деактивировать элементы контрольного списка в соответствии с выбранными элементами? - PullRequest
0 голосов
/ 21 мая 2009

У меня есть checkboxlist, который содержит список служб, загруженных из таблицы базы данных. Каждая из этих услуг может быть выполнена только одна или с некоторыми другими конкретными услугами. Например, если я выберу «Свойство передачи», я не смогу одновременно выбрать «Зарегистрироваться».

У меня есть таблица, которая содержит взаимосвязи между Сервисами и какие Сервисы могут быть выбраны вместе с каждой услугой (я правильно объяснил?).

Мне нужно щелкнуть службу, а затем отключить / запретить проверку всех служб, не связанных с этой службой, и повторно включить эти элементы, когда я сниму флажок с родительского элемента ...

Есть ли хороший способ сделать это? Я имею в виду, есть ли способ сделать это?

Ответы [ 4 ]

0 голосов
/ 21 мая 2009

Прежде всего, ваш 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");                                                
                }                   
            }
        }
    }
0 голосов
/ 21 мая 2009

1) Принудительно установите флажок для автоматической обратной отправки, а затем при обратной проверке проверьте, какое значение было отмечено / снято, а затем включите / отключите другие флажки при необходимости.

2) Попробуйте сделать нечто подобное с AJAX.

0 голосов
/ 21 мая 2009

Ну, возможно, лучше всего использовать 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;
        }
0 голосов
/ 21 мая 2009
    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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...