Если создавать в классе 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. Или лучше, как по другому создать список (в данном случае названий фильмов) к которому я могу обращаться из другого класса.
Другой класс
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';
}
}
}
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();
}
}
На мой взгляд второй вариант предпочтительнее первого.
Собственно проблема решилась путем инициализации списка (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++;
}
}
}
}
Возможно можно сделать проще. Если есть предложения ")
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть таблица, в которой выводятся данные из mysqlВ самой таблице есть 3 поля, в которые можно добавить значения и кнопка
Задача заключается в выборе файла на компьютере, его развибке и сохраненииПроект работает на фреймворке Laravel 5
Пытаюсь создать PHP корзину, но он ведет себя некорректноНа этапе добавления присутствует проверка, если товар существует в $_SESSION, то просто...