Упрощение кода по нажатию на элемент C#

115
08 мая 2021, 17:30

только начинаю работать с C#, тут возник вопрос. У меня есть тут много элементов (стрелок), у которых действия при нажатии почти идентичны, лишь различаются изменяемые переменные. Есть ли способ упростить весь этот говнокод ? Или по другому никак ?

 private void bArrowLeft_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(lStrengthValue.Text) != 0)
            {
                points++;
                lStrengthValue.Text = Convert.ToString(Convert.ToInt32(lStrengthValue.Text) - 1);
                UpdatePoints();
            }
        }
        private void bArrowLeft2_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(lAgilityValue.Text) != 0)
            {
                points++;
                lAgilityValue.Text = Convert.ToString(Convert.ToInt32(lAgilityValue.Text) - 1);
                UpdatePoints();
            }
        }
        private void bArrowLeft3_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(lMagickaValue.Text) != 0)
            {
                points++;
                lMagickaValue.Text = Convert.ToString(Convert.ToInt32(lMagickaValue.Text) - 1);
                UpdatePoints();
            }
        }
        private void BArrowRight_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(lPointsValue.Text) != 0)
            {
                points--;
                lStrengthValue.Text = Convert.ToString(Convert.ToInt32(lStrengthValue.Text) + 1);
                UpdatePoints();
            }
        }
        private void BArrowRight2_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(lPointsValue.Text) != 0)
            {
                points--;
                lAgilityValue.Text = Convert.ToString(Convert.ToInt32(lAgilityValue.Text) + 1);
                UpdatePoints();
            }
        }
        private void BArrowRight3_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt32(lPointsValue.Text) != 0)
            {
                points--;
                lMagickaValue.Text = Convert.ToString(Convert.ToInt32(lMagickaValue.Text) + 1);
                UpdatePoints();
            }
        }
Answer 1

Если кратко, то

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

  2. Элементы интерфейса - вообще неподходящее место для хранения данных, и особенно чисел в виде строк. Вот эти записи Convert.ToString(Convert.ToInt32(lStrengthValue.Text) - 1) - следствие вашей ошибки. Лучше будет использовать свойства, где вы в сеттере пропишете изменение текста в полях, и тогда вы сможете работать с ними как с обычными переменными: Strength-- и все. По свойствам на ruSO есть замечательное объяснение.

Пример для первого пункта:

private void RetrievePoint (TextField textField) {
    if (Convert.ToInt32(textField.Text) != 0) {
        points++;
        textField.Text = Convert.ToString(Convert.ToInt32(textField.Text) - 1);
        UpdatePoints();
    }
}

И в обработчике:

RetrievePoint(lStrengthValue);

Но все же лучшим решением будут свойства:

private int _strength;
private int Strength {
    get { return _strength; }
    set {
         _strength = value;
         lStrengthValue.Text = value.ToString();
    }
}

В коде будете просто менять Strength как будто это переменная, и текстовое поле будет меняться автоматически.

READ ALSO
Checklist с доп значениями

Checklist с доп значениями

Можно ли как то реализовать checklist, что бы отображался один текст, и к нему привязана другая строка? Опишу по подробнее, начал осваивать С#Есть...

85
Как применить один HTML тело 2 и более .php файлу?

Как применить один HTML тело 2 и более .php файлу?

Я делал блог (тестовое задание) используя MVC архитектуру и HTML тело прописал на View (show_mainphp здесь и Bootstrap, CSS, JS файлы подключены)

88
работа с Git в другой папке

работа с Git в другой папке

Подскажите, пожалуйстая нахожусь в папке /test

106