Как заставить приложение Windows Form работать с классом? - PullRequest
1 голос
/ 14 ноября 2011

Я новичок в изучении приложений Windows Forms на C # и хочу написать программу, которая предложит пользователю ввести название места и ввести двухзначную температуру (F) в диапазоне от 20 до 100. Когдапользователь нажимает кнопку «ОК» в форме. Я хочу, чтобы в окне сообщения отображалось название места, в которое они вошли, а также введенная температура (F) плюс его преобразование в градусы Цельсия и сообщение об ошибке, если какое-либо из полей оставлено пустымили если температура выходит за пределы диапазона.

Я хотел бы иметь класс для обработки преобразования и логики.

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

Ради вас, я не включаю свой код, потому что это может сбить вас с толку, тогда мы будем часами говорить о«почему я что-то сделал», но если вы действительно хотите увидеть это, дайте мне знать.

Будучи новичком, я очень ценю ответы, подобные новичкам.Спасибо, ребята!

// Form1.cs

using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void btn_quit_Click(object sender, EventArgs e)
        {
            base.Close();
            return;
        }

        public void btn_record_Click(object sender, EventArgs e)
        {
            string place;
            place = Console.ReadLine();
            Calculations name = new Calculations();
            //double temp = Convert.ToDouble(txtTemperature.Text);
            //Calculation ctemp = new Calculation();


        MessageBox.Show(name.GetPlaceName("Calculations: " + txtPlaceName.Text));
        //MessageBox.Show(string.Format("Temperature: {0}", (ctemp.GetTemp(celsiusTemp.text))));


}


//Class


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Calculations
{
    class Calculations
    {


        string placeName;
        double celsiusTemp;

        public string GetPlaceName(string place)        
{

                return placeName = place;            
        }

    public double GetTemp(double temp)
        {
            return celsiusTemp = (temp + 10); 
        }

    }
}

Ответы [ 2 ]

8 голосов
/ 14 ноября 2011

Что вам нужно сделать, это сделать шаг назад и просто проигнорировать всю проблему WinForms. Попробуйте сначала решить конкретную проблему:

Я хочу написать программу, которая предложит пользователю ввести название места и ввести 2-значную температуру (F) в диапазоне от 20 до 100. Когда пользователь нажимает кнопку «ОК» в форме, которую я хочу чтобы в окне сообщения отображалось название места, в которое они вошли, и температура (F), которую они ввели, плюс его преобразование по Цельсию и сообщение об ошибке, если какое-либо из полей оставлено пустым или если температура выходит за пределы диапазона.

Что можно разбить на две разные проблемы:

  1. Введите значение температуры от 20 до 99 (поскольку вы указали две цифры)
  2. Перевести температуру в градусы Цельсия

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

Следующее, что нужно сделать, это подумать о том, как вы хотите, чтобы решение работало. Всегда начинайте с решения, поскольку зачастую это проще, чем пытаться создать реализацию напрямую. Разработка через тестирование действительно хороша, поскольку она делает именно это.

Я бы хотел что-то вроде этого (псевдокод):

var fahrenheit = dialog.GetInput();
var celcius = fahrenheit.Convert(new FahrenheitToCelciusConverter());
resultDialog.Show(fahrenheit, celsius);

Определение объектов

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

Прежде всего, нам нужно получить ввод

// the validation should be done in this form when the user 
// presses OK. But that's up to you to figure out
public class PlaceAndTemperatureForm : Form
{
    public PlaceAndTemperature GetPlaceAndTemperature()
    {
        return new PlaceAndTemperature(txtName.Text, int.Parse(txtTemperature .Text));
    }
}

И так как нам нужно получить данные из формы, давайте создадим класс для их хранения:

public class PlaceAndTemperature 
{
     public PlaceAndTemperature(string name, int temperature)
     {
         Name = name;
         Temperature = temperature;
     }
     public string Name { get; private set; } 
     public int Temperature { get; private set; } 

}

Посмотрите на класс выше. Он имеет частные сеттеры, что означает, что никакой другой класс или код не может его изменить. Это называется неизменными объектами. Хорошо, что мы знаем, что это всегда безопасно и не может быть в неожиданном / недействительном состоянии. Вы должны всегда пытаться иметь неизменные объекты или, по крайней мере, не позволять никаким другим объектам изменять состояние без того, чтобы сам класс проверял изменения.

Далее идет конверсия. Мы написали следующий код:

var celcius = placeAndTempature.Convert(new FahrenheitToCelciusConverter());

Следовательно, нам нужно изменить класс, чтобы взять конвертер и вернуть новое место.

public class PlaceAndTemperature 
{
     public PlaceAndTempature(string name, int temperature)
     {
         Name = name;
         Temperature = temperature;
     }
     public string Name { get; private set; } 
     public int Temperature { get; private set; } 

     public PlaceAndTemperature Convert(ITemperatureConverter converter)
     {
         return new PlaceAndTemperature(Name, converter.Convert(Temperature));
     }
}

Я только что представил новую концепцию под названием Интерфейсы. Вы можете смотреть на них как на шаблоны слов или на синий рисунок. Они здесь, чтобы определить, как должен выглядеть класс, но не иметь никакой логики. Это спецификация.

public interface ITemperatureConverter 
{
    int Convert(int source);
}

Проблема теперь в том, что у нас есть два объекта PlaceAndTempera, первый с градусом Фаренгейта и один с градусами Цельсия Нам нужно уметь определить, какой тип юнитов используется, или, возможно, позже мы получим некоторые неприятные ошибки.

Позволяет добавить спецификацию устройства, используя enum.

public enum TempatureUnit
{
    Celcius,
    Fahrenheit
}

И измените предыдущие классы и интерфейсы:

public interface ITemperatureConverter 
{
    int Convert(int source);
    TempatureUnit SourceUnit {get;}
    TempatureUnit TargetUnit {get;}
}

public class PlaceAndTemperature 
{
     public PlaceAndTempature(string name, int temperature, TempatureUnit unit)
     {
         Name = name;
         Temperature = temperature;
         TempatureType = unit;
     }
     public string Name { get; private set; } 
     public int Temperature { get; private set; } 
     public TempatureUnit TemperatureType {get; private set; }
     public PlaceAndTemperature Convert(ITemperatureConverter converter)
     {
         return new PlaceAndTemperature(Name, converter.Convert(Temperature), converter.TargetUnit);
     }
}

Собираем все вместе

Отлично. Не так много осталось. Давайте вернемся к исходному коду и обновим его:

public void Button1_Click(object source, EventArgs e)
{
    var form = new PlaceAndTemptureForm();
    var result = form.ShowDialog(this);
    if (result != DialogResult.Ok)
        return; // failed for some reason

    var fahrenheit = form.GetPlaceAndTemperature();

    var celcius = fahrenheit .Convert(new FahrenheitToCelciusConverter());

    var form = new ResultForm();
    form.SetTemperatures(fahrenheit, celsius);
    resultDialog.ShowDialog(this);
}

Основная информация

Есть еще кое-что, что вам нужно исправить самостоятельно. Как создание FahrenheitToCelciusConverter. Начните с чего-то вроде:

public class FahrenheitToCelciusConverter : ITemperatureConverter
{
    public int Convert(int source)
    {
         // put your code here
    }
    public TempatureUnit SourceUnit {get { return TemperatureUnit.Fahrenheit; }}
    public TempatureUnit TargetUnit {get { return TemperatureUnit.Celcius; }}
}

Вам также нужно будет создать форму результата или просто обновить основную форму.

1 голос
/ 14 ноября 2011

на данный момент в Form1.cs Я получаю «celciusTemp не существует в текущем контексте»

OK;теперь мы куда-то добираемся.celciusTemp действительно является частью Calculations, а не Form1, но это не должно на нас сильно повлиять, так как у нас уже есть температура:

double temp = Convert.ToDouble(txtTemperature.Text);

(я предполагаю, что txtTemperature существует)

Кажется, проблема не в том, чтобы использовать temp в последующем вызове:

MessageBox.Show(string.Format("Temperature: {0}", ctemp.GetTemp(temp)));

(обратите внимание, что выше используется temp, а не celsiusTemp)

КакКроме того, я не уверен, что необходимо хранить placeName и celsiusTemp как поля в классе Calculations;это могут быть статические методы, если только нет подробностей для добавления.Но это не связано с основной проблемой здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...