web-dev-qa-db-ja.com

別のフォームのフォームコントロールにアクセスする方法

2つのFormクラスがあり、そのうちの1つにListBoxがあります。 2番目のSelectedIndexから呼び出すListBoxFormプロパティのセッターが必要です。

現在、私は次のことをしています。

フォーム1

public int MyListBoxSelectedIndex
{
     set { lsbMyList.SelectedIndex = value; }
}

フォーム2

private ControlForm mainForm; // form 1

public AddNewObjForm()
{
     InitializeComponent();
     mainForm = new ControlForm();           
}

public void SomeMethod()
{
     mainForm.MyListBoxSelectedIndex = -1;
}

これはこれを行うための最良の方法ですか?

11
wulfgarpro

それらをシングルトンにすることは完全に悪い考えではありませんが、個人的にはそのようにすることは好みません。どちらか一方の参照を別のフォームに渡したいです。ここに例があります。

Form1はForm2をトリガーして開きます。 Form2には、呼び出しフォームを引数として取り、Form2メンバーへの参照を提供するオーバーロードされたコンストラクタがあります。これにより、通信の問題が解決されます。たとえば、Form2で変更されたForm1でLabelプロパティをpublicとして公開しました。

このアプローチを使用すると、さまざまな方法で通信を行うことができます。

サンプルプロジェクトのダウンロードリンク

//Your Form1

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

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this);
        frm.Show();
    }

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}

//Your Form2

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

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }
}

alt text
(ソース: ruchitsurati.net

alt text
(ソース: ruchitsurati.net

24

次のようにフォームのコントロールにアクセスします。

formname.controls[Index]

適切なコントロールタイプとしてキャストできます。例:

DataGridView dgv = (DataGridView) formname.Controls[Index];
3
Dwight

簡単です。最初に、次のような他のフォームにアクセスできます(他のフォームはForm2

//in Form 1
Form2 F2 = new Form2();
foreach (Control c in F2.Controls)
         if(c.Name == "TextBox1")
            c.Text = "hello from Form1";

それだけです、あなたは単にTextBox1 in Form2からForm1

2
Joe Dabones

私は通常、このようなものにシングルトンデザインパターンを使用します http://en.wikipedia.org/wiki/Singleton_pattern 。アプリケーションがシングルトンで実行されているメインフォームを作成してから、他の領域で触れたいフォームやコントロールへのアクセサーを作成します。次に、他のフォームは、変更するコントロールへのポインタ、または変更するアプリケーションの主要部分のデータを取得できます。

別のアプローチは、通信するためにさまざまなフォームでイベントをセットアップし、メインフォームをソートのハブとして使用して、アプリケーション内のあるフォームから別のフォームにイベントメッセージを渡すことです。

2
ColinCren

Joe Dabonesの提案のように「すべて」のコントロールをループしたくない場合は、もう1つの方法があります。 Form2で関数を作成し、Form1から呼び出します。

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

    public void SetIndex(int value)
    {
        lsbMyList.SelectedIndex = value;
    }
}

public partial class Form1 : Form
{
    public Form2 frm;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        frm=new Form2();
        frm.Show();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm.SetIndex(Int.Parse(textBox1.Text));
    }
}
1
user8931966

ChildFormParentFormにアクセスする場合

ParentFormインスタンスをChildFormコンストラクターに渡します。

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

    public string ParentProperty{get;set;}

    private void CreateChild()
    {
         var childForm = new ChildForm(this);
         childForm.Show();
    }
}

public partial class ChildForm : Form
{
    private ParentForm parentForm;

    public ChildForm(ParentForm parent)
    {
        InitializeComponent();

        parentForm = parent;
        parentForm.ParentProperty = "Value from Child";
    }   
}
0
CharithJ