Anuya
Anuya

Reputation: 8350

How to change the text of Label from another Form?

It is a cross threaded operation in windows application done in c#, How can i change it ?

Upvotes: 1

Views: 7342

Answers (4)

cdmdotnet
cdmdotnet

Reputation: 1753

If you're dealing with threads you need to use the form.Invoke() method, assuming you're passing the form instance into the other form.roughly

Form form1 = new Form()
Form form2 = new Form();
form2.CallingForm = form1; // make this property or what ever

inside form2 add some code like

form1.Invoke(someDelagate, value);

I don't do winforms that often but if you google form.Invoke you'll get some good examples of how to do cross thread operations.

Upvotes: 0

Dr Snooze
Dr Snooze

Reputation: 190

How about writing a more general method to change the Text property of any control in your form like:

private void SetText(Control control, string text)
{
    if (control.InvokeRequired)
         this.Invoke(new Action<Control>((c) => c.Text = text),control);
    else
        control.Text = newText; 
}

This will work for labels, buttons, etc, from either the UI thread or any other thread.

Upvotes: 1

Timwi
Timwi

Reputation: 66604

You can write a method which you can call from any thread:

private void SetLabel(string newText)
{
    Invoke(new Action(() => SomeLabel.Text = NewText));
}

Then you can just call SetLabel("Update the label, please") from any thread.

However, your question title states “from another Form” rather than “from another thread”, so it is unclear what you actually mean. You don’t need multithreading if you just want to have multiple forms. You should use threads only for tasks, e.g. downloading a file, copying a file, calculating a value, etc., but not for Forms.

Upvotes: 4

Basic
Basic

Reputation: 26766

You need to use a delegate and invoke...

private delegate void SetLabelSub(string NewText);
private void SetLabel(string NewText)
{
 if (this.InvokeRequired()) {
  SetLabelSub Del = new SetLabelSub(SetLabel);
  this.Invoke(Del, new object[] { NewText });
 } else {
  SomeLabel.Text = NewText;
 }
}

Then you can just call SetLabel("New Text Here") from any thread

Upvotes: 2

Related Questions