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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

2回答

1005閲覧

追加するパネル名を引数で設定する

YeP95

総合スコア0

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2021/09/19 12:37

編集2021/09/21 04:05
コンボボックスをパネルに追加する際、定数にパネル名を入れ、それを引数として受け取り、追加するパネルを判別したいのですがうまくいきません。(上手に説明できなくてすみません) ### 発生している問題・エラーメッセージ

エラーメッセージ
'string' に 'Constrols' の定義が含まれておらず、型 'string' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Constrols' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

該当のソースコード

c#

1pname.Controls.Add(comboBox); 2``````ここに言語を入力 3```ここに言語を入力

using System;
using System.Windows.Forms;
using System.Drawing;
class FormMain : Form
{
const string p1 = "panel1";
const string p2 = "panel2";
Panel panel1;
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
FormMain()
{
Text = "Button Click Sample";
ClientSize = new Size(600, 400);
Button btn1 = new Button();
btn1.Location = new Point(50, 50);
btn1.Text = "Create Panel";
btn1.Click += btn1_Click;
Controls.AddRange(new Control[] { btn1 });
this.Controls.Add(panel1);

}
public void CreateMyPanel( string pname )
{
panel1 = new Panel();
Panel panel2 = new Panel();
// Initialize the Panel control.
panel1.Location = new Point(56, 72);
panel1.Size = new Size(264, 152);
// Initialize the Panel control.
panel2.Location = new Point(356, 72);
panel2.Size = new Size(264, 152);
// Set the Borderstyle for the Panel to three-dimensional.
panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
// Add the Panel control to the form.
this.Controls.Add(panel1);
this.Controls.Add(panel2);
ComboBox comboBox = new ComboBox();
comboBox.Items.Add("A");
comboBox.Items.Add("B");
comboBox.Items.Add("C");
comboBox.Items.Add("D");
comboBox.Items.Add("E");
pname.Controls.Add(comboBox);
}
void btn1_Click(object sender, System.EventArgs e)
{
CreateMyPanel(p1);
CreateMyPanel(p2);

}
}

### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) 訳あってif文は使えないため、↓の方法以外でお願いいたします・ ```ここに言語を入力 if (pname = p1 ) {panel1.Controls.Add(comboBox)} else {panel2.Controls.Add(comboBox)} ``` ```

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/19 13:08 編集

ソースはコードの挿入(<code>アイコン)で```と```の間に記入してください。そのまま書くとインデントされないので読み辛いです。
退会済みユーザー

退会済みユーザー

2021/09/19 13:20 編集

なんか```が多すぎて正しく表示出来てない気がします。プレビューで表示を確認してください。
YeP95

2021/09/19 13:22

遅くなってしまい申し訳ございません。おそらく変更できていると思います。
YAmaGNZ

2021/09/19 13:26

提示されたソースだと"panel1"といった名前のパネルはありません。 panel1という変数名に入ったパネルを操作したいのか、Nameプロパティにpanel1とセットされているパネルを操作したいのかが判別できません。
YeP95

2021/09/19 13:46

後者です。
Zuishin

2021/09/19 13:47

pname は string であって Panel ではありません。 したがって Controls プロパティもありません。 それがエラーの原因です。 それと、if 文を使えばいいじゃないですか。 たぶん、使えない訳の方がどうにかなると思います。
YeP95

2021/09/19 13:56

CreateMyPanel(p1);として呼び出すことでp name に p1(=panel1)が格納され、pname.Controls.Add(comboBox)がpanel1.Controls.Add(comboBox) となるような処理を考えていたのですがやはり不可能でしょうか。
Zuishin

2021/09/19 13:59

不可能ではないけど、おそらくやる意味がない処理のように思います。 ユーザーコントロールを作れば済むのではないでしょうか。
退会済みユーザー

退会済みユーザー

2021/09/19 14:13

あとボタン連打するとPanelとComboBoxがどんどん増えていくでしょうね。 それが意図した動作なら別にいいんですが。
Zuishin

2021/09/19 14:15

ああ、言葉通じない系か。
TN8001

2021/09/19 15:01

[[Q&A] 追加するパネル名を引数で設定する - Qiita](https://qiita.com/YeP95/questions/5f81667756601d675ea8 > teratailでは、マルチポスト※の推奨はしていません。 > やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。 [ヘルプ|teratail(テラテイル)](https://teratail.com/help#posted-otherservice
退会済みユーザー

退会済みユーザー

2021/09/19 17:21

マルチポストで質問消して逃亡か…
guest

回答2

0

コンボボックスをパネルに追加する際、定数にパネル名を入れ、それを引数として受け取り、追加するパネルを判別したいのですがうまくいきません。

やりたいこととコードがあっていないように感じます。

コンボボックスをpanel1panel2どちらに入れるか選びたいということだと思いますが、panel1panel2は先にできていないとおかしくないですか?

radianさんのようにFindでもいいし、Formの子だとわかっているならインデクサも使えます。
Control.ControlCollection.Find(String, Boolean) メソッド (System.Windows.Forms) | Microsoft Docs

Control.ControlCollection.Item[] プロパティ (System.Windows.Forms) | Microsoft Docs

cs

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4 5namespace Questions360326 6{ 7 class FormMain : Form 8 { 9 private const string p1 = "panel1"; 10 private const string p2 = "panel2"; 11 12 [STAThread] 13 public static void Main() 14 { 15 Application.EnableVisualStyles(); 16 Application.SetCompatibleTextRenderingDefault(false); 17 Application.Run(new FormMain()); 18 } 19 20 FormMain() 21 { 22 Text = "Button Click Sample"; 23 ClientSize = new Size(600, 400); 24 25 var btn1 = new Button { Location = new Point(50, 50), Text = "Add ComboBox", }; 26 btn1.Click += btn1_Click; 27 28 var btn2 = new Button { Location = new Point(350, 50), Text = "Add ComboBox", }; 29 btn2.Click += btn2_Click; 30 31 var panel1 = new Panel 32 { 33 Name = p1, 34 Location = new Point(56, 72), 35 Size = new Size(264, 152), 36 BorderStyle = BorderStyle.Fixed3D, 37 }; 38 39 var panel2 = new Panel 40 { 41 Name = p2, 42 Location = new Point(356, 72), 43 Size = new Size(264, 152), 44 BorderStyle = BorderStyle.Fixed3D, 45 }; 46 47 Controls.AddRange(new Control[] { btn1, btn2, panel1, panel2, }); 48 } 49 50 private void btn1_Click(object sender, EventArgs e) 51 { 52 AddComboBox(p1); 53 ((Button)sender).Visible = false; 54 } 55 private void btn2_Click(object sender, EventArgs e) 56 { 57 AddComboBox(p2); 58 ((Button)sender).Visible = false; 59 } 60 61 private void AddComboBox(string pname) 62 { 63 var comboBox = new ComboBox(); 64 comboBox.Items.AddRange(new string[] { "A", "B", "C", "D", "E", }); 65 66 var panel = Controls[pname] as Panel; // インデクサ 67 panel?.Controls.Add(comboBox); 68 } 69 } 70}

投稿2021/09/19 15:01

編集2023/07/29 05:43
TN8001

総合スコア9862

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

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

0

例えば、Nameが"Panel1"というPanelがフォームにあって、そこにComboBoxを追加するなら、

cs

1 ComboBox comboBox = new ComboBox(); 2 comboBox.Items.Add("A"); 3 comboBox.Items.Add("B"); 4 comboBox.Items.Add("C"); 5 comboBox.Items.Add("D"); 6 comboBox.Items.Add("E"); 7 8 this.Controls.Find("Panel1", true).FirstOrDefault()?.Controls.Add(comboBox);

こんな感じで出来るのではないかと。

投稿2021/09/19 13:30

編集2021/09/19 13:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YeP95

2021/09/19 13:49

void btn1_Click を編集しました。 コードのように引数を設定して追加パネルを設定したいと考えております。
退会済みユーザー

退会済みユーザー

2021/09/19 13:56 編集

私の書いたコードの意味は理解出来ます? Formから文字列でコントロール(この場合はPanel1)探して、その子にComboBoxを追加してるだけです。引数の文字列あるんだから、あとはどうすればいいか判りますよね。
YeP95

2021/09/19 14:19

this.Controls.Find("pname", true).FirstOrDefault()?.Controls.Add(comboBox);でしょうか? visual studioでためしているのですがうまくいきません...
退会済みユーザー

退会済みユーザー

2021/09/19 14:27 編集

それはpnameという変数に入っている名前ではなく、"pname"という名前のコントロールを探してます。あと、質問文のソースだとPanelのNameプロパティ設定してないから、Findで探すならNameプロパティを先に設定しないと見つからないと思います。1から10まで説明するのはさすがにお断りしたいので、最低限の文法を入門書やMicrosoftのC#ドキュメント等で勉強してから始めた方が良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問