2

C# .NET はまだ新しいため、単純な (説明付き) が優先されます。:) いくつかのテキスト ボックスを含む Windows フォームがあります。これらのテキストボックスの内容を別のファイルで読み込めるようにしたい。 同様の問題をカバーする記事(ここでもstackoverflow)を見たことがありますが、私の場合は機能しません。必要なデータは、Form1 のテキスト ボックスにあります。このデータの移動先は -> myOtherCS で、メソッド (Savedoc) で使用されます。

Form1.cs には次のものがあります。

private myOtherCS allOtherMethods;
public static string myText= "";
public static string mytitle = "";

public Form1()
{
    InitializeComponent();            
    allOtherMethods = new myOtherCS();
}
/* I would like the myText to be filled with the contents of Textbox1
 *  and mytitle to be filled with contents of Textbox2. Ideally when the
 * Textboxes have been changed.  */

private void TextBox1_TextChanged(object sender, EventArgs e)
{
     myText = Textbox1.Text;
}

private void TextBox2_TextChanged(object sender, EventArgs e)
{
     myTitle = Textbox2.Text;
}

myOtherCS ファイルでは、これらの値を別のメソッド内で使用できるようにしたいと考えています。したがって、最初におそらく「取得」および「設定」します。私は多くのことを試しましたが、ここに..アイデアを得るために..両方のファイルで変更を加える必要があることは知っていますが、これはアイデアを得るためのものです.

public class GetTextBoxes
{
    private string title;
    private string text;

    public string Title
    {
        get { return title; }
        set { title = value; }
    }

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}

public void SaveDoc()
{ 
    GetTextBoxes.title;
    GetTextBoxes.text;
}

これは、私がやりたいことを示すための PSEUDOcode です。私は多くのことを試しましたが、誰かがこれを行う方法を知っていれば、とても感謝しています! 前もって感謝します

4

6 に答える 6

1

最善の方法はあなたがしたことだと思います。値を取得および設定し、異なるWindowsフォーム間でそれらを共有するためのパブリッククラスを持つことは、私自身が常に使用するアイデアです。フォームコンストラクターを介して値を渡すこともできますが、それはフォームの初期化時にのみ値を取得したい場合です。だからあなたの場合、それは良い考えではないと思います。。。幸運を

于 2012-12-05T14:40:56.493 に答える
1

考え方を変えたいと思うかもしれません。

  • データモデルの観点から考えてみてください。Form1 が概念的に表現しようとしているものは何ですか? それに基づいて、そのニーズをサポートするデータ モデルを作成します。データモデルとは、質問で定義したように、ゲッター/セッターを備えた単純なクラスを意味し、クラスをドキュメントと呼ぶことができます。

    public class Document { public string Title {get;set;} public string Text {get;set;} }

    したがって、Form1 に静的フィールドを配置する代わりに、次のようにします。

    public static string myText= ""; public static string mytitle = "";

    public Document MyDocument {get;set;} パブリック プロパティを定義し、コンストラクタで初期化できます。

  • 次に、データ バインディングを使用して、モデル (ドキュメント) を Form1 のコントロールにバインドできます。

  • Form1 と myOtherCS の間のやり取りを考えてみてください。ユーザーのワークフローをどのように思い描いていますか? Form1 に入力してからアクションを実行しますか? 別のフォームなどに移動しますか?myOtherCS は Form1 データを処理する単なるサービスですか?

特定の技術的な問題を解決するのではなく、視野を広げて本当にやりたいことを特定し、その要件を満たすための最も適切な技術的解決策を見つけたいと考えています。私は WinForms で長い間苦労してきましたが、高レベルで達成したいことを明確にすることがより重要です。

于 2012-12-05T14:49:48.580 に答える
1

文字列をパブリックとして保存している場合は、次のように言うだけです...

Form1 form=new Form1();
Console.out.write(form.myText);

文字列が公開されている場合、ゲッターとセッターを使用する必要はありません。私はおそらくそれらを静的に保つでしょうが。これらのメソッドは変更のたびに更新されるため、追加のメソッドは必要ありません。タイトル オブジェクトを public に設定して、文字列で行ったことをフォームの一部で再度実装することもできます。

public System.Windows.Forms.Button button1;
于 2012-12-05T14:36:10.367 に答える
0

メイン フォームと他のフォームのそれぞれに 1 つの textBox が含まれているとします。あなたができることはShow()、メインフォームをパラメーターとして渡すことで、他のフォームを開くことです。次に、テキスト変更のイベント ハンドラーを追加できます。以下のサンプルはTextBox、メイン フォームのTextBoxテキストが変更されたときに、他のフォームの を更新します。メインフォームは次のとおりです。

public partial class Form1 : Form
{
    OtherForm otherForm;
    public Form1()
    {
        InitializeComponent();
        otherForm = new OtherForm();
        otherForm.Show(this);
        textBox1.TextChanged += textBox1_TextChanged;
    }

    void textBox1_TextChanged(object sender, EventArgs e)
    {
        otherForm.textBox1.Text = textBox1.Text;
    }
}

以下に示すように、OtherFormデザイナーで に設定textBox1 Modifiersします。Public

ここに画像の説明を入力

[編集]

これは、 Servyの提案に基づいたより良いアプローチです。

public partial class Form1 : Form
{
    OtherForm otherForm;
    public Form1()
    {
        InitializeComponent();
        otherForm = new OtherForm();
        otherForm.Show(this);
    }
}

//...

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

    string SomeMethod()
    {
        var parent = (Form1)this.Owner;
        return parent.textBox1.Text;
    }

    private void textBox1_MouseClick(object sender, MouseEventArgs e)
    {
        textBox1.Text = SomeMethod();
    }
}
于 2012-12-05T14:50:07.997 に答える
0

ボタンをクリックしたときにフォームが別のクラスのメソッドを呼び出しており、それらの他のメソッドは計算を実行するときにテキスト ボックスの現在の値を使用する必要があると言いました。これに対処する適切な方法は、他のメソッドに 2 つの文字列パラメーターを受け入れさせ、Textそれらのメソッドを呼び出すときにテキスト ボックスの値を渡すことです。

これにより、テキスト変更ハンドラーと public static フィールドを削除できます。実際にはこれら 2 つのクラスのみが情報にアクセスする必要がある場合に、情報がすべてに公開されないようにすることができ、プログラムの保守が容易になります。

于 2012-12-05T14:55:32.623 に答える
0

textchanged イベント ハンドラーで allOtherMethods のプロパティを設定する必要があります。

コードは次のとおりです。

private void TextBox1_TextChanged(object sender, EventArgs e)
{
   allOtherMethods.Text = Textbox1.Text;
}
private void TextBox2_TextChanged(object sender, EventArgs e)
{
   allOtherMethods.Title= Textbox2.Text;
}

そしてコード

public void saveText()
{ 
       GetTextBoxes.title;
       GetTextBoxes.text;
}

無意味です。クラス外でメソッドを宣言することはできません。

c# は OOP 言語です。したがって、ここでの一般的な概念は、常にイベント ハンドラーでプロパティを設定したり、インスタンスのメソッドを呼び出したりする必要があるということです。

于 2012-12-05T14:35:38.307 に答える