2013-06-02 2 views
1

Скажет, у меня есть этот код для формы окон:Удаления этикетки из формы Windows, когда он больше не нужен

public Form1() 
{ 
    this.Shown += new EventHandler(Form1_Shown); 
    InitializeComponent(); 
} 

// - This Form1_Shown class is what's done AFTER the form is shown! Put stuff here! 
private void Form1_Shown(object sender, System.EventArgs e) 
{ 
    methods.WriteTextToScreen("HelloLabel", "Hello!", 15, 15); 
    methods.sleepFor(1); 
    methods.EraseScreenLabel(Form1.HelloLabel); 
    methods.WriteTextToScreen("GoodbyeLabel", "Goodbye!", 80, 80); 
    methods.sleepFor(3); 
    methods.EraseScreenLabel(Form.GoodbyeLabel); 
} 

public class methods 
{ 

    public static int timeSlept; 

    public static Label[] UsedTextBoxes = new Label[10000000000000000000]; 

    public static void WriteTextToScreen(string name, string text, int locX, int locY) 
    { 
     int numberOfPrintedItems = methods.UsedTextBoxes.GetLength(1); 
     Label tempLabel = new Label(); 
     UsedTextBoxes[numberOfPrintedItems + 1] = tempLabel; 

     tempLabel.Text = text; 
     tempLabel.Name = name; 
     tempLabel.Location = new Point(locX, locY); 
     tempLabel.Visible = true; 
     tempLabel.Enabled = true; 
    } 

    public static void EraseScreenLabel(Label label) 
    { 
     System.Windows.Forms.FlowLayoutPanel obj = new System.Windows.Forms.FlowLayoutPanel(); 
     obj.Controls.Remove(label); 
     label = null; 
    } 

    public static void sleepFor(int seconds) 
    { 
     timeSlept = 0; 

     System.Timers.Timer newTimer = new System.Timers.Timer(); 
     newTimer.Interval = 1000; 
     newTimer.AutoReset = true; 

     newTimer.Elapsed += new System.Timers.ElapsedEventHandler(newTimer_Elapsed); 

     newTimer.Start(); 

     while (timeSlept < seconds) 
     { 
      Application.DoEvents(); 
     } 

     newTimer.Dispose(); 

    } 

    public static void newTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     timeSlept = IncreaseTimerValues(ref timeSlept); 
     Application.DoEvents(); 
    } 

    public static int IncreaseTimerValues(ref int x) 
    { 
     int returnThis = x + 1; 
     return returnThis; 
    } 

Я хочу метод EraseScreenLabel(Label label); удалить этот ярлык с экрана, например, GoodbyeLabel созданных метод writeTextToScreen();, так как я не хочу, чтобы он был видимым больше. Как я могу заставить этот метод делать то, что я хочу? Я уже пытался использовать Dispose(); и Finalize();, а также label = null;. Может ли кто-нибудь помочь?

+0

Вы совершаете несколько грехов в этом коде. Ядро для написания кода пользовательского интерфейса - это ** никогда не спящий. Это просто не работает, пользовательский интерфейс * заморожен * во время сна и не может перерисовать себя. Создание массива с 10000000000000000000 элементов также не может работать. Лучше всего работать с примерами или упражнениями в книге о программировании .NET, чтобы узнать правильный способ написания кода на C#. –

+0

@HansPassant: Это намного хуже. Он использует 'DoEvents()' и ненужный фоновый поток для эмуляции 'await Task.Delay'. – SLaks

ответ

1
new System.Windows.Forms.FlowLayoutPanel(); 

Вы только что создали новую пустую панель.
Изменение, которое не повлияет на существующую панель в вашей форме.

Вам необходимо изменить существующую панель на форме.

В частности, вы должны избавиться от своего класса methods и сделать эти методы экземпляра в классе формы.

Вы также должны заменить sleepFor() на await Task.Delay().

+0

Я удалил все мои методы из класса методов и создал статический FlowLayoutPanel(); непосредственно под публичным int timeSlept; Все мои ярлыки теперь идут в один центральный объект FlowLayoutPanel obj, однако obj.Controls.Remove («GoodbyeLabel»); все еще не удаляет эту метку. Я пропустил часть вашего предложения или что? – ApachePilotMPE

+0

@ApachePilotMPE: Это не скомпилируется. – SLaks