gpt4 book ai didi

c# - 如何让 Windows 窗体应用程序与类(class)一起工作?

转载 作者:太空宇宙 更新时间:2023-11-03 17:57:11 26 4
gpt4 key购买 nike

我是一个在 C# 中学习 Windows 窗体应用程序的初学者,我想编写一个程序,提示用户输入一个地点的名称并输入 20 到 100 之间的 2 位温度 (F)。当用户按下表单上的“OK”按钮温度超出范围。

我想要一个类来处理转换和逻辑。

我还在学习,我已经花了一整天的时间在这上面已经只有几段代码工作了,但我担心我不明白我在做什么。我对表单设计没问题,我有一个问题,是 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 问题。先尝试解决具体问题:

I want to write a program that will prompt the user to enter the name of a place and to enter 2 digit temperature (F) between ranges 20 and 100. When the user presses the "OK" button on the form I want to have a messagebox displaying the name of the place they entered, and the temperature (F) they entered plus its Celsius conversion and an error message in case any of the fields is left blank or if the temp falls beyond the range.



可以分为两个不同的问题:
  • 输入 20 到 99 之间的温度值(因为您指定了两位数)
  • 将温度转换为摄氏度

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

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

    我想要这样的东西(伪代码):
    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; }

    }

    看看上面的类。它具有私有(private) setter ,这意味着没有其他类或代码可以修改它。它被称为不可变对象(immutable对象)。好消息是我们知道它始终可以安全使用,并且不会处于意外/无效状态。您应该始终尝试使用不可变对象(immutable对象),或者至少不要让任何其他对象更改状态,而无需让类本身验证更改。

    接下来是转换。我们编写了以下代码:
    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));
    }
    }

    我刚刚介绍了一个称为接口(interface)的新概念。您可以将它们视为文字模板或蓝图。他们在那里定义一个类的外观,但没有任何逻辑。这是一个规范。
    public interface ITemperatureConverter 
    {
    int Convert(int source);
    }

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

    让我们使用 enum 添加单位规范.
    public enum TempatureUnit
    {
    Celcius,
    Fahrenheit
    }

    并修改之前的类和接口(interface):
    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; }}
    }

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

    关于c# - 如何让 Windows 窗体应用程序与类(class)一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8118727/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com