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

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

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

Re[3]: panel1にユーザーコントロールを共有する方法


(過去ログ 176 を表示中)

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

■101382 / inTopicNo.1)  panel1にユーザーコントロールを共有する方法
  
□投稿者/ エビ (9回)-(2023/02/14(Tue) 21:28:35)

分類:[C#] 

こんばんは。

【質問】
From1にPanel1の中にユーザーコントロールを追加(Form1_Lordで)し、共有したいのですが、VB.NETは分かりますが、C♯の場合はどのようにコード書けばいいでしょうか?

VB.NETの場合

Public Class Form1
    Dim a As New Test

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
mainpanel.Controls.Add(a)
            a.Dock = DockStyle.Fill
End Sub

Button1
 np.BringToFront()
end sub

でユーザーコントロールをmainpanelに表示されます。

ユーザーコントロール
Button1
Form1.textbox1.text="0"
end sub

これでいいのですが

C#の場合ですと

ユーザーコントロール
Button1
From1.Textbox1.text="0";

と書くとVBと違ってForm1の部分がエラーtextbox1に定義がないということです。

デザインから追加ではなくForm1_Loadに

C#

//ユーザーコントロールの設定
        private APP1.UserContlorll.Test a = new APP1.UserContlorll.Test();

Button1
a.BringToFront();

private void Form1_Load(object sender, EventArgs e)
this.mainpanel.Controls.Add(a);
            a.Dock = DockStyle.Fill;

と書きました。

【やりたい事】
ユーザーコントロールからForm1を共有?させたいです。
Form1.Textbox1.text="";のようにする方法を教えてください。よろしくお願いいたします。

Windows NetFrameworck4.8 C#です。

引用返信 編集キー/
■101383 / inTopicNo.2)  Re[1]: panel1にユーザーコントロールを共有する方法
□投稿者/ shu (1290回)-(2023/02/15(Wed) 07:24:34)
2023/02/15(Wed) 07:29:48 編集(投稿者)

No101382 (エビ さん) に返信

> C#の場合ですと
>
> ユーザーコントロール
> Button1
> From1.Textbox1.text="0";
>
> と書くとVBと違ってForm1の部分がエラーtextbox1に定義がないということです。
>
C#ですと大文字・小文字の違いは別のものとして扱われるので、実際の定義とあっていないのでは
ないでしょうか?


引用返信 編集キー/
■101385 / inTopicNo.3)  Re[1]: panel1にユーザーコントロールを共有する方法
□投稿者/ KOZ (390回)-(2023/02/15(Wed) 08:30:46)
2023/02/15(Wed) 08:48:21 編集(投稿者)
No101382 (エビ さん) に返信
> Button1
>  np.BringToFront()
> end sub
> 
> ユーザーコントロール
> Button1
> Form1.textbox1.text="0"
> end sub

なんだか意味不明です。

既定のインスタンスを使ってるんですね。
簡単にやるなら Program.cs を次のように書き換えます。

static class Program
{
    public static Form1 Form1 { get; set; }

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 = new Form1();
        Application.Run(Form1);
    }
}

ユーザーコントロールからは、

    Program.Form1.textBox1.Text = "0";

のように使います。
# textBox1 の Modifiers プロパティを public または internal にしてください。

ですが、これでは部品として切り出すことが難しいものになってしまいます。

ユーザーコントロールに対象となる TextBox のプロパティを作成し、
そのプロパティ経由で使うのが良いと思います。

public partial class UserControl1 : UserControl
{
    public UserControl1() {
        InitializeComponent();
    }

    public TextBox Target { get; set; }

    private void button1_Click(object sender, EventArgs e) {
        Target.Text = "0";
    }
}

public partial class Form1 : Form
{
    private UserControl1 a = new UserControl1();

    public Form1() {
        InitializeComponent();
        a.Target = textBox1;
    }
}


引用返信 編集キー/
■101386 / inTopicNo.4)  Re[1]: panel1にユーザーコントロールを共有する方法
□投稿者/ radian (109回)-(2023/02/15(Wed) 09:33:25)
2023/02/15(Wed) 09:59:43 編集(投稿者)

No101382 (エビ さん) に返信

推敲してから投稿しましょう。クラス名も変です。
From -> Form
Lord - >Load
UserContlorll - >UserControl

今回のケースだと、ユーザーコントロールをホストするフォームがtextbox1を持たないといけないという依存関係が発生してしまい、
これはコントロールとしての独立性を損なうので設計として良くないです。
具体的には、このようなコントロールが多い場合、
親の仕様が変わった場合に子にまで修正範囲が拡大してしまい、影響が大きくなります。
(textbox1の名前が変わる、textbox1が無くなる、別の変数に割り当てたくなった等々…)
子は親の中身を知らなくてもいい設計にした方が、取り回しが良くなります。

textbox1にさえアクセスできれば良いのであれば、
KOZさんのサンプルソースのように、プロパティ等でtextbox1のインスタンスだけ渡せばよいでしょう。

VB.NETだとエラーにならないけど、C#だとエラーになる原因は、
VB.NETでは勝手にフォームのインスタンスを作成しているからです。
C#では、フォームのインスタンスは自分で管理する必要があります。

【[VB.NET] 暗黙のFormオブジェクト〜My.Forms】
https://qiita.com/radian-jp/items/ef3aa3e008a6dcc13e49
引用返信 編集キー/
■101387 / inTopicNo.5)  Re[2]: panel1にユーザーコントロールを共有する方法
□投稿者/ エビ (10回)-(2023/02/15(Wed) 18:58:28)
shuさん

>C#ですと大文字・小文字の違いは別のものとして扱われるので、実際の定義とあっていないのでは
>ないでしょうか?

確認して置きます。

KOZさん

>static class Program
>{
> public static Form1 Form1 { get; set; }

この方法で試してみます。ちなみに新しいクラスでも出来ました。

ただ・・・try省略
catch (Exception ex)のexが【警告 CS0168 変数 'ex' は宣言されていますが、使用されていません】
この場合ってex削除すれば警告出ませんが・・・何が原因なのか分かりません。

radianさん
>VB.NETだとエラーにならないけど、C#だとエラーになる原因は、
>VB.NETでは勝手にフォームのインスタンスを作成しているからです。
>C#では、フォームのインスタンスは自分で管理する必要があります。

理解しました。

shuさん
KOZさん
radianさん
回答ありがとうございました。






解決済み
引用返信 編集キー/
■101391 / inTopicNo.6)  Re[3]: panel1にユーザーコントロールを共有する方法
□投稿者/ 魔界の仮面弁士 (3565回)-(2023/02/16(Thu) 10:25:46)
No101387 (エビ さん) に返信
> catch (Exception ex)のexが【警告 CS0168 変数 'ex' は宣言されていますが、使用されていません】
> この場合ってex削除すれば警告出ませんが・・・何が原因なのか分かりません。

おそらくそれは、捉えた例外の内容を確認することなく、
エラー内容を無視している(例外を単に握りつぶしている)のでしょう。


C# による CS0168 警告の原因は「未使用変数」の存在です。
これは Visual Basic でいうところの BC42024 警告にあたります。

例外時以外にも、たとえば下記のようなコードを書いた場合に発生します。
使われていないローカル変数は、宣言しても無意味だということです。

static void Main()
{
  int a = 10;
  int b = 1; // 警告 CS0219: 変数 'b' は割り当てられていますが、その値は使用されていません
  int c;   // 警告 CS0168: 変数 'c' は宣言されていますが、使用されていません
  Console.WriteLine(a);

  #pragma warning disable 168
  int d;   // (ここは警告されない)
  #pragma warning restore 168
  int e;   // 警告 CS0168: 変数 'e' は宣言されていますが、使用されていません
}


> catch (Exception ex)のexが
catch 句の中でその ex 変数を使用していれば警告されません。
 Debug.Write(ex.ToString());
 MessageBox.Show(ex.Message);


あるいは、例外処理時に ex の中身を見ることが無いのなら、
そもそも例外変数を宣言しないという選択肢もありますが、
例外の内容を握りつぶしてしまう事の是非は要検討ですね。


 ' Visual Basic の場合
 Try
 Catch
 End Try


 // C# の場合
 try
 {
 }
 catch
 {
 }


 // C# の場合
 try
 {
 }
 catch (Exception)
 {
 }
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -