• ベストアンサー

C#でボタンの参照範囲をコードでpubicにしたい

現在Form1のボタンをクリックしたらForm2のボタンのEnableをfalseにするという簡単なプログラムを作っています。 これをするためには、一度Form2ボタンのプロパティのModifiersをpublicに変更しなくてはならないですが、これをプログラムのコードではどのように書けば良いのでしょうか。 要は、button1のModifiersをpublicにするプログラムコードが分かりません。 ご存知の方がいらっしゃいましたら、どうかご教授のほどお願いいたします。 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

書き忘れましたが、C#の質問は ソフトウェア より [技術者向] コンピューター > プログラミング のカテゴリのほうが適してると思います。

その他の回答 (1)

回答No.1

C#の言語仕様上、無理です。 button1を最初からpublicで定義しておけば簡単にEnableにアクセスできますが、まあやらないでしょう。 間接的にアクセスする手段を作ります。 (1)Form2 に Button1Enabled のような Enabledの値を設定するプロパティを作る (2)Form2 に EnableButton1(), DisableButton1() のようなEnabledを切り替えるメソッドを作る (3)Form2 に SetButton1Enabled(bool value) のような Enabledの値を設定するメソッドを作る など。 (1)が楽だと思います。 // Form2にプロパティを定義する public bool Button1Enabled { // button1.Enabledの値を設定する set { this.button1.Enabled = value; } } これをForm2のほうに定義しておいて、Form1のほうから例えば次のように使います。 Form2 frm2 = new Form2(); frm2.Show(); frm2.Button1Enabled = false; プロパティの使用 (C# プログラミング ガイド) http://msdn.microsoft.com/ja-jp/library/w86s7x04%28v=vs.90%29.aspx

参考URL:
http://msdn.microsoft.com/ja-jp/library/x9fsa0sw%28v=vs.90%29.aspx

関連するQ&A

  • HTMLのボタンを押せなくする方法

    お世話になります、 ブラウザのボタン(input type button)を押せなくする 方法(アプレットやVBのボタンのように) ご存知の方いらっしゃったらお願いします。 具体的にはJavaで言うところの button.enable(false) のような状態にしたいのですが。。。

    • ベストアンサー
    • HTML
  • C# スレッドでフォームを扱う

    スレッドとフォームの連携について質問があります。 「開始」ボタンをクリックしたら、 「開始」ボタンのEnableをfalseにして 他のクラスのスレッドで処理を開始します (中断ボタンが押されたら処理をやめるためにスレッド採用) この時、処理が終わったら「開始」ボタンのEnableをtrueに戻したいのです。 デリゲートのコールメソッドを使ったところ、フォームを生成したスレッド以外からフォームををいじってはいけないというエラーがでてしまいました。 [a]ユーザー操作を待ち受けるフォームのスレッド [b]処理系のスレッド このようなスレッドの構成の時、[a]が[b]の処理が終わったことを知り、buttonのプロパティを変更するためには、どうすればよいでしょうか?

  • マウスのボタン判定について

    仕事でJAVAを使ってWINDOWSのアプリ画面を作っています。 質問なのですが、マウスイベントで右ボタン、左ボタンどちらが押されたか 判定すると思いますが、 1.右ボタンが押された場合、左ボタンは押されているか? という所で詰まっています。逆のパターンは判定できたのですが、何故か1のパターンが 判定できません。 ・JAVAのバージョン(1.3.1) ・開発端末のOS(WindowsXP HomeEdition) public void mousePressed( MouseEvent e ) { int modifiers = e.getModifiers(); // 右左同時押しの場合 if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK && ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入る。 System.out.println( "同時押しです。" ) ; } // 左ボタンが押された場合 else if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK ) { // 右ボタンも押されているか? if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入っている。 System.out.println( "右ボタンも押されています。" ) ; } } // 右ボタンが押された場合 else if ( ( modifiers & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK ) { // 右ボタンも押されているか? if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入らない。 System.out.println( "右ボタンも押されています。" ) ; } } } ※(大雑把に書くとこんな感じです。) 個人的にはJAVAのバージョンに依存するものなのかなぁと考えているのですが、 1.3.1では駄目なのでしょうか? 乱文、雑文ではありますが、ぜひともご教授をお願いします。

    • ベストアンサー
    • Java
  • 【VB.net】フォーム間でのやり取りについて

    先日、同じような質問をさせて頂いたのですが、 解決に至らなかったため、もう少し質問内容を工夫しますので、再度質問させてください。 ・実行したいプログラム フォーム1のボタン1をクリックすると、フォーム2を開くと同時にフォーム2ボタン1がvisible=Trueになる。 フォーム1のボタン2をクリックすると、フォーム2を開くと同時にフォーム2のボタン1がvisible=Falseになり、ボタン2がvisible=Trueになる。 ・書いたコード ---------------- Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = True DirectCast(Me.Owner, Form2).Button2.Visible = False End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click Dim f As New Form2 f.Owner = Me f.Show() DirectCast(Me.Owner, Form2).Button1.Visible = False DirectCast(Me.Owner, Form2).Button2.Visible = True End Sub End class ---------------- ・問題点 「nullreferenceexceptionはハンドルされませんでした オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが発生します。 「DirectCast(Me.Owner, Form2).Button1.Visible = True」の部分のエラーです。 手書きで申し訳ありませんが、書きたいプログラムの参考画像も載せておきます。 数日前より調べては試し調べては試しと試行錯誤していますが、 正直手詰まりになっており、非常に困っております。 この他にも、フォーム間で命令を出しあいたい場面が多々あるのですが、 プロパティを変える程度のコードでつまずいていて、先に進めません。 手直しした簡単なサンプルコードを書いて頂けると非常に助かります。 以上、何卒よろしくお願い致します。

  • c#のプログラムについて。

    c#のプログラムについて。 お世話になります。 c#初心者です。 下記の様なコードを記述してますが、 「 Form1.Button1.Visible == false;」の部分で 「'WindowsFormApplication1.Form1'にButton1'の定義がありません。」 と言うエラーが出てしまいます。 どの様に定義して良いのかが分からず、悩んでいます。 どなたかお教え頂きたく宜しくお願い致します。        記 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication3 { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); string result = System.Environment.MachineName; if (result == "xxxxxxx") { Form1.Button1.Visible == false; } } } }

  • デザインからのプロパティからではなく、コードから直接変更しても問題ない

    デザインからのプロパティからではなく、コードから直接変更しても問題ないのでしょうか? C言語初心者です。 C++のForm.hを見ると #pragma region Windows Form Designer generated code /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(127, 31); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"button1aaa"; と書いてありますが this->button1->Text = L"button1あああ"; と直接変更しても問題なく動作しました。 こういう部分は、 デザインからのプロパティからではなくコードから直接変更しても問題ないのでしょうか?

  • 「戻るボタン」 : ボタンを使わずに、・・・

    HTMLでは、戻るボタンは、 <FORM> <INPUT TYPE="button" VALUE="戻る" onClick="history.back </FORM> ですが、この動作で、 戻るボタンではなく、 <table><tr><td>戻る</td></tr></table> をクリックするようにしたいのですが、・・・ 可能でしょうか。 可能でしたら、htmlをお願いします。

    • ベストアンサー
    • HTML
  • C# ユーザコントロール内のボタン押下を親で知る

    こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか? ---------------------------------------------------------------------- [Form1.cs] void Inform_UserControlButton1Click() { //親が持っている変数を使って処理を行いたい } void Form1_Load(....) { //ユーザコントロールを設置 UserControl1 ctrl = new UserControl1(); this.Controls.Add(ctrl);   //ユーザコントロール内のbutton1を見つける List<Control> ctrl = new List<Control>(cps.Controls.Find("button1", false)); //Form1が持っている変数を使う為の関数を通るようにしたい (Button)ctrl[0].Click += new System.EventHandler(Inform_UserControlButton1Click); //←エラー } ---------------------------------------------------------------------- [UserControl.cs] button1が配置されています。 ---------------------------------------------------------------------- こんな感じにしてできないかなー?と思っていたのですが、//←エラーのところで、 イベント 'System.Windows.Forms.Control.Click' は += または -= の左側にのみ表示されます。 となってしまい上手くいきません。 どのようにすればよいでしょうか?

  • C#のプロパティ設定のコードについて

    C#でユーザーコントロールを作成しています。 ※C#のカテゴリーがないので、こちらに質問させていただきます。 既存のコントロールを基底クラスとしているのですが、下記のコードで基底クラスのプロパティであるXXXを使用できないようにしました。 [Browsable(false)] [Obsolete("使用不可", true)] public new int XXX { get { return 0; } set { } } この、XXXに対してアクセスするコードはコンパイルエラーとなり、プロパティウィンドウにも表示されず、一応は使用できないようには出来ました。 ところが、コントロールをフォームに貼り付けて、他の使用可能なプロパティ(YYYプロパティとします)を変更すると、Form.Designer.csのInitializeComponent()に、XXXに値を設定するコードが自動生成されます。当然、そのままコンパイルすればエラーとなります。 ※XXXは、YYYの値に連動して値が変化する仕様です。YYYを追加したことでXXXが不要というか、あっては事故のもとになるので、使用不可にしました。 そこで、お教え願いたいのは、Form.Designer.csのInitializeComponent()に、プロパティの値を設定するコードが生成される仕組みです。若しくは、設定するコードが生成されないようにする方法です。 以上よろしくお願いします。

  • C# パネルの中にボタンを動的に配置したいです

    C# でフォームの中にパネルを置き、そのパネルの中に、ボタンを動的に配置したいです。 以下のページにあるようなことを、パネル内にしたいです。 動的にコントロールの配列を作成する http://dobon.net/vb/dotnet/control/buttonarray.html ---------------------- [C#] //ボタンコントロール配列のフィールドを作成 private System.Windows.Forms.Button[] testButtons; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, System.EventArgs e) { //ボタンコントロール配列の作成(ここでは5つ作成) this.testButtons = new System.Windows.Forms.Button[5]; //ボタンコントロールのインスタンス作成し、プロパティを設定する this.SuspendLayout(); for (int i = 0; i < this.testButtons.Length; i++) { //インスタンス作成 this.testButtons[i] = new System.Windows.Forms.Button(); //プロパティ設定 this.testButtons[i].Name = "Button" + i.ToString(); this.testButtons[i].Text = i.ToString(); this.testButtons[i].Size = new Size(30, 30); this.testButtons[i].Location = new Point(i * 30, 10); //イベントハンドラに関連付け this.testButtons[i].Click += new EventHandler(this.testButtons_Click); } //フォームにコントロールを追加 this.Controls.AddRange(this.testButtons); this.ResumeLayout(false); } //Buttonのクリックイベントハンドラ private void testButtons_Click(object sender, EventArgs e) { //クリックされたボタンのNameを表示する MessageBox.Show(((System.Windows.Forms.Button) sender).Name); } ----------------------------- プログラムの初心者です。宜しくお願いいたします。

専門家に質問してみよう