2016-11-28 5 views
1

ラベルを含むカスタムのusercontrolを作成しました。 firstName、lastName、fullNameの3つの文字列プロパティがあります。usercontrolの2つの文字列プロパティ(firstName + lastName)を結合し、ラベルに割り当てます

ラベルのテキストをFullNameに設定するにはどうすればよいですか?

public string firstName 
    { 
     get; set; 
    } 

    public string lastName 
    { 
     get; set; 
    } 

    public string fullName //this fails 
    { 

     get { return string.Format("{0} {1}", firstName, lastName); } 
     set { labelFullName.Text = value; } 
    } 
+1

WPFまたはWinForms?どのラベル?私はいくつかのコードを見ていますが、どのクラスに入っているのかは言わないでください。どのようなクラスですか?あなたは 'fullName'でセッターで何を達成しようとしていますか? –

+0

'fullName'を読み込み専用にして、' firstName'と 'lastName'の変更時に' labelFullName'を更新したいようです。 – juharr

+0

「これは失敗します」:それはどういう意味ですか?それは "失敗"するか、ゲッターですか?それはクラッシュしますか?期待される行動は何ですか?観察された行動は何ですか? –

答えて

5

Windowsフォームのように見えます。 WPFでは、labelFullName.Contentプロパティを使用します。姓または姓が変更されるたびにラベルをフルネームとして設定すると仮定すると、UserControlクラス内でこれを行うオプションがあります:

private String _sFirstName = ""; 
private String _sLastName = ""; 

public String FirstName { 
    get { return _sFirstName; } 
    set { _sFirstName = value; UpdateLabel(); } 
} 
public String LastName { 
    get { return _sLastName; } 
    set { _sLastName = value; UpdateLabel(); } 
} 
public String FullName { 
    get { return _sFirstName + " " + _sLastName; } 
} 
private void UpdateLabel() { 
    // do within a UI thread to prevent threading issues 
    this.BeginInvoke((Action)(() => { 
    labelFullName.Text = this.FullName.Trim(); 
    })); 
} 
+0

@ Johnの答えに追加するだけで、元のコードが機能しない理由は、FullNameプロパティのsetterが呼び出され、決してそうでないと推測しているときだけラベルの値を更新することです。ラベルを更新したい場合は、いずれかのプロパティが変更されたときに、ラベルが更新される必要があります。 – JuanR

+0

@Johnこのコードを試しましたが、「ウィンドウのハンドルが作成されていないうちにBeginInvokeを使用できません」という例外が表示されます。 – Niiw

+0

これはうまくいきました。私はUpdateLabel()をpublicに設定し、フォームにusercontrolを追加して、ありがとう:)例: this.Controls.Add(myUserControl); myUserControl.UpdateLabel(); – Niiw

関連する問題