2つのForm
クラスがあり、そのうちの1つにListBox
があります。 2番目のSelectedIndex
から呼び出すListBox
のForm
プロパティのセッターが必要です。
現在、私は次のことをしています。
フォーム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;
}
これはこれを行うための最良の方法ですか?
それらをシングルトンにすることは完全に悪い考えではありませんが、個人的にはそのようにすることは好みません。どちらか一方の参照を別のフォームに渡したいです。ここに例があります。
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;
}
}
(ソース: ruchitsurati.net )
(ソース: ruchitsurati.net )
次のようにフォームのコントロールにアクセスします。
formname.controls[Index]
適切なコントロールタイプとしてキャストできます。例:
DataGridView dgv = (DataGridView) formname.Controls[Index];
簡単です。最初に、次のような他のフォームにアクセスできます(他のフォームは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
。
私は通常、このようなものにシングルトンデザインパターンを使用します http://en.wikipedia.org/wiki/Singleton_pattern 。アプリケーションがシングルトンで実行されているメインフォームを作成してから、他の領域で触れたいフォームやコントロールへのアクセサーを作成します。次に、他のフォームは、変更するコントロールへのポインタ、または変更するアプリケーションの主要部分のデータを取得できます。
別のアプローチは、通信するためにさまざまなフォームでイベントをセットアップし、メインフォームをソートのハブとして使用して、アプリケーション内のあるフォームから別のフォームにイベントメッセージを渡すことです。
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));
}
}
ChildForm
がParentForm
にアクセスする場合
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";
}
}