2017-07-12 11 views
-1

メソッド内にラベルが作成されています。次に、値を長さ5から20文字に変更するグローバル文字列があります。 strSuccessはグローバルに宣言されます。メソッドに残した後にローカルコントロールを破棄する方法は?

private void button1_Click(object sender, EventArgs e) 
{ 
    //First Trial, didn't works 
    Label lbl = new Label(); 
    Controls.Add(lbl); 
    lbl.Location = new Point(locationX, locationY); 
    lbl.Text = strSuccess; 
    lbl.BringToFront(); 

    //Second Trial 
    //I tried using but still didnt works 
    Label lbl; 
    using (lbl = new Label()) 
    { 
     Controls.Add(lbl); 
     lbl.Location = new Point(locationX, locationY); 
     lbl.Text = strSuccess; 
     lbl.BringToFront(); 
    } 
} 

問題は、ボタンをクリックするたびにstrSuccessの値が更新されるときです。例:C#からPython; strSuccess = C#hon。それは重なる。ユーザーがボタンをクリックするたびに、新しいラベルが作成されます。どのようにしてローカルに作成されたラベルを適切に固定または廃棄するか。グローバルラベルとコンテナの作成はオプションではありません。

+0

毎回新しいラベルを作成するのはなぜですか?すでに存在するラベル(または一度作成されたラベル)のテキストを更新することはできませんか? – user3185569

+1

'//最初の試練、didnt works' - 定義**は動作しませんでした**。 – mjwills

+0

@ user3185569私は毎回そのメソッドでそのラベルを使用するため作成しました。以前のローカルラベルがメソッド内に正しく配置されていないため、テキストを更新できません。それはlbl.DisposeAfterLeavingMethod()のようにする必要があります。ボタンをクリックすると新しいラベルが作成されます。 – Vincent

答えて

2

グローバルラベルとコンテナの作成はオプションではありません。あなたはそのラベル用のフォームフィールドを作成し、すべての時間を作成し、コントロールを配置避けることができない理由を私は取得できませんでした

const string lblName = "MySpecialName"; 
var oldLabel = Controls.OfType<Label>().FirstOrDefault(l => l.Name == lblName); 

Label lbl = new Label(); 
Controls.Add(lbl); 
lbl.Name = lblName; 
lbl.Location = new Point(locationX, locationY); 
lbl.Text = strSuccess; 
lbl.BringToFront(); 

if (oldLabel != null) 
    oldLabel.Dispose(); 

を:

次に、あなたの古いコントロールを照会し、それを処分することができます。私はあなたがそれをすることを強く勧めます。

+0

常に処分する必要がある場合は、新しいラベルの宣言の上に配置します。 – Alex

+0

@Alexそれはtry..finallyです..私は推測します。 – user3185569

+0

try..finallyそれを行うだろう。これは、グローバルラベルの制約がないため、問題を解決する最もクリーンな方法です。 – Alex

2

グローバルラベルを作成することはできませんが、このアプローチははるかに単純です。非常に特殊な状況がない限り、複数のラベルを生成して自分で削除を処理するよりもはるかに理にかなっています。

Label lbl; 

    private void UpdateLabel(String text) { 

     if (lbl == null) { 
      lbl = new Label(); 
      lbl.Location = new Point(locationX, locationY); 
      Controls.Add(lbl); 
     } 

     lbl.Text = text; 
    } 

    private void button1_Click(object sender, EventArgs e) { 
    UpdateLabel(strSuccess); 
    } 

あなたが方法でそれを作成し、それがスコープ外になった場合、あなたはそれをルックアップする必要がある、あなたは一つの方法または百にラベルを使用するかどうかUpdateLabel(String.Empty);

を呼び出し、テキストをクリアするには。

これは可能ですが、それを更新するよりもかなり遅く、複雑さが増します。

関連する問題