• 締切済み

【.NET】動的に作成したコントロールの操作

動的に作成したコントロールのイベントハンドラから、 同じく動的に作成したコントロールを操作するにはどうすれば良いのでしょうか? どちらのコントロールもKani.csからForm1.csに追加するものです。 例) ・Form1.cs ~省略~ namespace Chef {  ~省略~  KANI kani = new KANI();  kani.form1 = this;  kani.KanaFire();  ~省略~ ・Kani.cs ~省略~ namespace Chef {  public class KANI{   public Form1 form1;   public void KaniFire(){    //ラベル作成    Label LabelTARABA = new Label();    LabelTARABA.Text = "かにふらい";    form1.Controls.Add(LabelTARABA);    //ボタン作成    Button ButtonZUWAI = new Button();    form1.Controls.Add(ButtonZUWAI);    ButtonZUWAI.Click += new System.EventHandler(ButtonZUWAI_Clicked);   }   public void ButtonZUWAI_Clicked(object sender, System.EventArgs e){    /*ここでLabelTARABAを操作したい*/   }

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

ループで回す必要はなかった…  int TargetIdx = this.Controls.IndexOf((Control)sender) - 1;  if(form1.Controls[TargetIdx].GetType() == typeof(Label))  {   Label LabelTARABA = (Label)form1.Controls[TargetIdx];   LabelTARABA.Text = "美味しい";  } くらいか。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

KaniFire()が複数回コールされていた場合はどれが対象になるんでしょう??? http://dobon.net/vb/dotnet/control/findcontrolbyname.html せめてNameプロパティでも設定してあれば……。 # まぁそれでも複数回コールされていたらダメなんですが……。 う~ん…… ButtonZUWAI_Clicked()内で form1.Controlsコレクションからsenderに相当するインデックスを検索。 その1つ前のインデックスのものが対象…でしょうかねぇ……。 public void ButtonZUWAI_Clicked(object sender, System.EventArgs e){  int TargetIdx;  for(TargetIdx = 0;TargetIdx < form1.Controls.Count;TargetIdx++)  {   if(form1.Controls[TargetIdx] == (Control)sender)   {    TargetIdx--;    break;   }  }  if(TargetIdx != form1.Controls.Count)  {   if(form1.Controls[TargetIdx].GetType() == typeof(Label))   {    Label LabelTARABA = (Label)form1.Controls[TargetIdx];    LabelTARABA.Text = "美味しい";   }  } } みたいな感じですかねぇ……。

関連するQ&A

  • 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# 計算処理中に実行中ウィンドウを表示させたい。

    アドバイスをお願いいたします。 やりたいこと: (1)メインウィンドウで「計算始めるボタン」を押す。 (2)すると計算中には「実行中」の文字が別ウィンドウで立ち上がる。 (3)計算が終わると別ウィンドウが閉じる。 下記プログラムの不具合: 別ウィンドウで「実行中」の文字を出させたいが、文字部分が描画されない。 注意:  下記プログラムはAthlon3000+で1秒ほどかかります。 CPUが遅いマシンで試す場合は「//計算処理」部分のfor重みを軽減させて実行して下さい。 using System; using System.Drawing; using System.Windows.Forms; //メインウィンドウ public class MainForm : Form { private Button button; private Label label; public MainForm() { button = new Button(); button.Text = "計算GO!!"; button.Click += new System.EventHandler(button_click); label = new Label(); label.Location = new Point(50,50); label.Text = "メインウィンドウ!"; Controls.Add(button); Controls.Add(label); Text = "MainForm"; BackColor = Color.Blue; } static void Main() { Application.Run(new MainForm()); } //計算GOボタンをクリックした時の処理 private void button_click(object sender, System.EventArgs e) { double z; SubForm Sub = new SubForm(); Sub.Show(); //計算処理 for(int i=0; i<=500000000; i++) z = double.MaxValue * double.MinValue; Sub.Close(); MessageBox.Show("計算終了"); } } //計算中を通知するウィンドウ public class SubForm : Form { private Label label; public SubForm(){ label = new Label(); label.Text = "実行中!"; label.Location = new Point(50,50); Text = "計算中通知ウィンドウ"; BackColor = Color.Red; Controls.Add(label); } }

  • C# 子のコントロールからイベントを送る方法?

    毎度お世話になっております。 何の手も加えていないフォームに自分で作った ユーザコントロールを張り付け、そのコントロールからイベントが 発生したら、親フォームを閉じるようにしたいと思っています。 下記にサンプルを記述します。 フォーム側(using文、Designer文は省略) namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string[] stLines = { "こんにちは。", "こんばんは。", "おはよう。", "さようなら。", "おやすみなさい。", }; public Form1() { InitializeComponent();  // 省略 JLabel j = new JLabel(stLines); j.Dock = DockStyle.Fill; this.Controls.Add(j); } } } ユーザコントロール側(Labelを継承) namespace WindowsFormsApplication1 { public class JLabel : Label { private string[] stLines = null; private int lineNo = 0; public JLabel(string[] Lines) { this.Click += new System.EventHandler(this.Jlabel_Click); this.stLines = Lines; this.lineNo = 0; } private void Jlabel_Click(object sender, EventArgs e) { this.lineNo++; if (this.stLines.Length > this.lineNo) { this.Text = this.stLines[this.lineNo]; } else { //ここでイベントを発生させたい //this.lineNo = 0; } } } } 上記のように、渡された文字列をもとに、クリックするごとに次の行を 表示するプログラムですが、行番号が行数を超えた場合にイベントを 発生させて、それを親のフォームが監視し、受け取った際にフォームを 閉じるといった処理をさせたいのです。 親のフォームにクリックイベントを仕掛ければ楽ではありますが、 子供のコントロールからの信号を、親が受け取る…といった流れにしたいのです。 以上、よろしくお願いいたします。

  • フォームのテキストコントロールへの出力

    Cは分かりますが、C++初心者です。 よろしくお願いします。 namespace sample1 外にある関数から、フォームのコントロールにアクセスするには、 どうしたらいいのでしょうか? ========================================================== #pragma once void DspData( ReadData *readdata ); //コールバック関数宣言 namespace sample1 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public __gc class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); } protected: void Dispose(Boolean disposing) { if (disposing && components) { components->Dispose(); } __super::Dispose(disposing); } private: System::Windows::Forms::Label * label1; private: System::Windows::Forms::Button * start; private: System::Windows::Forms::Button * end; public: System::Windows::Forms::TextBox * textBox1; private: System::ComponentModel::Container * components; void InitializeComponent(void) { } private: System::Void start_Click(System::Object * sender, System::EventArgs * e) { } }; } //------------------------------------------------ // DspData //------------------------------------------------ void DspData( ReadData *readdata ) { //***↓ここでフォームのテキストボックスへの表示を行いたい。***** textBox1->set_text("ここで出力") return; } ==========================================================

  • vb.net web 動的に作成したTableが消える

    よろしくお願いします 現在、vs.net 2005 で web ページを作成しています そこで質問があるので、ご教授の程よろしくお願いします。 test.aspx Table コントロール配置:Table1 Button コントロール配置:Button1 Label コントロール配置:Label1 Label コントロール配置:Label2 test.aspx.vb Partial Class test Inherits System.Web.UI.Page Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load Dim row As TableRow Dim col As TableCell If (Page.IsPostBack = False) Then Label2.Text = "aaa" row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) End If End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Rows.Count" & Table1.Rows.Count End Sub End Class ボタンを押すと、 Label2の "aaa" は保持されていて Table1が保持されないのはなぜなのでしょうか? Table1 の内容を保持させたいのですが その場合、どのようにすればよいのでしょうか

  • C# ユーザーコントロール作成

    C#で以下のようなユーザーコントロールを作成しています。 ・labelA、LabelBを2つ配置しただけのユーザーコントロール(UserA)を作成。 これをFormから動的に生成したいと考えています。 具体的には以下のようなコードを書きました。 UserA wUsr = new UserA(); wUsr.Location = new Point(1,1); this.Controls.Add(wUsr); この結果、ラベルはForm上に生成されなかったのですが、コードに間違いが あるのでしょうか?。 お分かりになるかたがいらっしゃればお教え頂ければと思います。 以上です。

  • ASP.NETでWebユーザーコントロールを作成していますが、あるユー

    ASP.NETでWebユーザーコントロールを作成していますが、あるユーザーコントロールを拡張して別のユーザーコントロールを作成したいと思っています。 Webカスタムコントロールであれば、クラスの継承の概念を使って派生クラスを作成し、追加したいコントロールやフィールドを派生クラスで追加するのですが、ユーザーコントロールでこれと同じ事はできないものでしょうか? Visual Studio 2005環境ですが、Webカスタムコントロールはデザイナを使った開発ができず、わざわざDLLにコンパイルした後aspxページに埋め込んでやらないと見た目を確認できません。その点、ユーザーコントロールは通常のWindowsフォームアプリケーションのように、デザイナ上でコントロールをD&Dし、プロパティエディタでプロパティの設定もできます。 下記に試してみたコードを示します。 [WebUserControl1.ascx] <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.WebUserControl1" %> <%@ Register Assembly="WebBaseFormLib" Namespace="WebBaseFormLib" TagPrefix="cc1" %> <asp:Button ID="Button1" runat="server" Text="Button1" /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> [WebUserControl1.ascx.cs] namespace WebApplication1 { public partial class WebUserControl1 : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } } } [WebUserControl2.ascx] <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl2.ascx.cs" Inherits="WebApplication1.WebUserControl2" %> <%@ Reference Control="~/WebUserControl1.ascx" %> <asp:Button ID="Button2" runat="server" Text="Button2" /> [WebUserControl2.ascx.cs] namespace WebApplication1 { public partial class WebUserControl2 : WebUserControl1 //WebUserControl1を継承 { protected void Page_Load(object sender, EventArgs e) { } } } こうした場合に、WebUserControl2をaspxページで使用してもButton2しか表示されません。 期待する動きとしては、WebUserControl1に配置したButton1とtextbox1が透過的に表示して欲しかったのですが。

  • Visual-C#の event キーワードの「意義」が分かりません

    Visual-C#というものを初めて触っている者です。 フォーム上にボタン等のコントロールを配置して、ボタンをダブルクリックすると、イベントハンドラをユーザが記述するコード部分(partial class)が表示されてくるのですが(Form1.cs)、このpartial classの残りの、ユーザが編集する必要のないコードはForm1.Designer.cs内に自動生成されます。 このForm1.Designer.cs内に、たとえば this.Button1.Click += new System.EventHandler( this.Button1_Click );  ←(1) のようなコードが自動生成されているわけです。 ここで、Button1とはButtonクラスのオブジェクトであり、ClickとはButtonクラスの(Controlクラスから継承した)Clickイベントだということです。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.click(VS.85).aspx public event EventHandler Click  ←(2) ここで使用されているEventHandlerとは何かというと、delegateです。 http://msdn.microsoft.com/ja-jp/library/system.eventhandler.aspx public delegate void EventHandler(Object sender, EventArgs e)  ←(3) 「イベントとは、コンピュータ・プログラムの実行に際し、何らかのアクションが発生した際にプログラムに発信される信号(これをメッセージと呼んだりする)をいう。」(『ウィキペディア(Wikipedia)』) この「イベント」を、.NetFrameworkのクラスライブラリでは、(2)のように「EventHandler」という名前のデリゲートクラス型の変数として定義しているわけですが、(2)の中の「event」というキーワードの「意義」が分かりません。 Controlクラス定義内で(2)式のように、コントロールの「クリック」イベントを、「EventHandler」という名前のデリゲートクラス型の変数と定義するというのなら、それはそれで分かるのですが、なぜ更に「event」というキーワードを付ける必要があるのかが、よく分からないのです。

  • C# 動的に読み込んだコントロールの削除

    C#にて動的に読み込んだ不特定多数のコントロールを削除する正しい手順は どのような物でしょうか。 MSDNによるとコンテナに読み込んだコントロールをFlowLayoutPanel.Clear()で クリアするとメモリリークにつながるため、Dispose()をしろとあります。 動的に作成したコントロールが不特定多数のため、Foreach文をつかい FlowLayoutPanel.Controlsで確認できた物をDispose()しましたが、偶数indexの コントロールしか削除されませんでした。 まぁ、これはなんとなく分かるのですが、では、正しくすべてのコントロールを 削除するにはどうしたら良いのか分かりません。 ご教示のほど、よろしくお願いいたします。 確認コード(空のForm1_Loadに貼り付け) ※現象を再現させるためのサンプルで意味はありません // コントロール配置用のコンテナ FlowLayoutPanel panel = new FlowLayoutPanel(); panel.Dock = System.Windows.Forms.DockStyle.Fill; this.Controls.Add(panel); // テストコントロール追加ボタン Button create = new Button(); create.Size = new Size(50, 25); create.Text = "create"; create.Click += (ss, ee) => { for (int i = 0; i < 100; i++) { TextBox text = new TextBox(); text.Size = new Size(50, 25); text.Text = i.ToString(); panel.Controls.Add(text); } }; panel.Controls.Add(create); // コントロール削除ボタン Button delete = new Button(); delete.Size = new Size(50, 25); delete.Text = "delete"; delete.Click += (ss, ee) => { foreach (var control in panel.Controls) { if (control is TextBox) { ((TextBox)control).Dispose(); } } }; panel.Controls.Add(delete);

  • C#でオブジェクトの有無を取得する

    オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。 この書き方の何がまずいのでしょうか? namespace オブジェクト検索 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Control c = Controls["form2"]; if (c != null) { ((TextBox)c).Text += "*"; } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); Application.DoEvents(); } } } ボタン2を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。