2

さまざまなタスクを実行するクラスのライブラリがあります。Windows フォームからのユーザー入力に応答して、これらのタスクのいくつかを実行したいと考えています。これまでに試したことは、次のようにライブラリに入力インターフェイスを設定することです。

public interface IInputter
{
    string sendInput();
}

次の形式でインターフェイスを実装します。

 public partial class Form1 : Form,IInputter
    {
        string sentText=null;

        public Form1()
        {
            InitializeComponent();
        }

        public string sendInput()
        {
            string inputText=sentText;
            sentText=null;
            return inputText;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Excel files (*.xls*)|*.xls*";
            DialogResult dr = ofd.ShowDialog();
            if (dr == DialogResult.OK)
            {
                sentText = ofd.FileName; 
            }
        }
    }

フォーム コードからライブラリの関数を呼び出すときに、フォームをパラメーターとして渡します。

public partial class StartForm : Form
{
    public StartForm()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.Show();
        Main main = new Main();
        main.main(f1);
    }
}

次に、ライブラリ関数から入力関数を呼び出します。

    public string main(IInputter inputter)
    { 
     do
     {
        testBk = inputter.sendInput();
     }
     while (testBk == null);
     return testBk;
    }

ただし、Form1完全にロードされていません。コントロールがあるべき場所に空のスペースがあるだけなので、Whileフォームが関数を介してライブラリ関数に入力を送信する方法がなくても、ループは無限に実行されIInputter.sendInput()ます。

インターフェイスがフォームに実装されているライブラリ内からアクセスできるデータ ストリームを設定するには、より「組み込み」の方法が必要であると確信しています。私は何が欠けていますか?

4

1 に答える 1

4

フォームはインタラクティブなので、インターフェイスはイベントを公開する方が理にかなっています:

public interface IInputter
{
    event EventHandler<InputReceivedEventArgs> ReceivedInput;
}

public class InputReceivedEventArgs : EventArgs
{
    public InputReceivedEventArgs(string text)
    {
        this.Text = text;
    }

    public string Text { get; private set; }
}

public partial class Form1 : Form, IInputter
{
    public event EventHandler<InputReceivedEventArgs> ReceivedInput = delegate { };


    private void button1_Click(object sender, EventArgs e)
    {
        var dialog = new OpenFileDialog { Filter = "Excel files (*.xls*)|*.xls*" };
        var dialogResult = dialog.ShowDialog();
        if (dialogResult == DialogResult.OK)
        {
            ReceivedInput(this, new InputReceivedEventArgs(ofd.FileName));
            sentText = ofd.FileName; 
        }
    }
}

次に、消費するには:

public string main(IInputter inputter)
{
    string receivedInput = null;

    inputter.ReceivedInput += (s, e) => YourLibrary.DoSomething(e.Text);
}
于 2013-06-03T22:09:42.883 に答える