0

まず、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 を構築したいと考えています。

ComboBoxLabel、およびButtonを使用してフォームを作成しました。ComboBox の値は [1,2,3,default] です。ユーザーが ComboBox で値を選択し、ボタンを押すと、プログラムはラベルを [A,B,C,default] に更新します。

ロジックを program.cs に保持し、上記の目標を達成するにはどうすればよいですか?

私はフォームを作成し、ビジュアル スタジオは次のような Form1.cs を生成します

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

だから私が遭遇した問題は、program.csがForm1の値を取得/設定する方法がわからないことだと思います

では、コマンド プロンプトの代わりにフォームを実行するようMain()に追加しましたが、スタックします。Application.Run(new Form1());試してみcomboBox1.SelectedValueましたが、値は From1.cs でしか取得できず、program.cs では取得できません。ロジックを適用できるように、それを program.cs に含める必要があります。

明確にするために、これは私が作成した単なるサンプルです。実際のprogram.csにはもっと多くのロジックが含まれていますが、ここでやりたいことには影響しないと思うので、説明には入れませんでした。program.csからフォームに値を取得して設定する方法が必要です。

4

2 に答える 2

2

コンソール アプリケーションに GUI を追加することが最善の解決策だとは思いませんが、以前にも同様の状況に陥ったことがあり、成功することができました。最良のオプションは、別の GUI アプリケーションから参照できるライブラリにロジックをリファクタリングすることです。

フォーム クラスでイベントを作成し、program.cs からそれらをサブスクライブして、発生する必要があるロジックを駆動します。EventArgs クラスを使用して、ロジックとの間で値を渡すことができます。これは基本的に、フォームを駆動するコードを記述するときに行うことであり、それを別のクラスにオフロードするだけです。

更新: サンプルコードを追加

これは基本的なイベントベースのプログラミングです。ジェネリックを使用することで定型コードの量を大幅に削減できますが、ジェネリックによって自動的に作成するデリゲートについて理解することをお勧めします。バグが発生したときにショートカットがどのように機能するかを理解していない (または理解していない) 場合、ショートカットは邪魔になる可能性があります。

イベントの方法: http://msdn.microsoft.com/en-us/library/w369ty8x.aspx

汎用デリゲート: http://msdn.microsoft.com/en-us/library/sx2bwtw7.aspx

例として、フォームのペアを作成しました。MainWindowテキストボックスがOutputBoxありDetachedForm、コンボボックスOptionComboBoxとボタンTriggerButtonがあり、イベントを発生させるために使用します。

MainWindow クラス:

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

DetachedForm クラス

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; }
}
于 2013-08-28T03:14:35.463 に答える
0

コンボ ボックスの値を取得/設定するパブリック関数またはパブリック プロパティを Form1.cs で公開すると、program.cs でその関数にアクセスしてコンボ ボックスを設定または取得できます。

于 2013-08-28T03:22:38.057 に答える