質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

51581閲覧

C#におけるForm1クラスの他クラスでの利用

ryo_se

総合スコア68

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2016/05/30 14:53

C#を勉強中です。

現在、 listBoxに値を挿入するという基本的なコーディングを行っているのですが、
下記点で質問があります。

  1. listBox1コントールを他のクラスから直接いじることはできないのか?
listBox1.Items.Add("Line:1");

上記の「listBox1」はlistBoxのNameですが、Form1クラスからしか変数を読み込むことができません(privateなので当たり前ではありますが)。

2. Form1クラスを他クラスから読み込むことはできないのか?
Form1クラスはプログラム実行時にインスタンス化しているため、newして新しいオブジェクトを生成しても、画面のコントロールとは別となってしまうと思います。
Form1クラスを参照できる方法等はあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

他のクラスから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
mqbdr

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo_se

2016/05/30 22:25

ご回答ありがとうございます。 一つ疑問点なのがこの方法の場合、起点的にはForm1クラスが最初になりますよね? (意味がわかりづらかったら申し訳ありません) 例えばですが、MainクラスでFormのインスタンスを利用するといったことはできないのでしょうか? (またはMainクラスでインスタンス化した別のクラスから) そもそもそういった構築はないのかもしれませんが・・
mqbdr

2016/05/31 07:43

MainクラスからForm1を表示する際に、Form1のインスタンスを変数に格納すれば、そのForm1インスタンスをMainクラスで使うことができます。 Mainクラスにて Form1 _form1; Hoge _hoge; Main() { // Form1のインスタンスを生成し表示 form1 = new Form1(); form1.show(); _hoge = new Hoge(form1); } Hogeクラスのインスタンス生成時にform1のインスタンスを渡していますが、Hogeクラス内で public Form1 _f1; と変数を作っておいて、別のクラスから任意のタイミングで _hoge._f1 = _form1; とする事で後からForm1のインスタンスを渡すこともできます。 Form1でHogeクラスを操作したい場合も、この方法で後からHogeインスタンスを渡せば可能です。
guest

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

dekaaki

総合スコア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
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちわ。

Form1 の参照をコンストラクタあたりで

public static Form1Instance = null;

void Form1()
{
Form1Instance = this;
}

とかすれば、参照できますよ。
ただ、ListBox は public にしておく必要がありますね。

投稿2016/05/30 18:39

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問