Софтуерно Инженерство
Loading...
+ Нов въпрос
GeorgiGG avatar GeorgiGG 6 Точки

Опресняване на форма при смяна на стойност

Здравейте,

правейки графичното приложение за изчисляване на лева към евро (работи си като пушка) се натъкнах на проблем. Пускам формата, но при смяна на стойността на левовете (NummericUpDown контрола) резултата не се обновява автоматично, а трябва да натискам всеки път enter. Има ли някаква скрита опция или настройка за автоматичен "рефреш" на формата?

Ето как въвеждам стойност, която не се обновява автоматично (https://goo.gl/photos/JXnt62UTkHpC1Cw16): вместо да смята за 515 смята за 51 евро.

(OFFTOPIC: Ако някой знае и как да взема URL от снимка в Google Photo нека сподели, тия ми пускат само някакъв линк за споделяне на албума angry)

Кода зад формата:

using System;
using System.Windows.Forms;

namespace CurrencyConverter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ConvertCurrency();
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            ConvertCurrency();
        }

        private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
        {
            ConvertCurrency();
        }
        private void ConvertCurrency()
        {
            var leva = double.Parse(this.numericUpDown1.Text);
            var euro = leva / 1.95583;
            this.Result.Text = string.Format("{0} BGN are {1} EUR", leva.ToString("0.00"), Math.Round(euro, 2).ToString("0.00"));
        }        
    }
}

 

Тагове:
0
Основи на програмирането 09/02/2016 17:53:17
enevlogiev avatar enevlogiev 1168 Точки
Best Answer

Нямам много опит с WinForms и не съм сигурен какво точно искаш да стане, но с KeyUp евент би трябвало да стане. Ако имаш един текстбокс inputText и един лейбъл label, то със следния код:

this.inputText.KeyUp += new KeyEventHandler(this.KeyUpHandler);

private void KeyUpHandler(object sender, KeyEventArgs e)
{
   this.label.Text = this.inputText.Text;
}

докато пишеш в текстбокса, лейбълът се променя автоматично. Ще ти трябват някакви проверки де. Примерно double.TryParse.

Може да сложиш и допълнителен KeyPress евент, който да валидира инпута. Ако в текста има някакви невалидни символи, или броят на точките е по-голям от 1, то e.Handled се сетва на true (e = KeyPressEventArgs). Така няма да позволиш на въпросния символ да влезе във формичката.

1
09/02/2016 19:19:52
GeorgiGG avatar GeorgiGG 6 Точки

Благодаря,

липсата на KeyUp евент беше проблема, имах само KeyPress. Аз ползвам nummericUpDown кутийка, но май с textBox + валидация е по-добре да се направи.

0
petar.dimitrov.86 avatar petar.dimitrov.86 450 Точки

Лично аз не съм пробвал задачката, но може да погледнеш на Наков видеото по тази тема. Предполагам, че може би не си променил MinimalValue и МaxValue на UpDown контролката. Ето от това видео виж около 1:51:29 

https://youtu.be/0f7c9RIZGaE?t=1h51m29s

Ако не е там проблема, може да прегледаш от началото като почва да се прави програмката, и да видиш какво си изпуснал. Успех!

П.П. относно офтопика, с google photo май няма как директно директно да я покажеш тук, препоръчвам да пробваш да качваш с imgur.com

1
09/02/2016 18:06:30
kiso_blg avatar kiso_blg 56 Точки

Не знам дали това е целия код, но от това което виждам, си пропуснал да хванеш събитие SelectedIndexChanged на comboBox-a и съответно да му вмъкнеш метода ConvertCurrency().

Също така те съветвам да следиш по-внимателно инструкциите в задачите и да слушаш по-внимателно и изпълняваш напътствията на преподавателите. Наков постоянно прави забележки за ConsoleApplication1, примерно и Form1 както е в твоя случай.

0
GeorgiGG avatar GeorgiGG 6 Точки

То тази форма специално не е с comboBox и няма такъв контрол, проблема беше, че ми липсва KeyUp евент.

Прав си за именуването на контролите! Ще го взема в предвид за бъдеще

0
GeorgiGG avatar GeorgiGG 6 Точки

EDIT: Добавянето на MouseUp събитие към моя вариант на кода реши проблема и сега работи като пушка smiley

Интересно, че при този код (от видеото на Светлин Наков) при натискане на контролите на nummericalUpDown резултата се обновява веднага, но пък потребителя не може да въведе 300.45 наведнъж, защото при KeyUp веднага изчислява резултата.

        void Convert()
        {
            var leva = this.numericUpDownAmount.Value;
            var euro = leva / 1.95583m;
            this.labelResult.Text =
                leva.ToString("0.00") + " BGN = " +
                Math.Round(euro, 2) + " EUR";
        }

докато в този вариант на кода, който първоначално написах, при ръчно въвеждане веднага се изчислява, но при ползване на стрелките Up Down пак има забавяне в опресняването на изчислението. Това незнам защо е така, но с един Enter се изчислява в крайна сметка. (вероятно има значение, че аз смятам всичко с double, а не с decimal...незнам)

        void Convert()
        {
            var leva = double.Parse(this.numericUpDownAmount.Text);
            var euro = leva / 1.95583;
            this.labelResult.Text =
                string.Format("{0} BGN are {1} EUR",
                leva.ToString("0.00"),
                Math.Round(euro, 2).ToString("0.00"));
        }

 

0
10/02/2016 17:07:39