我如何得到一个窗体应用程序与类的工作

本文关键字:应用程序 窗体 工作 一个 何得 | 更新日期: 2023-09-27 18:14:21

我是一个初学者,在c#中学习Windows窗体应用程序,我想写一个程序,提示用户输入一个地方的名称,并输入2位温度(F)范围在20和100之间。当用户按下表单上的"OK"按钮时,我希望有一个消息框显示他们输入的地方的名称,以及他们输入的温度(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); 
        }
    }
}

我如何得到一个窗体应用程序与类的工作

你需要做的是退一步,只是忽略整个WinForms问题。尝试先解决具体问题:

我想写一个程序,提示用户输入一个地方的名字,并输入范围在20到100之间的2位温度(F)。当用户按下表单上的"OK"按钮时,我希望有一个消息框显示他们输入的地方的名称,以及他们输入的温度(F)及其摄氏度转换,如果任何字段为空或温度超出范围,则会出现错误消息。

可以分为两个不同的问题:

  1. 输入温度值在20到99之间(因为您指定了两位数字)
  2. 将温度转换成摄氏度

验证是总是应该做的事情,所以我不认为它是一个单独的问题。

接下来要做的是考虑你希望解决方案如何工作。总是从解决方案开始,因为这通常比直接创建实现更容易。测试驱动开发真的很棒,因为它做到了这一点。

我想要这样的东西(伪代码):

var fahrenheit = dialog.GetInput();
var celcius = fahrenheit.Convert(new FahrenheitToCelciusConverter());
resultDialog.Show(fahrenheit, celsius);
<<p> 定义对象/strong>

现在既然我们知道我们想要做什么,让我们更多地关注实际的实现。通过查看伪代码,我们已经确定我们需要几个类。

首先,我们需要得到输入

// 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; } 
}

看上面的类。它有私有setter,这意味着没有其他类或代码可以修改它。它被称为不可变对象。好的方面是我们知道它的使用总是安全的,不会处于意外/无效状态。您应该始终尝试使用不可变的对象,或者至少在没有类本身验证更改的情况下不让任何其他对象更改状态。

接下来是转换。我们编写了以下代码:

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);
}

现在的问题是我们有两个PlaceAndTemperature对象,原来的一个是华氏温度,另一个是摄氏度。我们需要能够识别使用的是哪种单元,否则我们以后可能会遇到一些讨厌的bug。

让我们使用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);
}

仍然有一些事情需要你自己解决。比如创建华氏到摄氏转换器。像这样开头:

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; }}
}

您还需要创建结果表单,或者只是更新主表单。

在Form1.cs中我得到" 'celciusTemp'不存在于当前上下文中"

好;现在我们有点进展了。celciusTemp确实是Calculations的一部分,而不是Form1,但这不应该真正影响我们,因为我们已经有了温度:

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

(假设txtTemperature存在)

问题似乎是在以后的调用中不使用temp:

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

(注意上面使用的是temp,而不是celsiusTemp)

除此之外,我不确定是否有必要将placeNamecelsiusTemp作为Calculations类上的字段;它们可以是静态方法,除非有更多的细节要添加。但这与这里的主要问题无关。