我是初学者在C#中学习Windows Forms应用程序,我想编写一个程序,提示用户输入一个地方的名称,并输入20到100之间的2位数温度(F).当用户按下表单上的"确定"按钮我想要一个消息框,显示他们输入的地方的名称,他们输入的温度(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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
你需要做的是退后一步,忽略整个WinForms问题.首先尝试解决具体问题:
我想编写一个程序,提示用户输入一个地方的名称,并输入20到100之间的2位数温度(F).当用户按下表格上的"确定"按钮时,我希望有一个消息框显示他们输入的地点的名称,他们输入的温度(F)加上其摄氏温度转换,以及在任何字段留空或温度超出范围时的错误消息.
什么可以分解为两个不同的问题:
验证总是应该完成的,所以我不认为它是一个单独的问题.
接下来要做的是考虑您希望解决方案如何工作.始终从解决方案开始,因为它通常比直接创建实现更容易.测试驱动开发真的很棒,因为它就是这样.
我想要这样的东西(伪代码):
var fahrenheit = dialog.GetInput();
var celcius = fahrenheit.Convert(new FahrenheitToCelciusConverter());
resultDialog.Show(fahrenheit, celsius);
Run Code Online (Sandbox Code Playgroud)
定义对象
既然我们知道自己想做什么,那就让我们更多地关注实际的实现.通过查看伪代码,我们发现我们需要几个类.
首先,我们需要获得输入
// 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));
}
}
Run Code Online (Sandbox Code Playgroud)
由于我们需要从表单中获取数据,因此我们创建一个包含它的类:
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; }
}
Run Code Online (Sandbox Code Playgroud)
看看上面的课程.它有私有的setter,这意味着没有其他类或代码可以修改它.它被称为不可变对象.好消息是我们知道使用它总是安全的,并且不能处于意外/无效状态.您应该总是尝试使用不可变对象,或者至少不让任何其他对象更改状态而不让类本身验证更改.
接下来是转换.我们写了以下代码:
var celcius = placeAndTempature.Convert(new FahrenheitToCelciusConverter());
Run Code Online (Sandbox Code Playgroud)
因此,我们需要修改类以获取转换器并返回一个新位置.
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));
}
}
Run Code Online (Sandbox Code Playgroud)
我刚刚介绍了一个名为Interfaces的新概念.您可以将它们视为文字模板或蓝图.它们用于定义类的外观,但不具有任何逻辑.这是一个规范.
public interface ITemperatureConverter
{
int Convert(int source);
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是我们有两个PlaceAndTemperature对象,原始对象有华氏度,一个有celcius.我们需要能够确定使用哪种单元,否则我们可能会在以后遇到一些令人讨厌的错误.
让我们使用一个单位规格来添加enum.
public enum TempatureUnit
{
Celcius,
Fahrenheit
}
Run Code Online (Sandbox Code Playgroud)
并修改以前的类和接口:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
把它们放在一起
大.现在不多了.让我们重新审视原始代码并进行更新:
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);
}
Run Code Online (Sandbox Code Playgroud)
摘要
还有一些事情你需要自己解决.就像创建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; }}
}
Run Code Online (Sandbox Code Playgroud)
而且您还需要创建结果表单,或者只是更新主表单.