C# 为应用程序构建GUI

C# 为应用程序构建GUI,c#,winforms,visual-studio-2010,C#,Winforms,Visual Studio 2010,首先,这是我在Visual Studio 2010中使用C构建的简单应用程序,文件名为program.cs,所有进程都将显示在命令提示符中 public static void Main(string[] args) { int input = Convert.ToInt32(Console.ReadLine()); switch (input) { case 1: Console.WriteLine("A");

首先,这是我在Visual Studio 2010中使用C构建的简单应用程序,文件名为program.cs,所有进程都将显示在命令提示符中

public static void Main(string[] args)
{
    int input = Convert.ToInt32(Console.ReadLine());
    switch (input)
    {
        case 1:
            Console.WriteLine("A");
            break;
        case 2:
            Console.WriteLine("B");
            break;
        case 3:
            Console.WriteLine("C");
            break;
        default:
            Console.WriteLine("default");
            break;
    }
}
我想构建一个GUI,使其更加用户友好

我创建了一个带有组合框、标签和按钮的表单。组合框中的值为[1,2,3,默认值]。我想让用户在组合框中选择一个值,点击按钮,程序将把标签更新为[a,B,C,default]

如何保持program.cs中的逻辑并实现上述目标

我创建了一个表单,VisualStudio生成了一个Form1.cs,如下所示

namespace quickTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
所以我认为我遇到的问题是我不知道program.cs如何获取/设置Form1的值

我主要添加了Application.runnewform1;所以它运行表单而不是命令提示符,但是我被卡住了。我尝试了comboBox1.SelectedValue,但我只能从1.cs而不是program.cs中获取值,我需要它位于program.cs中,以便应用逻辑


为了澄清,这只是我构建的一个示例。实际的program.cs包含更多的逻辑,但我不认为它会影响我在这里要做的事情,所以我没有在描述中提到它。我需要一种从program.cs获取并设置表单值的方法。

我认为最好的解决方案不是向控制台应用程序添加GUI,但我以前也遇到过类似的情况,并且能够成功地做到这一点。最好的选择是将逻辑重构为可以从单独的GUI应用程序引用的库

在form类中创建事件,并从program.cs订阅它们,以驱动需要发生的逻辑。您可以使用EventArgs类在逻辑之间传递值。这基本上就是您在编写驱动表单的代码时所做的,您只是将其卸载到一个单独的类中

更新:添加了示例代码

这是基本的基于事件的编程。通过使用泛型,我们可以大大减少样板代码的数量,但最好了解通过泛型自动创建的委托。如果您不了解快捷方式的工作原理,或者在出现错误时不了解快捷方式,则快捷方式可能会成为一种障碍

活动如何:

一般代表:

例如,我创建了一对表单。MainWindow有一个textbox OutputBox,DetachedForm有一个combobox OptionComboBox和一个button TriggerButton,我们将使用它触发事件

主窗口类:

public partial class MainWindow : Form
{
    public MainWindow()
    {
        InitializeComponent();
        DetachedForm detachedForm = new DetachedForm();
        detachedForm.SelectionMade += new EventHandler<SelectionMadeEventArgs>(detachedForm_SelectionMade);            
        detachedForm.Show();
    }

    void detachedForm_SelectionMade(object sender, SelectionMadeEventArgs e)
    {
        OutputBox.Text = e.ActualSelection;
    }
}
分离形式类

public partial class DetachedForm : Form
{
    public event EventHandler<SelectionMadeEventArgs> SelectionMade;

    public DetachedForm()
    {
        InitializeComponent();
    }

    private void OnSelectionMade(SelectionMadeEventArgs e)
    {
        EventHandler<SelectionMadeEventArgs> handler = SelectionMade;

        if (handler != null)
        {
            handler(this, e);
        }
    }

    private void TriggerButton_Click(object sender, EventArgs e)
    {
        if (OptionComboBox.SelectedItem != null)
        {
            SelectionMadeEventArgs args = new SelectionMadeEventArgs(OptionComboBox.SelectedItem.ToString());
            OnSelectionMade(args);
        }
    }
}

public class SelectionMadeEventArgs : EventArgs
{
    public SelectionMadeEventArgs(String actualSelection)
    {
        ActualSelection = actualSelection;
    }

    public String ActualSelection { get; set; }
}

您可以在Form1.cs中公开获取/设置组合框值的公共函数或属性,然后在program.cs中访问该函数以设置或获取组合框。

创建Winform类型的新项目并开始在其中输入逻辑比将控制台项目转换为Winform项目更容易。调用Application.Runnew Form1不是一个好主意。创建一个新的Windows窗体项目,然后创建一个像“program.cs”现在所做的那样的类,为什么会被否决?这是一座结构良好的建筑question@paqogomez问题是,这是一个业务应用程序,有许多其他cs文件和函数,可能与30个其他cs文件类似,这使得将程序重写为winform项目非常困难。我没有构建应用程序,只是被告知修改并为其构建GUI。@Lathejockey81是正确的,但如果您确实必须重定向控制台输出,您可以尝试一些方法,这意味着您正在解析所有数据的字符串。在A$$的方式去IMO的一个总的痛苦。你能解释多一点关于我可以如何处理这个?我在From1.cs中创建了一个事件“private void button1\u Clickobject sender,EventArgs e{}”,但是如何引用program.cs中的值呢?我让程序从Form1继承,所以它可以访问函数,但我不知道下一步是什么。用代码示例更新。要向窗体发送数据,请在窗体上公开可从program.cs调用的方法或属性。虽然可以从表单中公开公共属性,但如果可以在自定义EventArgs类中传递所需内容,则可以保持整洁。