C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: コードでlabelを追加する方法


(過去ログ 173 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■99782 / inTopicNo.1)  コードでlabelを追加する方法
  
□投稿者/ あいす (5回)-(2022/06/02(Thu) 15:56:59)

分類:[C#] 

Visual Studio2017 C# Windows Form

通常labelやtextboxなどはツールボックスから選択して配置すると思うのですが、
それをコードで配置する方法を教えていただけないでしょうか。
引用返信 編集キー/
■99784 / inTopicNo.2)  Re[1]: コードでlabelを追加する方法
□投稿者/ 魔界の仮面弁士 (3382回)-(2022/06/02(Thu) 16:03:32)
No99782 (あいす さん) に返信
> 通常labelやtextboxなどはツールボックスから選択して配置すると思うのですが、
> それをコードで配置する方法を教えていただけないでしょうか。

Controls.Add メソッドですね。

デザイン時に Label 等を配置して、その際に自動生成される Form1.designer.cs ファイルを
開いてみると、その中の InitializeComponent というメソッドの中に
「コードで配置するための処理」が記されますので、それを真似れば良いかと。
引用返信 編集キー/
■99785 / inTopicNo.3)  Re[2]: コードでlabelを追加する方法
□投稿者/ あいす (7回)-(2022/06/02(Thu) 16:52:31)
No99784 (魔界の仮面弁士 さん) に返信
> ■No99782 (あいす さん) に返信
>>通常labelやtextboxなどはツールボックスから選択して配置すると思うのですが、
>>それをコードで配置する方法を教えていただけないでしょうか。
>
> Controls.Add メソッドですね。
>
> デザイン時に Label 等を配置して、その際に自動生成される Form1.designer.cs ファイルを
> 開いてみると、その中の InitializeComponent というメソッドの中に
> 「コードで配置するための処理」が記されますので、それを真似れば良いかと。

ありがとうございます。
InitializeComponent内を真似てみたのですが、現在のコンテキストに存在しませんとエラーが出てしまいます。
Public class内でやっているのが原因だとは思うのですが何がいけないのでしょうか。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace xxxx_Monitor_V2
{
public partial class FormBLEMulti : Form
{
public FormBLEMulti()
{
InitializeComponent();
}

private System.Windows.Forms.Label lblval;
public class DispPanel
{
FormBLEMulti.lblval = new System.Windows.Forms.Label();

FormBLEMulti.lblval.BackColor = System.Drawing.SystemColors.Control;
FormBLEMulti.lblval.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
FormBLEMulti.lblval.Font = new System.Drawing.Font("MS UI Gothic", 19.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
FormBLEMulti.lblval.Location = new System.Drawing.Point(46, 29);
FormBLEMulti.lblval.Name = "label1";
FormBLEMulti.lblval.Size = new System.Drawing.Size(115, 33);
FormBLEMulti.lblval.TabIndex = 0;
FormBLEMulti.lblval.Text = "----";
FormBLEMulti.lblval.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

}

}
}
引用返信 編集キー/
■99786 / inTopicNo.4)  Re[3]: コードでlabelを追加する方法
□投稿者/ 魔界の仮面弁士 (3383回)-(2022/06/02(Thu) 17:53:45)
No99785 (あいす さん) に返信
> > Controls.Add メソッドですね。
> ありがとうございます。

(1) 提示されたコードに、肝心の Controls.Add が書かれていないですよ…?


> public partial class FormBLEMulti : Form
> {
>  private System.Windows.Forms.Label lblval;

この lblVal は、「FormBLEMulti クラスが持つインスタンス変数」ですよね。
ここまでは良いとして…。

>  public class DispPanel
>  {
>   FormBLEMulti.lblval = new System.Windows.Forms.Label();

ここ、文法的にいろいろおかしいですが、
どういう意図で書かれていますか?


(2) 入れ子構造のクラス内クラスになっているのはわざとですか?
 「public class DispPanel」というクラス宣言ではなく
 「public void DispPanel()」などのメソッド宣言であるのなら
 まだ分からなくも無いですが…。

 もしも本当に内部クラスとしたいのであれば、そのクラスを呼び出すためのコードも必要です。


(3) FormBLEMulti の直下にある「private System.Windows.Forms.Label lblval;」のように、
 クラスの直下で「Label 変数;」や「Label 変数 = new Label();」といった
 『変数宣言』を行うことは問題ありません。

 しかしクラスの直下で「変数 = new Label();」のような代入処理を書くことはできないので
 構文エラーとなります。
 「FormBLEMulti.lblval = new System.Windows.Forms.Label();」のような処理を書きたいのであれば、
 クラスの直下ではなく、クラスの下にメソッドかコンストラクタを置き、その内に記述しましょう。


(4) 「FormBLEMulti.lblval = new Label();」と書かれていますが、
 lblVal は静的フィールド変数ではなく、インスタンス フィールド変数です。

 文法的な問題だけなら、static に変更すればコンパイルは出来ますが…
 それではプログラムの意図として不自然ですね。

 public partial class FormBLEMulti : Form
 {
  private static System.Windows.Forms.Label lblval; // 静的フィールドに変更
  public class DispPanel
  {
   public void Test1() // メソッドを追加
   {
    FormBLEMulti.lblval = new System.Windows.Forms.Label();
   }
  }
 }

 元のインスタンス フィールドのままにしたいのであれば、
 どのインスタンスの lblval を操作したいのかを明示せねばなりません。

 public partial class FormBLEMulti : Form
 {
  private System.Windows.Forms.Label lblval; // インスタンス フィールドのまま
  public class DispPanel
  {
   internal DispPanel(FormBLEMulti owner) // 引数でインスタンスを渡す
   {
    owner.lblval = new System.Windows.Forms.Label();
   }
  }
 }

引用返信 編集キー/
■99787 / inTopicNo.5)  Re[4]: コードでlabelを追加する方法
□投稿者/ 魔界の仮面弁士 (3384回)-(2022/06/02(Thu) 18:19:14)
No99786 (魔界の仮面弁士) に追記
>>> Controls.Add メソッドですね。
>>ありがとうございます。
> (1) 提示されたコードに、肝心の Controls.Add が書かれていないですよ…?


とりあえず、動的生成のサンプル。
FlowLayoutPanel と Button を一つずつ貼っておいてください。

button1 を押すごとに、flowLayoutPanel1 上に Label が追加されます。

private void button1_Click(object sender, EventArgs e)
{
  var label = new Label();
  label.AutoSize = false;
  label.Text = DateTime.Now.ToString("HH:mm:ss.ffff");
  label.BorderStyle = BorderStyle.FixedSingle;
  flowLayoutPanel1.Controls.Add(label);
}


上記のサンプルでは、
flowLayoutPanel1.Controls.Add(label); として、パネル上に配置していますが、
this.Controls.Add(label); に変更すれば、フォーム上に配置されるようになります。
button1.Controls.Add(label); にすれば、ボタンの上に配置されます。

なお、コントロールの初期座標は左上(0, 0) なので、配置前には
label.Location = new Point(10, 20); などを明示して
配置先の座標を明示する必要があります。
(FlowLayoutPanel の場合は、配置場所を自動的に調整してくれます)
引用返信 編集キー/
■99789 / inTopicNo.6)  Re[5]: コードでlabelを追加する方法
□投稿者/ ぼーちゃん (35回)-(2022/06/03(Fri) 08:37:15)
ご参考に・・・
https://dobon.net/vb/dotnet/control/addcontrol.html
引用返信 編集キー/
■99790 / inTopicNo.7)  Re[6]: コードでlabelを追加する方法
□投稿者/ あいす (8回)-(2022/06/03(Fri) 09:33:10)
No99786 (魔界の仮面弁士 さん) に返信
ご回答ありがとうございます。
基礎的な部分の理解ができていなくてすみません、、、。
まだすべての内容が把握しきれていないのでとりあえず以下の部分を回答させていただきます。

>  public class DispPanel
>  {
>   FormBLEMulti.lblval = new System.Windows.Forms.Label();
>
>ここ、文法的にいろいろおかしいですが、
>どういう意図で書かれていますか?

例えば別のフォームに1〜4をアイテムとして持っているコンボボックスがあり、
選択された数に応じて FormBLEMultiにラベルを作成するというプログラムを組みたく、
その方法としてラベルを作成するクラスを用意して、選択された分インスタンス化することによって実現できるのではと考えた次第です。
引用返信 編集キー/
■99791 / inTopicNo.8)  Re[7]: コードでlabelを追加する方法
□投稿者/ 魔界の仮面弁士 (3385回)-(2022/06/03(Fri) 10:02:39)
No99790 (あいす さん) に返信
>>> public class DispPanel
>>> {
>>>  FormBLEMulti.lblval = new System.Windows.Forms.Label();
>>ここ、文法的にいろいろおかしいですが、
>>どういう意図で書かれていますか?
> 例えば別のフォームに1〜4をアイテムとして持っているコンボボックスがあり、
> 選択された数に応じて FormBLEMultiにラベルを作成するというプログラムを組みたく、

ラベル数が 4 つぐらいなら、デザイン時に最初から貼っておいて
Label の Visible プロパティを true/false で切り替えた方が手っ取り早いのでは…?


> その方法としてラベルを作成するクラスを用意して、選択された分インスタンス化することによって実現できるのではと考えた次第です。
その「ラベルを作成するクラス」を new して、そのインスタンスを管理する役目は、どのクラスが担うのでしょうか?
Program クラス? DispPanel クラス? Form1 クラス? それとも……?


そもそも、今回の Label 作成処理は、いつどこから実行される想定でしょうか。

たとえば、DispPanel は既に表示された状態でラベル数が増減される仕様にしたいのか、
それとも、最初に Label 数を決定した状態で DispPanel フォームが表示されるべきなのか。

また、DispPanel の button1_Click にてラベルを生成する想定なのか、
別フォームの comboBox1_SelectedIndexChanged や button1_Click で生成されるのか、
もしくは、両フォームとはさらに別のクラスから、Label 生成処理を呼び出したいのか。

そうした違いによって、コードの書き方もかなり変わってくると思いますよ。



A案) 別のフォーム F が、F 自身の ComboBox からアイテム数(1〜4)を取り出し、F 上の button1 を押すと、
 DispPanel フォームのコンストラクタ引数にアイテム数を渡す形で、DispPanel フォームを表示したい。

B案) DispPanel フォームと、既に起動済みの別フォーム F の両方が表示済みの状態となっており、
 F 側の ComboBox を変更すると、それに応じて DispPanel の Label 数が即座に増減するようにしたい。

C案) DispPanel が、ラベル数決定用のダイアログフォームを ShowDialog で呼ぶようにして、
 そのダイアログが OK で閉じられたら、ダイアログで選択されたアイテム数に応じて、
 DispPanel にラベルを生成するようにしたい。

などなど。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -