Как вызывать TextBox из другого класса

198
15 декабря 2019, 12:40

Если создавать в классе Form метод, то вызов TextBox не создает проблем.

public void ProductlistItem()
    {
        foreach (var ProducListItem in parserHTML.ProductlistItems())
        {
            //Название фильма
            var namefilm = ProducListItem.Descendants("h2")
                .Where(node => node.GetAttributeValue("class", "")
                .Equals("th-title nowrap")).FirstOrDefault().InnerText.Trim();
            LogTex2.Text += namefilm + '\r' + '\n';
        }

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

Answer 1

Другой класс

public class MyDataProviderClass
{
    public List<string> GetData()
    {
        return new List<string>() {"One", "Two", "Three"};
    }
}

Как его вызвать на форме

public class MyForm : Form
{
    MyDataProviderClass _dataProvider;

    public MyForm()
    {
        _dataProvider = new MyDataProviderClass();
    }
    // ....
    public void ProductlistItem()
    {
        foreach (var film in _dataProvider.GetData())
        {
            LogTex2.Text += film + '\r' + '\n';
        }
    }
}
Answer 2

1-й способ через передачу ссылки на форму в конструктор этого другого класса.

Создаем интерфейс

interface IMainForm
{
    string Output { get; set; }
}

Объявляем, что форма будет его реализовывать

public partial class MainForm : Form, IMainForm

В форме создаем свойство у которого в качестве бэкинг филд служит нужный текстбокс

public string Output
{
    get => _textBoxOutput.Text;
    set => _textBoxOutput.Text = value;
}

Такой "другой" класс

class ProductData
{
    private readonly IMainForm _form;
    //ctor
    public ProductData(IMainForm form)
    {
        _form = form ?? throw new ArgumentNullException(nameof(form));
    }
    public void LoadProductItems()
    {
        for (int i = 1; i < 6; i++)
        {
            _form.Output += $"Продукт-{i}" + Environment.NewLine;
        }
    }
}

Форма целиком

public partial class MainForm : Form, IMainForm
{
    private ProductData _productData;
    public MainForm()
    {
        InitializeComponent();
        _buttonGetOutput.Click += ButtonGetOutput_Click;
        _productData = new ProductData(this);
    }
    public string Output
    {
        get => _textBoxOutput.Text;
        set => _textBoxOutput.Text = value;
    }
    private void ButtonGetOutput_Click(object sender, EventArgs e)
    {
        _productData.LoadProductItems();
    }
}

2-й способ через привязки.

В наш "другой" класс добавляем using System.ComponentModel; и реализуем интерфейс INotifyPropertyChanged следующим образом

class ProductData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    //ctor
    public ProductData()
    {
    }
    private string _OutputText;
    public string OutputText
    {
        get => _OutputText;
        set
        {
            _OutputText = value;
            //!!! Здесь вызываем событие, чтоб текстбокс обновился и показал новые данные
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OutputText)));
        }
    }
    public void LoadProductItems()
    {
        for (int i = 1; i < 6; i++)
        {
            //работаем с собственным свойством
            OutputText += $"Продукт-{i}" + Environment.NewLine;
        }
    }
}

Теперь форма

public partial class MainForm : Form
{
    private ProductData _productData;
    public MainForm()
    {
        InitializeComponent();
        _buttonGetOutput.Click += ButtonGetOutput_Click;
        _productData = new ProductData();
        SetBindings();
    }
    private void SetBindings()
    {
        //создаем экз. привязки
        Binding binding = new Binding("Text", _productData, nameof(ProductData.OutputText));
        //добавялем привязку к текстбоксу
        _textBoxOutput.DataBindings.Add(binding);
    }
    private void ButtonGetOutput_Click(object sender, EventArgs e)
    {
        _productData.LoadProductItems();
    }
}

На мой взгляд второй вариант предпочтительнее первого.

Answer 3

Собственно проблема решилась путем инициализации списка (List) с помощью конструктора.

Создаем класс с интересующими нас параметрами для списка.

    namespace ivi
{
    public class variables
    {
        public class ParInfo
        {
            public string NameFilm { get; set; }
            public string ImageURl { get; set; }
            public string Quality { get; set; } 
            public string Year { get; set; }
            public string Info { get; set; }
        }
    }
}

После в созданном отдельном классе. Создаем список, добавляя интересующие нас параметры инициализации.

using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace ivi
{
    public class NameFilm
    {
        ParserHTML parserHTML = new ParserHTML();
        //Создание списка (List)
        public List<variables.ParInfo> ProductlistItem()
        {
            var Films = new List<variables.ParInfo>();
            foreach (var ProducListItem in parserHTML.ProductlistItems())
            {
                //Название фильма
                var namefilm = ProducListItem.Descendants("h2")
                    .Where(node => node.GetAttributeValue("class", "")
                    .Equals("th-title nowrap")).FirstOrDefault().InnerText.Trim();
                //Год
                var year = ProducListItem.Descendants("div")
                    .Where(node => node.GetAttributeValue("class", "")
                    .Equals("short-info")).FirstOrDefault().InnerText.Trim();
                //Год
                var quality = ProducListItem.Descendants("div")
                    .Where(node => node.GetAttributeValue("class", "")
                    .Equals("th-meta th-qual")).FirstOrDefault().InnerText.Trim();
                //Описание
                var info = ProducListItem.Descendants("div")
                    .Where(node => node.GetAttributeValue("class", "")
                    .Equals("th-meta th-qual")).FirstOrDefault().InnerText.Trim();
                //Картинка
                var picturefilm =
                    Regex.Match(
                ProducListItem.Descendants("img").FirstOrDefault().GetAttributeValue("src", "//")
                , @"//.*jpg");
                var http = "http:";
                var img = http + picturefilm;
                Films.Add(new variables.ParInfo() { NameFilm = namefilm, Year = year, ImageURl = img, Quality=quality, Info = info});
            }
            return Films;
        }
    }
}

И уже из формы обращаемся к инициализированному списку.

using System.Windows.Forms;
namespace ivi
{
    public partial class Form1 : Form
    {
        ParserHTML parserHTML = new ParserHTML();
        NameFilm namefilm = new NameFilm();
        public Form1()
        {
            InitializeComponent();
            ParserHTML parserHTML = new ParserHTML();
            LogText.Text = parserHTML.LoadPage();
            MainCol();
        }
            public void MainCol()
            {
            #region Boxes
            PictureBox[] boxes = {
  pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, pictureBox7, pictureBox8,
                pictureBox9, pictureBox10, pictureBox11, pictureBox12, pictureBox13, pictureBox14, pictureBox15, pictureBox16, pictureBox17, pictureBox18};
            Label[] labels = {
                label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, label11, label12, label13, label14, label15,
            label16, label17, label18};
            Label[] qal = {
                qual1, qual2, qual3, qual4, qual5, qual6, qual7, qual8, qual9, qual10, qual11, qual12, qual13, qual14, qual15, qual16, qual17, qual18};
            #endregion
            var parsing = namefilm.ProductlistItem();
            int i = 0;
            foreach (var pars in parsing)
                {
                labels[i].Text = parsing[i].NameFilm;
                boxes[i].SizeMode = PictureBoxSizeMode.StretchImage;
                boxes[i].LoadAsync(parsing[i].ImageURl);
                qal[i].Text = parsing[0].Quality;
                LogTex2.Text += parsing[i].NameFilm + "\r\n";
                LogTex2.Text += parsing[i].ImageURl + "\r\n";
                LogTex2.Text += parsing[i].Quality + "\r\n";
                i++;
                }
            }
    }
}

Возможно можно сделать проще. Если есть предложения ")

READ ALSO
Поведение параметров компонента bitrix

Поведение параметров компонента bitrix

В параметр компонента передается строка

173
Добавить значения в бд по нажатию кнопки

Добавить значения в бд по нажатию кнопки

Есть таблица, в которой выводятся данные из mysqlВ самой таблице есть 3 поля, в которые можно добавить значения и кнопка

173
Разделить большой файл xml

Разделить большой файл xml

Задача заключается в выборе файла на компьютере, его развибке и сохраненииПроект работает на фреймворке Laravel 5

184
Некорректно отрабатывает код

Некорректно отрабатывает код

Пытаюсь создать PHP корзину, но он ведет себя некорректноНа этапе добавления присутствует проверка, если товар существует в $_SESSION, то просто...

181