Проблема с отключением кнопок на C # - PullRequest
5 голосов
/ 16 февраля 2010

Хорошо, поэтому я пытаюсь переместить элементы из одного списка в другое, используя несколько кнопок, т. Е.

У меня есть 2 кнопки cmdRight и cmdRight2, которые отключены при загрузке формы

Если пользователь выбирает один элемент в первом списке, кнопка cmdRIght активируется, но cmdRight2 по-прежнему отключена, если пользователь выбирает несколько элементов в первом списке, кнопка cmdRight2 активируется, но cmdRight отключается.

У меня работают кнопки перемещения, но у меня проблема в том, что после перемещения нескольких элементов с помощью кнопки cmdRight2 кнопка cmdRight включается (чего не должно быть, она должна включаться только после выбора одного элемента в списке). ). Я пробовал множество утверждений if и т. Д., И все же это все еще происходит.

Я новичок в C #, поэтому любая помощь будет принята.

Спасибо

        private void lbList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.lbList1.SelectedItems != null)
            {
                cmdRight.Enabled = true; //enable cmdRight
                cmdClear.Enabled = true; //enable cmdClear
                if (this.lbList1.SelectedItems.Count > 1)//if multiple items selected
                {
                    cmdRight.Enabled = false;
                    cmdRight2.Enabled = true; //enable cmdRight2              
                }
            }
        }


    private void cmdRight2_Click(object sender, EventArgs e)
    {
        foreach (int i in lbList1.SelectedIndices)
        {
            lbList2.Items.Add(lbList1.Items[i].ToString());
        }
        while (lbList1.SelectedItems.Count > 0)
        {
            lbList1.Items.Remove(lbList1.SelectedItems[0]);
        }
        cmdRight2.Enabled = false;

    }

    private void cmdRight_Click(object sender, EventArgs e)
    {
        lbList2.Items.Add(lbList1.SelectedItem); //Add selected item from list1 to list2
        lbList1.Items.Remove(lbList1.SelectedItem);//remove the selected item in list1

        cmdRight.Enabled = false; //disable cmdRight
    }

Ответы [ 3 ]

3 голосов
/ 16 февраля 2010

Как насчет создания одного метода EnableButtons, который включает / отключает кнопки в соответствии с заданными критериями, такими как «включить cmdRight2, только если .... имеет значение true».

Затем вызывайте метод всякий раз, когда некоторые критерии могут измениться. Преимущество этого по сравнению с тем, как вы это делаете сейчас, состоит в том, что критерии в методе являются «абсолютными» (в том смысле, что кнопки либо включаются, либо отключаются за один раз), чем «относительными» (включайте кнопку, когда пользователь делает то или это).

Вы также можете вызвать этот метод из события Application.Idle вместо вызова его в ответ на какое-либо действие пользователя.

РЕДАКТИРОВАТЬ

Объявите следующий метод:

private void EnableButtons()
{
    controlX.Enabled = (<condition...>);
    controlY.Enabled = (<condition...>);
}

Вы можете вызвать этот метод из позиций в коде, где что-то должно измениться во включенных состояниях кнопок, или вы можете сделать следующее в конструкторе формы:

public Form1()
{
    // Other code...

    Application.Idle += new <The respective event handler>;
}

Затем объявите метод с соответствующей подписью для события и вызовите EnableButtons там. Этот метод будет вызываться в ситуациях, когда ваше приложение «бездействует» (ожидает действий пользователя).

1 голос
/ 16 февраля 2010

Я думаю, что вы хотите

if (this.lbList1.SelectedItems.Count == 1)
{
}
else if(this.lbList1.SelectedItems.Count > 1)
{
}
else
{
}

вместо

if (this.lbList1.SelectedItems != null)

Затем вы можете поместить все это в метод с именем "EnableButtons", как упоминалось в другом месте

0 голосов
/ 16 февраля 2010

Проблема в том, что вы удаляете элементы один за другим, поэтому, когда остается только один элемент, у вас, по сути, выбран один элемент, поэтому ваша программа включает cmdRight. Самый простой способ обойти это -

cmdRight2.Enabled = false;
cmdRight.Enabled = false;

в конце метода cmdRight2_Click.

...