none
C#でLabelのTextの変更ができない。 RRS feed

  • 質問

  • Labelを1つ作成して、その内容を書き換えたいのですがうまくいきません。

    別の物を作っているのですが、内容を簡略化しました。

    using System;
    using System.Windows.Forms;

    namespace WindowsFormsApplication_test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Shown(object sender, EventArgs e)
            {
                callt();
            }

            public void callt()
            {
                this.label1.Text = "1111";
            }
        }

    上記の場合は、1111に書き換わります。

    using System;
    using System.Windows.Forms;

    namespace WindowsFormsApplication_test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Shown(object sender, EventArgs e)
            {
                test t = new test();
            }

            public void callt()
            {
                this.label1.Text = "1111";
            }
        }

        class test:Form1
        {
            public test()
            {
                callt();
            }
        }
    }

    ですが、

    いったん別のクラスに飛んでからLabelの内容を書き換えようとすると

    変わりません。

    LabelのModifiersはPublicに変更してあります。

    環境はVS2013を使用しています。

    最初は、別のクラスから直接Labelの値を書き換えようとしたのですが、

    出来なかった為このように変更してもダメでした。

    どこか設定不足でしょうか?よろしくお願いします。

    2015年7月25日 14:59

回答

  • 設定ではなく、あなたがそのように実装していないことが原因です。
    クラスとインスタンスの概念について勉強していただいた方が良いでしょう。

    test t = new test(); で作った t と Form1 から見える this は異なるインスタンスです。
    異なるインスタンスの間では原則的にコントロールや変数は共有されず、別々のものとして扱われ、影響しません。
    どうしても、すでに存在しているインスタンスに対して操作がしたいのであれば、そのインスタンスを test クラスに引き渡す必要があります。

    一例として。

    public partial class Form1 : Form
    {
    	// 略
    	private void Form1_Shown(object sender, EventArgs e)
    	{
    		test t = new test(this);
    	}
    	// 略
    }
    
    class test
    {
    	public test(Form1 target)
    	{
    		target.callt();
    	}
    }
    • 回答としてマーク pvmm 2015年7月25日 16:30
    2015年7月25日 15:25
    モデレータ

すべての返信

  • 設定ではなく、あなたがそのように実装していないことが原因です。
    クラスとインスタンスの概念について勉強していただいた方が良いでしょう。

    test t = new test(); で作った t と Form1 から見える this は異なるインスタンスです。
    異なるインスタンスの間では原則的にコントロールや変数は共有されず、別々のものとして扱われ、影響しません。
    どうしても、すでに存在しているインスタンスに対して操作がしたいのであれば、そのインスタンスを test クラスに引き渡す必要があります。

    一例として。

    public partial class Form1 : Form
    {
    	// 略
    	private void Form1_Shown(object sender, EventArgs e)
    	{
    		test t = new test(this);
    	}
    	// 略
    }
    
    class test
    {
    	public test(Form1 target)
    	{
    		target.callt();
    	}
    }
    • 回答としてマーク pvmm 2015年7月25日 16:30
    2015年7月25日 15:25
    モデレータ
  • 回答ありがとうございました。

    解決しました。

    最近C#を始めたのですが、大変勉強になりました。

    2015年7月25日 16:57