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

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

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

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

Q&A

解決済

3回答

7026閲覧

【C#】privateメソッド内のローカル変数を参照したい

Mr.sijimi

総合スコア21

C#

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

0グッド

0クリップ

投稿2020/07/30 04:50

編集2020/07/30 06:03

Test2.cs内でInitializeComponent()がPrivateで定義されています。その定義の中で宣言されているexample.Hiddenの値をTest1.csのif文処理内で書き換えたいというのが目的です。

C#

1Test1.cs 2public partial class TestPrivate 3{ 4 private void btnCkuck_Event(object sender, EventArgs e) 5 { 6 if(条件文) 7 { 8 //if文処理 9 //exampleのHiddenをここで書き換えたい 10 } 11 } 12}

C#

1Test2.cs 2partial class TestPrivate 3{ 4 private void InitializeComponent() 5 { 6 Example example = new Example("Column1"); 7 example.Hidden = true; 8 } 9}

調べた結果、privateは同クラスであれば参照が可能というのは理解できております。
しかし、同クラスにはなっているが別項目になっている場合にどう指定すればいいのかがわかりません。

わかる方教えてください。

###追記
作っている内容はWindows Formで、
1.選択ボックス(プルダウン式)
2.データテーブル
のあるウィンドウを作成しております。
選択ボックスで選択した内容によってデータテーブルの表示項目を操作する
というのが今回の目的となります。

スペック
OS:Windows10 Pro 64bit
IDE:Visual Studio 2015

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/30 04:53

何を作っているか (Windows Forms? WPF? ASP.NET Web Forms? その他?) ぐらいは書けませんか?
Mr.sijimi

2020/07/30 05:00

追記事項として追加させていただきました。
dodox86

2020/07/30 05:02

リフレクション(System.Reflection) で他クラスのprivateフィールドに無理やりアクセスしたい、と言う技術要素的な話かと思いましたが、むしろオブジェクト指向~クラス設計の話のようですね。
ozwk

2020/07/30 05:05

別項目というのはファイルがpartialで別になっているということですか?
Mr.sijimi

2020/07/30 05:10

ozwk様 おそらくおっしゃる通りの状態かと。行き違いが無いようご説明すると 別項目とはTest1.csとTest2.csでファイルが別になっているということです。 (Visual Studioだと項目という表記だったので記載しました) 分かりにくい説明で申し訳ありません。
YAmaGNZ

2020/07/30 05:12 編集

回答のほうにも書きましたが、exampleはどこに定義してあるのですか?
ozwk

2020/07/30 05:30

「同名クラスのprivate 変数」じゃなくて 「privateメソッド内のローカル変数」ですね?
Mr.sijimi

2020/07/30 05:34

ozwk様 その通りです。タイトルを修正させていただきます。
YAmaGNZ

2020/07/30 05:47 編集

もしかして、データテーブルと言うのはDataGridView(もしくは類似コントロール)のことで、選択ボックスの選択によってあるColumnの表示、非表示を切り替えたいということなのでしょうか?
退会済みユーザー

退会済みユーザー

2020/07/30 05:56

> 追記事項として追加させていただきました。 「何を作っているか (Windows Forms? WPF? ASP.NET Web Forms? その他?) 」とお聞きしているのですが?  「選択ボックス」とは何ですか? CheckBox のことですか? CheckBox クラスは Windows Forms, WPF, ASP.NET Web Forms のいずれにもあるのですよ。html にもあります。
Mr.sijimi

2020/07/30 06:04

SurferOnWww様 大変失礼いたしました。 追記内容修正させていただきました。
退会済みユーザー

退会済みユーザー

2020/07/30 06:10

選択ボックス(プルダウン式) とは ComboBox のことですか?
Mr.sijimi

2020/07/30 06:13

SurferOnWww様 ComboBoxで間違いないです。
guest

回答3

0

ベストアンサー

部分クラスと部分メソッド (C# プログラミング ガイド)
こちらを読むことをお勧めします。

すみません読み違えしておりました。
てっきり下記みたいな感じでプライベートメンバーとして定義してあるのだと思いましたが

C#

1partial class TestPrivate 2{ 3 private Example example; 4 private void InitializeComponent() 5 { 6 example.Hidden = true; 7 } 8}

Test2.csのexampleは何でどこに定義してあるのでしょうか?

投稿2020/07/30 04:58

編集2020/07/30 05:05
YAmaGNZ

総合スコア10489

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

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

Mr.sijimi

2020/07/30 05:16 編集

このコードは、Windows Formファイルで作成しており Test2.csはTest1.csの配下にTest2.Designer.csとして作成されております。 理解力が乏しく申し訳ありません。 ご回答の内容に行き違いがある場合はご指摘ください。
Mr.sijimi

2020/07/30 05:19

すみません、定義元の意味を読み違えてました。 質問文内のコードを修正いたします。 InitializeComponent()内にて定義されておりました。
ozwk

2020/07/30 05:20

InitializeComponent()のローカル変数ということですか?
Mr.sijimi

2020/07/30 05:22

ozwk様 おっしゃる通りでローカル変数となっております。
YAmaGNZ

2020/07/30 05:23

InitializeComponentのローカル変数として定義されているのであれば、InitializeComponentを抜けてしまうと無くなってしまって他でアクセスする以前の問題ですがどうなのでしょうか?
YAmaGNZ

2020/07/30 05:24

認識違いが怖いので、そのexampleの定義も含めてソースを提示してもらえませんか?
Mr.sijimi

2020/07/30 05:32

開示させていただきたいのですが、質問の内容以外はコードの開示が難しいソフトウェアを使用しているため、今回簡易的に書き換えて記載させていただいております。 自己都合でのご質問にご容赦ください。
YAmaGNZ

2020/07/30 05:38

提示ソースを確認させて頂きましたが、ローカル変数であればスコープ外では存在しませんがどのようにアクセスするのでしょうか? exampleをまた別の何かに格納していたりするのでしょうか?
Mr.sijimi

2020/07/30 05:46

YAmaGNZ様 読み取りずらい質問内容で申し訳ありません。 同名クラスだったためアクセスができるのでは?と思い、調べたのですが解決できなかったため質問させていただきました。 そのため、ローカル変数へのアクセス方法があるのか、あった場合は獰悪さするのかというのが今回の質問の目的でした。 おっしゃっている内容を見る限りでスト、ローカル変数の参照は同クラスであってもできないということなんですね。
YAmaGNZ

2020/07/30 05:51

ローカル変数の場合、今回のように別ファイルに別れて定義されているクラスじゃなくて1つのファイルに下記のように void Proc1() { int a; a = 0; } void Proc2() { a = 1; } と書いたとしてもできません。 ただ、質問者さんが実際にやりたいことと今回聞いていることは全く別のことなのではないかと予想しています。
YAmaGNZ

2020/07/30 06:05

InitializeComponentやTest2.Designer.csと仰られているので想像ですが、そのexampleが何かしらのコントロールを指すのであれば、InitializeComponentにローカル変数として定義されるということはないはずです。
Mr.sijimi

2020/07/30 06:08

Test2.Designer.csのInitializeComponent()内の記述はWindows Formsでデザインモード(?)にて設定を変更すると自動で書き換えられるようなんですが、 今回それを意図的に変えられないかと疑問を持ち質問させていただきました。
YAmaGNZ

2020/07/30 06:14

自動で生成されますが、「ローカル変数」として定義されることはありません。 例えばボタンの場合は下記のような感じでプライベートメンバーで定義されます。 コントロールによって差はないはずです。 partial class Form1 { private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); } private System.Windows.Forms.Button button1; } しかし、貴方は何度も「ローカル変数」と仰っています。 このような行き違いが怖かったので、ソースを提示してくださいとお願いしたのですが、その提示ソースすら思い込みが入り込んだ内容になっているのではないでしょうか?
YAmaGNZ

2020/07/30 06:18

そして、「ローカル変数」ではなく「プライベートメンバー」だった場合、提示されているソースですと「partial」と部分クラスとして定義されている形になるので、何も考えずにアクセスできるはずです。 もし実際に行われてエラーとなり出来ないというのであれば、提示されたソースが違うことになります。
Mr.sijimi

2020/07/30 06:27

今見ているソースに関しては自身が開発したソフトウェアではなく、すでに開発済みのソフトウェアとなっております。 そちらを、学習用途にて一時的に触らせていただいております。 また、自動生成された内容を確認してみるとローカル変数と詳細が表示されているのは確かです。 となると本来プライベートメンバーで定義されるところローカル変数として定義されるようになっている可能性があることになりますね。 そこのあたりを今一度勉強します。
YAmaGNZ

2020/07/30 06:35

「学習用途にて一時的に触らせていただいております」とのことであれば、会社なり学校なりの組織なのでしょうから、そちらに聞いてみたほうがいいかもしれません。 そうなれば、隠す必要もないでしょうし実際のソースを見ながら話が出来るかと思います。
Mr.sijimi

2020/07/30 07:29

YAmaGNZ様 ありがとうございます。 やはり、開示できる内容が限られてしまうと互いの認識の関係が難しいですね。。。 そのあたりも含め学習します。 今回の質問はYAmaGNZ様の回答が求めていた内容に近かったためBAに選ばせていただきます。
退会済みユーザー

退会済みユーザー

2020/07/30 08:03

> 自動で生成されますが、「ローカル変数」として定義されることはありません。 この部分ですが、「GenerateMember」の設定によってはローカル変数となりますね。
YAmaGNZ

2020/07/30 08:13

確かにそうですね。失念しておりました。 そうなると質問者さんの触ろうとしていたものもそのように設定されているのかもしれませんね。 ただ、このプロパティを変更しているということは他で触って欲しくないということだと思いますのでやはり聞いたほうがよさそうですね。
guest

0

ローカル変数自体は不可能ですが、「Example」がコントロールであればおそらく可能です。

「InitializeComponent()」の中で初期化されているということから、「Example」はコントロールであるとし、
メンバ変数が生成されていないことから、プロパティ「GenerateMember」が「false」であると想定し、以降回答いたします。

「InitializeComponent()」の中で下記のように、「this.Controls」などへ追加が行われていると思います。
追加先は「Panel」や「GroupBox」の中であればその中の「Controls」へ、「DataGridView」のカラムであれば「Columns」へ追加されるなど、
ソースを確認し、どこに追加されているか把握する必要があります。

csharp

1private void InitializeComponent() 2{ 3 Example example = new Example("Column1"); 4 example.Hidden = true; 5 6 // (中略) 7 8 this.Controls.Add(example); // ← 仮に「this.Controls」へ追加が行われているとする。 9}

上記の場合、「this.Controls」の中に、「Example」型が1つだけであれば下記のような形で取得できます。

csharp

1var example = this.Controls.Cast<Control>().FirstOrDefault(e => e is Example) as Example;

2つ以上存在する場合などは、個別に判定する必要があります。
また、「this.Controls」以外の場合は入れ子を辿る必要がでてくるかもしれません。

いろいろ書きましたが、質問の場合、「データテーブル」の「Column1」ということから、
恐らく「データテーブル」自体から、「Column1」を操作できるような作りになっている気がします。

また、デザイナーからの変更が問題なければ、プロパティ「GenerateMember」を「true」に書き換えてしまえば、
メンバ変数が生成されるので処理できるかと思います。

投稿2020/07/30 09:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

YAmaGNZ さんの回答のやり取りを見て分かったのですが、InitializeComponent メソッドというのは Windows Forms アプリを Visual Studio のテンプレートを使って作ったときに自動生成される .Designer.cs ファイルにあるメソッドのことで、質問はそれをそれをエディタで書き換えることはできるかということですよね?

(そういうことは質問の一番最初に書いてください。情報の後出し小出しはこういうサイトでは最も嫌われることの一つです)

それは、

Required method for Designer support - do not modify the contents of this method with the code editor.

と書いてある通りダメです。それは質問者さんも分かったうえで質問していませんか?

.Designer.cs ファイル内ではなく、.cs ファイル内でやればいいのでは? 例えば以下のように。

public partial class TestPrivate : Form { private Example _exampl; public TestPrivate() { InitializeComponent(); this._example = new Example("Column1"); this._example.Hidden = true; } // ・・・中略・・・ }

投稿2020/07/30 06:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YAmaGNZ

2020/07/30 06:40

私とのやりとりを見ていただければ分かりますがInitializeComponent メソッドに「ローカル変数」として定義してあるそうです。 そして、.Designer.cs ファイルをエディタで書き換えるのではなく、部分クラスとして定義された部分で触れないかということです。
退会済みユーザー

退会済みユーザー

2020/07/30 07:02

> InitializeComponent メソッドに「ローカル変数」として定義してあるそうです。 質問者さんの 2020/07/30 14:22 のコメントで、 > ozwk様 > おっしゃる通りでローカル変数となっております。 とレスしているところですね? 質問者さんがいろいろ分かったうえでレスしているのか少々疑問ですが、そういうことであれば InitializeComponent メソッドから外して、上の私の回答のようにすれば良さそうだと思うのですが。
Mr.sijimi

2020/07/30 07:24

ご回答ありがとうございます。 InitializeComponent()内の記述は故意に変更せず、参照する方法があれば知りたかったです...。
退会済みユーザー

退会済みユーザー

2020/07/30 07:40

質問のコードでは不可能ですね。変数のスコープについて勉強してください。 次回質問する機会があったら、その時は情報の後出し小出しは絶対しないようお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問