• ベストアンサー

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

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

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

  • ベストアンサー
  • hogya
  • ベストアンサー率67% (49/73)
回答No.1

そのコード自体には問題ないので、そのコードをどこに書いているかとか、その他のコードが書いてるかとかの問題ではないでしょうか。例えばそのコードだけをフォームのLoadイベントに書いた場合はどうですか?

関連するQ&A

  • 【.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を操作したい*/   }

  • 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' は += または -= の左側にのみ表示されます。 となってしまい上手くいきません。 どのようにすればよいでしょうか?

  • ユーザーコントロールの配列化

    VB.NETのWindowsコントロールライブラリで作成したコントロールをメインになるプロジェクトから動的に呼び出したいのですが、複数のコントロールをボタンで表示非表示を行いたいので、配列化したいと考えているのですが、どのようにすればよいですか? public testControl() as Object Private Sub Form_Load(... testControl(0) = New Test1.Form1 testControl(1) = New Test2.Form1 testControl(2) = New Test3.Form1 ... For i = 0 to 10 testcontrol(i).Location = New Point(0,0) testcontrol(i).Size = New Size(100,100) testcontrol(i).Visible = False Next End Sub 見たいな処理を行いたいと考えています。 ほかによい方法があれば教えてください。

  • C# ボタンコントロール内で文字の改行

    C#でWindowsアプリケーションを作成しています。 ユーザーコントロールでカスタマイズしたボタンを作成しました。 また、そのボタンを動的に配置していく処理を作成しました。 ボタンに表示するボタン名(文字列)が長いものもあるので、改行を させようと思い、以下のようなコードを書きました。 UCtl.BT_Button1.Text = "あ" + Environment.NewLine + "い"; また、このユーザーコントロール「UCtl」は以下の配列に格納します。 cControl1 = new Control[5]; その後、パネルの上に追加していっています。 wPanel.Controls.Add(cControl1[0]); wPanel.Controls.Add(cControl1[1]); しかし、期待する結果”あ”改行”い”と表示されず、”あ”のみが表示されます。 原因として考えられることがお分かりの方がいらっしゃればお教えいただきたいです。 以上です。

  • VB2005で、動的にコントロールを作成出来ない件

    MDIのフォームで、 子フォーム1にコントロール(ラベルなど)を追加したい場合、 子フォーム2のボタンクリックで追加しようとすると 追加されません。 (子フォーム1のボタンで同一フォームへコントロールを  追加しようとすると追加できました。) どのようにすれば追加できるでしょうか? 子フォーム2の追加ボタン関数のコード Private Sub Add_click()  AddLabel(子フォーム1, "hogehoge") End Sub モジュール(関数群)のコード Private Sub AddLabel(Byval objForm As Form, ByVal strText As String)  Dim ctlAddLabel As New Label()  With ctlAddLabel   .AutoSize = False   .Location = New Point(0, 0)   .Size = New Size(200, 40)   .Name = "Label" & Counter 'Counter は追加の度に1ずつ増えます   .Text = strText  End With  objForm.Controls.Add(ctrlAddLabel) End Sub

  • コード上でコントロール配置

    いつもお世話になっております。 コード上でコントロールを配置したいのですが、うまくいきません。 Dim location As New Point(100, 100) Dim button As Button button = New Button button.Height = 50 button.Weight = 50 button.Location = location button.Visible = True 何が足りないのか・・教えていただきたいです。。

  • 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);

  • ラベル要素の重ねがけ

    いわゆるノベルゲーム見たく、背景に一枚絵、手前に立ち絵というものを配置したいと思っています。 現在上記のようなコントロールの配置を行い、exe起動直後に立ち絵および背景絵がフェードインしてきます。その後、下部に配置したテキスト用のラベルをクリックすると立ち絵のみフェードアウトで消えるようなソースを作っています。が、手前の立ち絵三枚分がフェードアウトすると、その立ち絵ラベルの箇所の部分が背景絵を塗りつぶしているのかわかりませんが、背景絵の部分が虫食い状態になってしまいます。どうやったら完全に立ち絵を消せるのでしょうか?以下がソースになります。 public class MainClass{ public static void Main(string [] args){ FormClass formObj = new FormClass(); Application .Run(formObj); } } public class FormClass : Form{ public LabelFade labelRight; public LabelFade labelCenter; public LabelFade labelLeft; public LabelFade labelBack; public LabelFade labelText; public FormClass(){ this.Width = 1000; this.Height = 700; this.labelRight = new LabelFade(); this.labelRight.Width = 200; this.labelRight.Height = 500; this.labelRight.ImageSourcePath = "C:\\c#\\f01.jpg"; this.labelRight.Location = new Point(100,200); this.labelCenter = new LabelFade(); this.labelCenter.Width = 200; this.labelCenter.Height = 500; this.labelCenter.ImageSourcePath = "C:\\c#\\f02.jpg"; this.labelCenter.Location = new Point(400,200); this.labelLeft = new LabelFade(); this.labelLeft.Width = 200; this.labelLeft.Height = 500; this.labelLeft.ImageSourcePath = "C:\\c#\\f03.jpg"; this.labelLeft.Location = new Point(700,200); this.labelBack = new LabelFade(); this.labelBack.Width = this.ClientSize.Width; this.labelBack.Height = this.ClientSize.Height; this.labelBack.ImageSourcePath = "C:\\c#\\f04.jpg"; this.labelBack.Location = new Point(0,0); this.labelText = new LabelFade(); this.labelText.Width = 800; this.labelText.Height = 200; this.labelText.Location = new Point(100,500); this.labelText.BackColor = Color.Transparent; this.Controls.Add(this.labelText); this.Controls.Add(this.labelRight); this.Controls.Add(this.labelCenter); this.Controls.Add(this.labelLeft); this.Controls.Add(this.labelBack); this.labelText.Click += new EventHandler(this.OutMethod); this.Load+= new EventHandler(this.RunMethod); } public void RunMethod(Object sender ,EventArgs e){ this.labelBack.SetTimerEvent(); this.labelRight.SetTimerEvent(); this.labelCenter.SetTimerEvent(); this.labelLeft.SetTimerEvent(); } public void OutMethod(Object sender ,EventArgs e){ this.labelRight.FadeOut(10); this.labelCenter.FadeOut(70); this.labelLeft.FadeOut(45); } }

  • 【VB2005】コントロールを配列に。

    下記のコードを変更して、コントロールの値を配列に代入して、 その値をもとに、ボタンを複製して追加したいと思っています。 Public Class frmStart Dim btnNewButton1 As New Button Private Sub frmStart_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load NewButton1.Text = "処理1" btnNewButton1.ForeColor = Color.DimGray btnNewButton1.Location = New Point(10, 100) btnNewButton1.Size = New Size(180, 30) '// ボタンを追加します Me.Controls.Add(btnNewButton1) end sub End Class やりたいことは、Dim btnNewButton() As New Button のようにデータを配列にして、 btnNewButton(0).ForeColor = Color.DimGray btnNewButton(0).Location = New Point(10, 100) btnNewButton(0).Size = New Size(180, 30) btnNewButton(1).ForeColor = Color.DimGray btnNewButton(1).Location = New Point(380, 100) btnNewButton(1).Size = New Size(180, 30) '// ボタンを追加します Me.Controls.Add(btnNewButton(0))     Me.Controls.Add(btnNewButton(1)) という事をしたいのですが、方法が解らなくて困ってます。 お知恵を貸してください。

  • C#でFormオブジェクトのイベントについて

    C#において Formオブジェクトに付加したコントロールのMouseWheelイベントについて質問です。 ある特定のコントロールにMouseWheelイベントを付加してホイールボタンの動きをつけたのですが、どうも特定のコントロールだけでなく、Formオブジェクト全体にWheelのイベントが付加されてしまっているようです。以下のコードがそれです。 using System; using System.Windows.Forms; using System.IO; using System.Drawing; //実行クラス public class MainClass{ //実行メソッド public static void Main(string [] args){ NewForm formObj =new NewForm(); formObj.SetLabel(); Application.EnableVisualStyles(); Application.Run(formObj); } } //テスト用Form拡張クラス public class NewForm :Form{ public Label labelObj; public NewForm(){ this.Width = 600; this.Height = 600; this.Text ="wheel test"; } public void SetLabel(){ this.labelObj =new Label(); this.labelObj.Width=200; this.labelObj.Height =50; this.labelObj.Location = new Point(10,10); this.labelObj.Text ="ホイールのテスト"; this.labelObj.BackColor =Color.Red; this.Controls.Add(this.labelObj); //delegate this.labelObj.MouseEnter += new EventHandler(this.EnterMethod); this.labelObj.MouseWheel += new MouseEventHandler(this.WheelMethod); } //コントロールに追加したラベルにフォーカスした時のメソッド public void EnterMethod(Object sender,EventArgs e){ this.labelObj.Focus(); } public void WheelMethod(Object sender,MouseEventArgs e){ MessageBox.Show(e.Delta.ToString()); } } 上記のコードだと、どうしても横幅200縦50のラベルコントロールの外側でもそのWheelイベントが 発生してしまうようです。 これを回避するために無理やり以下のようにソースを改変しました。 public void WheelMethod(Object sender,MouseEventArgs e){ //ディスプレイ基準ではなく、Formオブジェクト基準の座標の取得 Point tempObj = this.labelObj.PointToClient(Cursor.Position); int tempX = tempObj.X; int tempY =tempObj.Y; if ( (tempX > 0) && (tempX < this.labelObj.Width) && (tempY > 0) && (tempY < this.labelObj.Height) ){ MessageBox.Show(tempObj.X.ToString()); MessageBox.Show(tempObj.Y.ToString()); MessageBox.Show(e.Delta.ToString()); } } マウスカーソルの位置が、特定のラベルの範囲内でのみ動くようにしたのですが これのやりかたがベターというかC#上では定石なのでしょうか? そもそも、なぜラベルコントロールに対してMouseWheelイベントをつけているのに ラベルのある座標以外で、Wheelイベントが発生してしまうのでしょうか? よろしくご教授ください。 ちなみにC#の質問ってこのASPの項目でもいいんですかね? C,C++とは色が違うし、 そのほかのプログラミングのほうがよいのでしょうか?

専門家に質問してみよう