C #: Как я могу изменить текст метки, которая в form1 из другого класса? - PullRequest
4 голосов
/ 12 апреля 2009

я пытаюсь изменить текст метки из класса, но безуспешно.

Я обновляю переменную в классе, используя get {} и set {}. я понимаю, что мне нужно поместить или сделать что-то в set {}, чтобы заставить его отправлять значение обновления из класса обратно в класс form1, чтобы он мог обновить метку.

Может кто-нибудь сказать мне, как я мог сделать это? или если есть способ обновить метку из класса, это было бы еще лучше.

Надеюсь, это имеет смысл, и спасибо заранее.

Ответы [ 5 ]

3 голосов
/ 12 апреля 2009

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

Пример

class SomeClass
{
    public delegate void UpdateLabel(string value);

    public event UpdateLabel OnLabelUpdate;

    public void Process()
    {
        if (OnLabelUpdate != null)
        {
            OnLabelUpdate("hello");
        }
    }
}

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

    private void UpdateLabelButton_Click(object sender, EventArgs e)
    {
        SomeClass updater = new SomeClass();
        updater.OnLabelUpdate += new SomeClass.UpdateLabel(updater_OnLabelUpdate);
        updater.Process();
    }

    void updater_OnLabelUpdate(string value)
    {
        this.LabelToUpdateLabel.Text = value;
    }
}
1 голос
/ 12 апреля 2009

Поскольку вы не опубликовали свой код, я не могу сказать, почему он не работает. Но то, что вы хотите, легко сделать.

public class FormA : Form
{
  // ...

  public string Label1Value
  {
    get { return this.label1.Text; }
    set { this.label1.Text = value; }
  }
  // ...
}

И вы можете легко использовать его в любой другой форме или коде (кроме случаев, когда он в другом потоке.)

public class FormB : Form
{
  private void Button1_Click(object sender, MouseEventArgs e)
  {
    formA.Label1Value = "FormB was clicked";
  }
}
<Ч />

Обновление

Если вы хотите использовать события, предложенные Давиде, вы можете сделать что-то вроде этого.

public class EULAEventArgs : EventArgs
{
  public string Signature { get; set; }
}

public class FormB : Form
{
  public event EventHandler<EULAEventArgs> EULAAccepted;
  protected virtual void OnEULAAccepted(EULAEventArgs e)
  {
    if (EULAAccepted != null)
      EULAAccepted(this, e);
  }

  public void Button1_Clicked(...)
  {
    OnEULAAccepted(new EULAEventArgs { Signature = "..." });
  }
}

public class FormA : Form
{
  public FormA()
  {
    // ...
    formB.EULAAccepted += EULAAccepted;
  }

  private void EULAAccepted(object sender, EULAEventArgs e)
  {
    this.label1.Text = String.Format("Thank you {0} for accepting the EULA.",
                                              e.Signature);
  }
}
1 голос
/ 12 апреля 2009

Если я понимаю ваш вопрос, у вас есть класс формы "form1". Экземпляр этого класса отображается. На этой форме есть ярлык. Вы запускаете метод в другом классе. Вы хотите, чтобы этот метод обновлял метку, которая находится на форме 1.

Если это правильно, то это подобно любой другой ситуации, когда метод должен изменить свойство другого экземпляра класса. Ваш метод в другом классе нуждается в ссылке на экземпляр формы. Когда вы вызываете свой метод, вместо этого:

OtherClass oc = new OtherClass();
oc.OtherMethod();

сделать это:

OtherClass oc = new OtherClass();
oc.OtherMethod(this);

Изменить определение другого метода:

public void Othermethod(form1 theForm) {
    theForm.TheLabel.Text = "New Text!";
}

Тогда все должно быть счастливым!

0 голосов
/ 12 апреля 2009

Является ли набор {}, который обновляет переменную, а затем форма работает в том же потоке, что и форма? Если это так, то вы можете делать то, что говорил Джон Сондерс, но если вам нужно обновить свойство Text метки на форме из другого потока, вам нужно будет вызвать что-то подобное из метода set:

theForm.TheLabel.Invoke(theForm.DelegateThatUpdatesLabel("New Text!"));
0 голосов
/ 12 апреля 2009

Я не уверен, что понял ваш вопрос, но постараюсь дать ответ. Вы можете предоставить открытое свойство вашему классу Form, которое обернет ваше свойство Label.Text. Затем вы можете использовать это свойство из любого другого места в коде, включая другие классы.

Это ответило на ваш вопрос? Если нет, то это, вероятно, потому, что я не понял вашего вопроса, пожалуйста, отредактируйте и уточните.

...