C # ссылка на текстовое поле из другого класса - PullRequest
2 голосов
/ 08 августа 2011

новое в C #, так что будьте добры ...

Я пытаюсь отправить текст в текстовое поле формы, используя следующий код:

SettingsForm.cs

 namespace BluMote
 {
      public partial class SettingsForm : Form
      {
           public void send2Display(string whatWasSent)
           {
               this.rtbDisplay.Text = whatWasSent;
           }

           private void cmdOpen_Click(object sender, EventArgs e)
           {
               commToy.Parity = "None";
               commToy.StopBits = "One";
               commToy.DataBits = "8";
               commToy.BaudRate = "115000";
               commToy.PortName = "COM4";
               commToy.OpenPort();
           }
      .........
      }
 }

И я (пытаюсь) вызвать его из другого класса следующим образом:

namespace PCComm
{
    class CommunicationManager
    {
    #region OpenPort
    public bool OpenPort()
    {
        try
        {
            if (comPort.IsOpen == true) comPort.Close();
            comPort.BaudRate = int.Parse(_baudRate);
            comPort.DataBits = int.Parse(_dataBits);
            comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _stopBits);
            comPort.Parity = (Parity)Enum.Parse(typeof(Parity), _parity);
            comPort.PortName = _portName;
            comPort.Open();
            PCComm.frmMain form = new PCComm.frmMain();
            form.send2Display("test");
            return true;
        }
        catch (Exception ex)
        {
            DisplayData(MessageType.Error, ex.Message);
            return false;
        }
    }
    #endregion
}
}

И "test" не отображается в текстовом поле

Но, как вы видите, это не работает ... Чего мне не хватает?

Дэвид

Ответы [ 5 ]

4 голосов
/ 08 августа 2011

send2Display - это метод, вам нужно вызывать его с параметром, а не присваивать ему.

BluMote.SettingsForm form = new BluMote.SettingsForm();
form.send2Display("test");

EDIT:

Если вы вызываете метод из класса SettingsForm, вам не нужно создавать новый экземпляр. Попробуйте:

this.send2Display("test");

РЕДАКТИРОВАТЬ На основе обновленного вопроса:

Проблема в том, что форма, которую вы создаете в OpenPort (), не та, которая отображается на экране, поэтому любые обновления текстового поля не будут отображаться на экране. Вот несколько быстрых и грязных способов исправить это:

  • Передайте ссылку на текстовое поле в ваш метод. Я не рекомендую этот подход, потому что вы в конечном итоге получите зависимости вида в вашей модели.
  • Возвращает строку из OpenPort () и передает возвращаемое значение в sendToDisplay.
  • Определите свойство LastMessage типа string в CommunicationManager и назначьте его в OpenPort (). Затем прочитайте его в SettingsForm и передайте его значение sendToDisplay.
3 голосов
/ 08 августа 2011
BluMote.SettingsForm.send2display = "test";

Должно быть:

BluMote.SettingsForm form = new BluMote.SettingsForm();
form.Show();
form.send2Display("test");

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

namespace PCComm
{
    class CommunicationManager
    {
    #region OpenPort
    public bool OpenPort(BluMote.SettingsForm form)
    {
        try
        {
            if (comPort.IsOpen == true) comPort.Close();
            comPort.BaudRate = int.Parse(_baudRate);
            comPort.DataBits = int.Parse(_dataBits);
            comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _stopBits);
            comPort.Parity = (Parity)Enum.Parse(typeof(Parity), _parity);
            comPort.PortName = _portName;
            comPort.Open();
            //PCComm.frmMain form = new PCComm.frmMain();
            form.send2Display("test");
            return true;
        }
        catch (Exception ex)
        {
            DisplayData(MessageType.Error, ex.Message);
            return false;
        }
    }
    #endregion
}
}

Затем, где-нибудь в Form1 (например, событие загрузки), вы захотите создать экземпляр класса, зависящего от него.

CommunicationManager comm = new CommunicationManager();
comm.OpenPort(this);
3 голосов
/ 08 августа 2011

Для этого вам необходим экземпляр объекта формы, например:

BluMote.SettingsForm form = new BluMote.SettingsForm();
form.Show()
form.send2Display("test");
1 голос
/ 08 августа 2011

В вашем коде есть несколько проблем.

  1. Вызов метода как свойства.

    BluMote.SettingsForm.send2display = "test";// Это неправильно

  2. Попытка получить доступ к членам класса SettingsForm из другого класса, например, к доступу к статическим членам.

Сначала необходимо проанализировать экземпляр SettingsFormв «Другой класс».

//In Other Class

private SettingsForm settingsForm;

// Get the instance as a parameter in Constructor (this is one of options)
public OtherClass(SettingsForm instanceOfSettingsForm)
{
    settingsForm = instanceOfSettingsForm;
}

//Now you can call send2Display method from OtherClass

settingsForm.send2Display("Test");
0 голосов
/ 08 августа 2011

Вы можете изменить код ниже и посмотреть, работает ли он:

public void send2Display(string whatWasSent)
{
     this.rtbDisplay.Text = whatWasSent;
     this.rtbDisplay.refresh();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...