C#を勉強中です。
現在、 listBoxに値を挿入するという基本的なコーディングを行っているのですが、
下記点で質問があります。
- listBox1コントールを他のクラスから直接いじることはできないのか?
listBox1.Items.Add("Line:1");
上記の「listBox1」はlistBoxのNameですが、Form1クラスからしか変数を読み込むことができません(privateなので当たり前ではありますが)。
2. Form1クラスを他クラスから読み込むことはできないのか?
Form1クラスはプログラム実行時にインスタンス化しているため、newして新しいオブジェクトを生成しても、画面のコントロールとは別となってしまうと思います。
Form1クラスを参照できる方法等はあるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答4件
1
ベストアンサー
他のクラスからForm1を読み込み、Form1内のコントロールを操作するにはForm1のインスタンスを他クラスに渡してあげれば可能です。
Form1クラス
C#
1public class Form1 : Form 2{ 3 Hoge _hoge; 4 public Form1() 5 { 6 InitializeComponent(); 7 _hoge = new Hoge(this); // Hogeクラスのインスタンス生成時にForm1クラスのインスタンスを渡す。 8 } 9 public void AddListItem(string item) 10 { 11 listBox1.Items.Add(item); 12 } 13}
Hogeクラス
C#
1public class Hoge 2{ 3 Form1 _form1; 4 public Hoge(Form1 form1) 5 { 6 _form1 = from1; // 渡されたForm1をローカル変数へ 7 Huga(); 8 } 9 private void Huga() 10 { 11 _form1.AddListItem("Line:1") 12 } 13}
上記のコードではHogeクラスからlistBox1を直接いじるのではなく、Form1内にlistBox1へアイテムを追加するパブリックメソッドを作り、そのメソッドをHogeから呼び出すことでアイテムを追加しています。
Hogeインスタンス生成時に渡している this というのがForm1自身のインスタンスです。
投稿2016/05/30 18:37
編集2016/05/30 18:39総合スコア37
0
WindowsFormを作成するとき、基本的には複数のインスタンスを作成することがないメインとなる画面があることが多いので私はProgramクラスにメインとなるFormのインスタンスを保持するパターンを好んで使用します。
C#
1namespace WindowsFormsApplication1 { 2 static class Program { 3 4 public static Form1 ApplicationMainForm { get; private set; } 5 6 /// <summary> 7 /// アプリケーションのメイン エントリ ポイントです。 8 /// </summary> 9 [STAThread] 10 static void Main() { 11 Application.EnableVisualStyles(); 12 Application.SetCompatibleTextRenderingDefault(false); 13 Program.ApplicationMainForm = new Form1(); 14 Application.Run(Program.ApplicationMainForm); 15 } 16 } 17}
質問されているフォーム内のコントロールの参照については他の方も言ってるようなやり方で大丈夫だと思います。
本来、メインフォームを複数作成できなくするとか他にも色々ありますが、チームで開発するにしても多少のルールぐらいはあってもいいと思うので「メインフォームのインスタンスは自分で作成しないでね」といえば済むのでこの程度が簡単で分かりやすいと思ってます。
また、あまりコントロール自体を公開するのも良くはありませんが一応、デザイン画面でコントロールのスコープをprivateからpublic等に変更可能です。
投稿2016/05/31 03:45
総合スコア292
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
0
既に回答が付いていますので、
こんな記事もありますよレベルの紹介
dobonさんのサイト記事は、VB.NET & C# の事例がでています。
’
フォームが一つしか表示されないようにする
VB6と同様にフォームにアクセスできるようにする
http://dobon.net/vb/dotnet/form/singleform.html
投稿2016/05/31 01:38
編集2016/05/31 01:59総合スコア2028
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
0
こんにちわ。
Form1 の参照をコンストラクタあたりで
public static Form1Instance = null;
void Form1()
{
Form1Instance = this;
}
とかすれば、参照できますよ。
ただ、ListBox は public にしておく必要がありますね。
投稿2016/05/30 18:39
総合スコア1046
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
同じタグがついた質問を見る
C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2016/05/30 22:25
2016/05/31 07:43