質問のタイトルが間違っていたらすいません。
###実現したいこと
0. 静的クラスからメインフォームにある13個のボタンにアクセスしたい。具体的は,ボタンを押して別フォームを開いたら,メイン画面の13個のボタンを操作不可(Enabledをfalse)にし,フォームを閉じたら,操作有効(Enabledをtrue)にしたい。
0. メインフォームにある13個のボタン,どれかをクリックしたら,他のボタンが押せないようにしたい(ただし,モーダル表示ではなく,モーダレス表示。(画面表示中もほかの画面(13個のボタンではないコントロールをクリックして画面)を開くことがあるから。))
###試したこと
1.サブ・フォームからメイン・フォームのコントロールに値を ...から別フォームクラスからメインフォームクラスにあるコントロールのアクセス方法は,コンストラクタでメインフォームを参照渡しすることで,アクセスできることは分かりました。ですが,現在,開発中のアプリではメインフォームのボタンが13個あるので,上記URLのやり方を取り入れると,変更箇所が多いので,共通関数を作ってそれをコールしたいと考えています。
2.C#でデザインパターンSingletonパターン編 | cloud.config ...を参考に,メインフォームのシングルトンパターンを作成し,静的クラスの共通関数からメインフォームにアクセスできないかと考えたのですが,「Form1.Form1()はアクセスできない保護レベルになっています」とエラーが表示されます。
静的クラス(共通関数)でメインフォームのコントロールは参照できないのでしょうか?どなたかご教授お願いいたします。デザインパターンを絶対使いたいわけではありません。調べていて,1のやり方だとメインフォームの宣言が各フォームでする必要があると思ったので,シングルトンパターンとか使えないかなと思った次第です。
###アプリ実行時の画面
実際のボタンは13個だけど,練習で3つ
Form1,Form2,Form3,Form4のSize(300, 300)
Button1, 2,3のModifiers(Internal→publicに変更)
###ソース
Program.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using System.Windows.Forms; 6 7namespace WindowsFormsApp1 8{ 9 static class Program 10 { 11 /// <summary> 12 /// アプリケーションのメイン エントリ ポイントです。 13 /// </summary> 14 [STAThread] 15 static void Main() 16 { 17 Application.EnableVisualStyles(); 18 Application.SetCompatibleTextRenderingDefault(false); 19 Application.Run(new Form1()); // ←エラー CS0122 'Form1.Form1()' はアクセスできない保護レベルになっています 20 21 } 22 } 23}
Form1.cs
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp1 12{ 13 public partial class Form1 : Form 14 { 15 internal static Form1 form1; 16 17 // コンストラクタ 18 private Form1() 19 { 20 InitializeComponent(); 21 } 22 23 // シングルトンパターン 24 public static Form1 GetInstance() 25 { 26 if(form1 == null) 27 { 28 form1 = new Form1(); 29 return form1; 30 } 31 return form1; 32 } 33 34 private void button1_Click_1(object sender, EventArgs e) 35 { 36 // 自フォームへの参照を渡す 37 //Form2 f2 = new Form2(this); 38 Form2 f2 = new Form2(); 39 // サブフォームをモーダレス形式で表示 40 f2.Show(); 41 } 42 43 private void button2_Click(object sender, EventArgs e) 44 { 45 // 自フォームへの参照を渡す 46 //Form3 f3 = new Form3(this); 47 Form3 f3 = new Form3(); 48 // サブフォームをモーダレス形式で表示 49 f3.Show(); 50 } 51 52 private void button3_Click(object sender, EventArgs e) 53 { 54 // 自フォームへの参照を渡す 55 //Form4 f3 = new Form4(this); 56 Form4 f3 = new Form4(); 57 // サブフォームをモーダレス形式で表示 58 f3.Show(); 59 } 60 } 61} 62
Form2.cs
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp1 12{ 13 public partial class Form2 : Form 14 { 15 //Form1 f1; 16 17 // コンストラクタ 18 //public Form2(Form1 f) 19 public Form2() 20 { 21 InitializeComponent(); 22 23 // メインフォームの参照を保存 24 //f1 = f; 25 } 26 27 private void Form2_Load(object sender, EventArgs e) 28 { 29 //f1.button1.Enabled = false; 30 //f1.button2.Enabled = false; 31 //f1.button3.Enabled = false; 32 Common.SetButtonEnabled(false); 33 } 34 35 private void Form2_FormClosed(object sender, FormClosedEventArgs e) 36 { 37 //f1.button1.Enabled = true; 38 //f1.button2.Enabled = true; 39 //f1.button3.Enabled = true; 40 Common.SetButtonEnabled(true); 41 } 42 } 43} 44
Form3.cs
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp1 12{ 13 public partial class Form3 : Form 14 { 15 //Form1 f1; 16 17 //public Form3(Form1 f) 18 public Form3() 19 { 20 InitializeComponent(); 21 22 //// メインフォームの参照を保存 23 //f1 = f; 24 } 25 26 private void Form3_Load(object sender, EventArgs e) 27 { 28 //f1.button1.Enabled = false; 29 //f1.button2.Enabled = false; 30 //f1.button3.Enabled = false; 31 Common.SetButtonEnabled(false); 32 } 33 34 private void Form3_FormClosed(object sender, FormClosedEventArgs e) 35 { 36 //f1.button1.Enabled = true; 37 //f1.button2.Enabled = true; 38 //f1.button3.Enabled = true; 39 Common.SetButtonEnabled(true); 40 } 41 } 42} 43
Form4.cs
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp1 12{ 13 public partial class Form4 : Form 14 { 15 //Form1 f1; 16 17 //public Form4(Form1 f) 18 public Form4() 19 { 20 InitializeComponent(); 21 } 22 23 private void Form4_Load(object sender, EventArgs e) 24 { 25 //f1.button1.Enabled = false; 26 //f1.button2.Enabled = false; 27 //f1.button3.Enabled = false; 28 Common.SetButtonEnabled(false); 29 } 30 31 private void Form4_FormClosed(object sender, FormClosedEventArgs e) 32 { 33 //f1.button1.Enabled = true; 34 //f1.button2.Enabled = true; 35 //f1.button3.Enabled = true; 36 Common.SetButtonEnabled(true); 37 } 38 } 39} 40
Common.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace WindowsFormsApp1 8{ 9 public static partial class Common 10 { 11 public static void SetButtonEnabled(bool flg) 12 { 13 var form = Form1.GetInstance(); 14 15 form.button1.Enabled = flg; 16 form.button2.Enabled = flg; 17 form.button3.Enabled = flg; 18 } 19 } 20} 21
###開発環境
OS:Windows7 64bit
IDE:Visual Studio Professional2017
回答4件
あなたの回答
tips
プレビュー