Отправка строки из класса в Form1 - PullRequest
0 голосов
/ 25 марта 2010

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

Я пытался читать об экземплярах, и это на самом деле одна из немногих вещей, которые имеют для меня смысл :), но если бы я создавал свою форму, разве у меня не было бы двух объектов формы?

Для упрощения, скажем, у меня есть некоторые данные в Class1, и я хотел бы передать строку в метку в Form1. Законно ли создавать инстанцию ​​другой формы? При попытке сделать это, похоже, я могу получить доступ к label1.Text, но метка не обновляется. Единственное, о чем я могу думать, это то, что форму нужно перерисовать, или есть какая-то проблема с потоками, о которой я не знаю.

Любая информация, которую вы можете предоставить, будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Добавлен код, чтобы помочь

class Class1
{
    public int number { get; set; }

    public void Counter()
    {
        for (int i = 0; i < 10; i++)
        {
            number = i;
            System.Threading.Thread.Sleep(5000);
        }
    }
}

и форма:

    Class1 myClass = new Class1();

    public Form1()
    {
        InitializeComponent();
        label1.Text = myClass.number.ToString();
    }

Ответы [ 4 ]

3 голосов
/ 25 марта 2010

NO

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

ОЧЕНЬ редко класс данных должен создавать форму отображения для отображения того, что он может предложить.

Если класс является слоем доступа к данным singleton , форма должна ссылаться на этот класс, а не наоборот.

1 голос
/ 26 марта 2010

Основываясь на комментариях в исходном сообщении, вот несколько способов сделать это: (этот код основан на приложении Winform в VS2010, есть 1 форма с меткой «ValueLabel», текстовое поле «NewValueTextBox» и кнопка.

Кроме того, существует класс «MyClass», который представляет класс с изменениями, которые вы хотите опубликовать.

Вот код для класса. Обратите внимание, что я реализую INotifyPropertyChanged, и у меня есть событие. Вам не нужно реализовывать INotifyPropertyChanged, и у меня есть событие, которое вызывается при изменении свойства.

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


    public class MyClass: System.ComponentModel.INotifyPropertyChanged
    {
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        public string AValue
        {
            get
            {
                return this._AValue;
            }
            set
            {
                if (value != this._AValue)
                {
                    this._AValue = value;
                    this.OnPropertyChanged("AValue");
                }
            }
        }
        private string _AValue;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if(this.PropertyChanged != null)
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }

Пример 1: простая привязка данных между меткой и значением: Поэтому на этот раз мы просто свяжем ярлык с экземпляром вашего класса. У нас есть текстовое поле и кнопка, которую вы можете использовать для изменения значения свойства в MyClass. Когда это изменится, привязка данных приведет к автоматическому обновлению метки:

ПРИМЕЧАНИЕ. Обязательно подключите Form1_Load в качестве события загрузки для формы и UpdateValueButton_Click в качестве обработчика нажатия кнопки, иначе ничего не будет работать!


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


        private MyClass TheClass;

        private void Form1_Load(object sender, EventArgs e)
        {
            this.TheClass = new MyClass();
            this.ValueLabel.DataBindings.Add("Text", this.TheClass, "AValue");
        }

        private void UpdateValueButton_Click(object sender, EventArgs e)
        {
            // simulate a modification to the value of the class
            this.TheClass.AValue = this.NewValueTextBox.Text;
        }
    }

Пример 2 Теперь давайте свяжем значение класса непосредственно с текстовым полем. Мы закомментировали код в обработчике нажатия кнопки, и мы связали и текстовое поле, и метку со значением объекта. Теперь, если вы просто отойдете от текстового поля, вы увидите ваши изменения ...


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


        private MyClass TheClass;

        private void Form1_Load(object sender, EventArgs e)
        {
            this.TheClass = new MyClass();
            // bind the Text property on the label to the AValue property on the object instance.
            this.ValueLabel.DataBindings.Add("Text", this.TheClass, "AValue");
            // bind the textbox to the same value...
            this.NewValueTextBox.DataBindings.Add("Text", this.TheClass, "AValue");
        }

        private void UpdateValueButton_Click(object sender, EventArgs e)
        {
            //// simulate a modification to the value of the class
            //this.TheClass.AValue = this.NewValueTextBox.Text;
        }


Пример 3 В этом примере мы вообще не будем использовать привязку данных. Вместо этого мы подключим событие изменения свойства к MyClass и обновим вручную.

Обратите внимание, что в реальной жизни у вас может быть более конкретное событие, чем с измененным свойством - у вас может быть изменение AValue, которое возникает только при изменении этого свойства.


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


        private MyClass TheClass;

        private void Form1_Load(object sender, EventArgs e)
        {
            this.TheClass = new MyClass();
            this.TheClass.PropertyChanged += this.TheClass_PropertyChanged;
        }

        void TheClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "AValue")
                this.ValueLabel.Text = this.TheClass.AValue;
        }

        private void UpdateValueButton_Click(object sender, EventArgs e)
        {
            // simulate a modification to the value of the class
            this.TheClass.AValue = this.NewValueTextBox.Text;
        }
    }

1 голос
/ 25 марта 2010

Нет причин, по которым вы не можете иметь несколько экземпляров формы, но в этом случае вы хотите передать экземпляр Class1 в имеющуюся форму. Самый простой способ - добавить свойство в Form1 и обновить текст метки:

public class Form1 : Form
{
    public Class1 Data
    {
        set
        {
            this.label.Text = value.LabelText;
        }
    }
}
0 голосов
/ 26 марта 2010

События и делегаты - это то, что вы хотите использовать здесь. Поскольку вы отметили это как новичка, я оставлю реализацию в качестве упражнения :), но вот общая идея:

  1. Объявите пару событие / делегат в вашем классе данных.
  2. Создайте метод в своей форме для привязки к событию.
  3. Когда в вашем классе данных происходит «что-то», запускается событие
  4. Метод формы будет вызываться для обработки события и может соответствующим образом обновлять виджеты

Удачи.

...