0

これを機能させる方法について多くのことを調査しましたが、問題を解決できませんでした。また、Ram Space を浪費していると思われるため、調査した方法のいくつかが気に入りませんでした。とにかく、これは問題です:

Form1(Has DataGridView(Modifier: Public), TextBox1, Button1) - 親フォーム Form2(Has TextBox1, Button1) - 子フォームの 2 つのフォームがあります。

public partial class Form1 : Form
{
Pivate Void Button1_Click()
TransferText("Text_Example")

Public Void TransferText(string text)
Form2 frm2 = new Form2();
frm2.show()
frm2.textbox1 = text;
}

これは明らかに機能しません。これを行う正しい方法は何ですか? Form2 を開き、Form2 の textbox1 の値を変更しようとしています。

Form2 には、次のコードがあります。

public partial class Form2 : Form
{
Private Void Button1_click()
RowAdder("Example-Text", "Example2");

Public Void RowAdder(string text1, string text2)
Form frm1 = ?? // What should I write here ?
frm1.DataGridView1.Rows.Add(text1, text2)

これもうまくいかないので、どうすれば修正できますか?Form2 から Form1 に行を追加しようとしています。

この問題に関するヘルプは大歓迎です。私はしばらくこれにこだわっています。

4

6 に答える 6

1

ビュー (フォーム) 間で共通データをバインドすることは、WPF で非常にうまく対処されているものですが、Winforms では次のアプローチをお勧めします。

1) 親から子への転送の場合、目的のコントロールへのマッピングを処理する子にパブリック/内部プロパティを作成します。さらに良いことに、複数のフィールド/コントロールがマップされる場合は、ViewModel のようなものを使用します。関連するフィールドを含むクラスまたは構造体です。例: (文字列値を使用) Form2 (子)

public string ExampleText
{
   get { return exampleTextControl.Text; }
   set { exampleTextControl.Text = value; }
}

フォーム 1 (親)

form2.ExampleText = "fred";

一般的なルールは、必要最小限の詳細のみを公開することです。VB に戻ると、"ハック" はコントロールをパブリックにすることで、アクセサー プロパティを設定することでテキスト ボックス全体を公開できました。これは C# で行うことができますが、あまりお勧めできません。

2) 子から親への関係: 私が提案できる最もクリーンなオプションは、イベント通知モデルを採用することです。子は、リッスンしている親が消費する詳細を提供するイベントを公開します。親フォームはイベントをキャッチし、独自の更新を実行します。

簡単なイベント引数の宣言から始めます。

public class ExampleEventArgs : EventArgs
{
   public string Value1 
   {
      get;
      set;
   }
   public string Value2 
   {
      get;
      set;
   }
}

子フォーム (Form2) で、イベント宣言を作成します。

public event EventHandler<ExampleEventArgs> OnRowAdded;

行を追加するように親に通知する場合:

if (OnRowAdded != null)
{
   OnRowAdded(this, new ExampleEventArgs { Value1 = text1, Value2 = text2 });
}

親フォーム (Form1) では、Form2 のインスタンスが初期化されるときに、OnRowAdded イベント ハンドラーに使用するメソッド デリゲートを指定します。これはプライベート メソッド (イベント ハンドラーを追加するときに VS がこれを自動生成できます) にすることも、Lambda 式を使用することもできます。

var form2 = new Form2();
form2.OnRowAdded += (sender, e) => { this.DataGridView1.Rows.Add(e.Value1, e.Value2); };
// or form2.OnRowAdded += new EventHandler<ExampleEventArgs>( /* generate private method... */ );

*免責事項: 上記のコードはメモリからの抜粋であり、そのままではコンパイルされない可能性がありますが、問題に対処する方法についてのアイデアが得られるはずです。

于 2012-07-19T00:22:08.813 に答える
1

Just create public property on your form2:

public string passtext;

on your Form1 just do:

   Form2 frm2 =  new Form2(){ passtext= "Text_Example"};
   frm2.Show();

On you Form2:

try this for test:

MessageBox.Show(passtext);

Regards

于 2012-07-19T00:13:44.527 に答える
1

Form クラスには、Form 型の Owner というプロパティと、このプロパティを設定する show のメソッド オーバーロードがあります。これにより、親フォームの参照を子フォームに渡すことができます。

show の呼び出しを次のように変更する必要があります。

form2.Show(this);

次に、form2 の RowAdder メソッドで、次のように datagridview にアクセスするために、所有者を Form1 にキャストする必要があります。

((Form1)Owner).DataGridView1.Rows.Add(text1, text2);

これにより、子フォームから親フォームへのデータ取得の問題が修正されます。多くの人が親から子にデータを取得するための最良の方法ですでに回答しているので、それについては他の回答を読んでください。

于 2012-07-19T00:37:50.637 に答える
0

のctorを変更して、Form2引数として文字列を受け取り、インスタンス化するときに送信することができます。

Form2 form = new Form2(text);

Form2のコンストラクターでは、そのテキストを使用します

public Form2(string someText)
{
InitializeComponent();
//...
    this.textbox1.Text = someText;
//...
}

よろしく

于 2012-07-19T00:08:41.907 に答える
0

しかし、それは少し厄介です ここにあなたの提案があります!

この作業を UI から分離するクラスを作成します。

public class YourController
{
    public DataGridView MyView { get; set; }

    //The method to add a row
    public void AddRowToView(string passedText)
    {
        using (Form2 f2 = new Form2())
        {
            if (f2.ShowDialog() == DialogResult.OK)
            {
                MyView.Rows.Add(passedText, f2.txEdit.Text);
            }
        }
    }
}

親フォームで、メソッドを呼び出して行を追加します。

//In your parent form, on the click button event :
YourController controller = new YourController() { MyView = view };
controller.AddRowToView("myText");
于 2012-07-19T01:15:42.613 に答える
0

クラスの適切な設計を維持するために、フォーム内のコントロールの ID を外部に公開することはお勧めしません。ただし、C# プロパティまたは指定されたパブリック メソッドを使用して、コントロールを変更できます。

于 2012-07-19T00:20:37.277 に答える