powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Лучший способ для работы с данными под винформс
22 сообщений из 22, страница 1 из 1
Лучший способ для работы с данными под винформс
    #39376459
krudensoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, специалисты Winforms!
Вот тут в ветке WPF я задал вопрос - какой подход к нижеприведенной задаче самый лучший?
Казалось бы - вопрос не сложен. Да, вопрос не чисто про WPF, а про набор технологий, но ведь WPF и не технология, как таковая, а идеология. Ответ я пока так и не получил. И заинтересовался - а смогу ли я получить ответ от специалистов по винформам?

Преклоняюсь перед могучим разумом сообщества и прошу накидать решений для такой простой задачи:

Пусть есть таблиЦки на MS SQL Server 2008:
CREATE DATABASE [Db1]
GO
USE Db1
GO
CREATE TABLE T1
(
[T1_Id] INT NOT NULL PRIMARY KEY --ключ первой таблицы
, [T1_Name] NVARCHAR(250) --некий текст
, T2_Id INT --ссылка на ключ из второй таблицы
)
GO
CREATE TABLE T2
(
[T2_Id] INT NOT NULL PRIMARY KEY --ключ второй таблицы
, [T2_Name] NVARCHAR(250) --некий текст
)
GO

Накидайте пожалуйста пример с самым правильным подходом винформ, который бы:

1. Загружал данные из T1 и отображал в списке (сортировал, фильтровал)

2. Позволял бы выбирать значение из T2 для проставления в T1.T2_Id

3. Сохранял бы изменения на скул

ps:
1. Возможно, ваши варианты сильно отличаются от евангелистского подхода - важно, чтобы решение работало!
2. Я понимаю, что тут не только и не столько винформ. Но хочется получить пример работоспособного совокупного подхода.
3. И да. Датасет\дататейбл - здорово, классно, замечательно. Но только пожалуйста, не надо его в качестве примера.

Заранее благодарю!
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39376465
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39393880
ntkrnlmp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krudensoft,

Нет понятия "самого правильного подхода". Все зависит от ваших навыков и опыта.

В разных шаблонах организации интерфейса (MVP/MVC/MVVM/MVPVM) приняты свои подходы. Нюансов может быть много, но суть одна: представление каким-либо образом передает команду от пользователя классу, который занимается логикой обработкой команд. Тот в свою очередь делает что требуется над моделью/моделями, ходит к серверу/базе данных, после обновляет модели и сообщает представлению о результате.

Модели данных
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public class FirstTableItem
{
	public int Id { get; private set; }
	public string Name { get; private set; }
	public SecondTableItem SecondTableItem { get; private set; }

	public event EventHandler<SecondTableItemChangedEventArgs> SecondTableItemChanged;

	private FirstTableItem() { }
	public FirstTableItem(int id, string name, SecondTableItem secondTableItem) 
	{
		Id = id;
		Name = name;
		SecondTableItem = secondTableItem; 
	}

	public void ChangeSecondTableItem(SecondTableItem secondTableItem)
	{
		// здесь какая-нибудь валидация перед обновлением свойства
		SecondTableItem = secondTableItem;
		SecondTableItemChanged?.Invoke(this, new SecondTableItemChangedEventArgs(SecondTableItem));
	}
}

public class SecondTableItem
{
	public int Id { get; private set; }
	public string Name { get; private set; }

	private SecondTableItem() { }
	public SecondTableItem(int id, string name )
	{
		Id = id;
		Name = name;
	}
}

public class SecondTableItemChangedEventArgs : EventArgs 
{
	public SecondTableItem NewItem { get; }

	public  SecondTableItemChangedEventArgs(SecondTableItem newItem)
	{
		NewItem = newItem;
	} 
}



Презентер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
public interface IPresenter
{
	FirstTableItem CurrentFirstTableItem { get; set; }

	// можно использовать BindingList или ObservableCollection, если нужны привязки
	IReadOnlyList<FirstTableItem> FirstTableItems { get; }
	IReadOnlyList<SecondTableItem> SecondTableItems { get; }

	void LoadData();
	void Update(SecondTableItems newItem);
}

public class Presenter : IPresenter
{
	private IDataProvider _provider;
	private FirstTableItem _currentFirstTableItem; 

	public IReadOnlyList<FirstTableItem> FirstTableItems { get; }
	public IReadOnlyList<SecondTableItem> SecondTableItems { get; }

	public FirstTableItem CurrentFirstTableItem 
	{ 
		get { return _currentFirstTableItem; }
		set 
		{ 
			_currentFirstTableItem?.SecondTableItemChanged -= CurrentItem_SecondTableItemChanged;
			_currentFirstTableItem = value;
			_currentFirstTableItem?.SecondTableItemChanged += CurrentItem_SecondTableItemChanged;
		}
	}

	public Presenter(IDataProvider provider)
	{
		_provider = provider;
	}

	public void LoadData()
	{
		// загрузка данных
	}

	public void Update(SecondTableItems newItem)
	{
		CurrentFirstTableItem.ChangeSecondTableItem(newItem);
	}

	private void CurrentItem_SecondTableItemChanged(sender object, SecondTableItemChangedEventArgs args)
	{
		var firstTableItem = (FirstTableItem)sender;
		if(args.NewItem == null)
			provider.DeleteSecondItem(firstTableItem.Id);
		else
			provider.UpdateSecondItem(firstTableItem.Id, args.NewItem.Id);
	}
}



Представление
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
// Я не знаю как в вашем представлении должен выглядеть интерфейс
public class Form1 : Form
{
  private IPresenter _presenter;

  public Form1(IPresen presenter)
  {
  	_presenter = presenter;
  }

  public void Form_Load()
  {
    _presenter.LoadData();
    // далее вывод данных на форму и т.д.
  }

  private void UserSelectedItemForFirstTableItem(object sender, EventArgs args)
  {
  	var selectedSecondTableItem = ... // каким-либо образом получается выделенный элемент
  	if(selectedSecondTableItem == null)
  		return;

  	try
  	{
  		_presenter.Update(selectedSecondTableItem); 
  	}
  	catch(ValidationException)
  	{
  		// ...
  	}
  }
}

...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39393951
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39419152
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насколько вообще mvp применим в реальных проектах?

в чем его сокральный смысл?

Это тесты и "мифическая" возможность повторного использования имеющейся логики?

если вся логика в Service'ах и они имеют все тесты то насколько критично тестирование presenter.


кто-то использовал mvp на работе, в проектах под заказ или видел как это делали другие?
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39426144
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по количеству постов видно mvp мертв нежеле жив ....

Создал в тестовый проект на формах. 1 Service и 1 Repository

Создал форму для того чтобы отобразить данные из сервиса.

и получился следующий код
если не использовать MVP получается что сервис не нужно передавать как параметр в конструкторе формы?
использовать интерфес как приватный поле + Ninject или LightInject?

если бы вы разрабатывали код который придется передать кому то другому на поддержку
который будет позже расширяться
как бы вы тут поступили?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
using System;
using System.Windows.Forms;
using BusinessLogic;
using DataAccess;
using UI.Forms.Company;

namespace RfcReadTable.WinForms.UI.Forms.Shared
{
    public partial class FormContainer : Form
    {
        public FormContainer()
        {
            InitializeComponent();
        }

        private void getDetailsToolStripMenuItem_Click(object sender, EventArgs e)
        {

            IRepositoryCompany repositoryCompany = new RepositoryCompany();
            IServiceCompany serviceCompany = new ServiceCompany(repositoryCompany);

            var formCompany = new FormCompany(serviceCompany);
            formCompany.Show();
        }
    }
}
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39426196
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это домашнее приложение из одной формы, то ладно. Иначе же это быстро разрастется в неповортливую неподдерживаемую махину. Будет к примеру не одна, а 100 форм, и в кжадой IServiceCompany . И потом вдруг IServiceCompany понадобится еще одна зависимость от другого репозитория - что делать?

Или через год упорного манки-кодинга вдруг захочется перейти на WPF - и приплыли.
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39426200
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gнасколько вообще mvp применим в реальных проектах?

в чем его сокральный смысл?Это способ создания code-behind там, где он не идёт "из коробки". Если, в таких системах как WPF, WinForms, Delph и других, code-behind присутствует, то для отказа от code-behind в пользу MVP, MVC, MVVM и других должны быть явные причины. Если таких причин нет, то и применять их в данном случае не нужно.
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39426515
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisЕсли это домашнее приложение из одной формы, то ладно.

Приложения не домашнии и не комерческие в том смысле что оно не для продажи а для бухгалтеров. Приложения для расчетов чего либо.


Алексей КАртем Gнасколько вообще mvp применим в реальных проектах?

в чем его сокральный смысл?Это способ создания code-behind там, где он не идёт "из коробки". Если, в таких системах как WPF, WinForms, Delph и других, code-behind присутствует, то для отказа от code-behind в пользу MVP, MVC, MVVM и других должны быть явные причины. Если таких причин нет, то и применять их в данном случае не нужно.


Приложения на формах.

Вот это можно назвать причиной?

- Если в интерфейс / в логику вносятся постоянные изменения
- Часто из за не опытности не правильно разрабатывается интерфейс. Спустя условно 3-6 месяцев приходит понимание как это должно было быть на самом деле.
- Есть желание уйти в будущем от винворм на mvc. Есть предположение что при использовании MVP перейти на MVC будет проще.
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39426717
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G.
- Есть желание уйти в будущем от винворм на mvc.

Стандартный вопрос нк собеседовании - назвать три основных отличия винформс от mvc
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39426954
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G, сейчас доступно множество материалов по проектированию приложений. Изучайте, пробуйте.
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39427111
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisАртем G.
- Есть желание уйти в будущем от винворм на mvc.

Стандартный вопрос нк собеседовании - назвать три основных отличия винформс от mvc

это серьезно или юмор такой?

skyANAАртем G, сейчас доступно множество материалов по проектированию приложений. Изучайте, пробуйте.

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

вопрос был кто-то использовал mvp на работе, в проектах под заказ или видел как это делали другие?
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39427537
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G, ну я использовал и не только MVP... Но ИМХО большинство, как Вы, в баттонклики запихивает кучу фигни :)
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39428849
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAАртем G, ну я использовал и не только MVP... Но ИМХО большинство, как Вы, в баттонклики запихивает кучу фигни :)

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

с какими подводными комнями столкнулись?
есть что, что-то понравилось, а что-то не понравилось?

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

если бы пришлось работать фрилансером, создавать в одиночку winforms проект выбрали бы mvp опять?

---------------------

PS.
Есть еще пару вопросов, не буду перегружать этот пост.
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39428889
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наткнулся на вот такой вариант LINK . знаю что время у всех не много, но был бы примного благодарен если бы глянули и оценили.


нормальная, годная реализация

если бы пришлось работать фрилансером, создавать в одиночку winforms проект выбрали бы mvp опять?


WPF же, MVVM
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429309
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallarisнаткнулся на вот такой вариант LINK . знаю что время у всех не много, но был бы примного благодарен если бы глянули и оценили.


нормальная, годная реализация

если бы пришлось работать фрилансером, создавать в одиночку winforms проект выбрали бы mvp опять?


WPF же, MVVM

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

по поводу WPF же, MVVM. Вопрос то был немного в другом. сли бы пришлось работать фрилансером, создавать в одиночку winforms проект выбрали бы mvp ?
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429316
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gпо поводу WPF же, MVVM. Вопрос то был немного в другом. сли бы пришлось работать фрилансером, создавать в одиночку winforms проект выбрали бы mvp ?
вы так говорите, как будто фрилансер, что то там решает. На чем скажут делать, на том и будите, не хотите, досвидание.
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429335
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesАртем Gпо поводу WPF же, MVVM. Вопрос то был немного в другом. сли бы пришлось работать фрилансером, создавать в одиночку winforms проект выбрали бы mvp ?
вы так говорите, как будто фрилансер, что то там решает. На чем скажут делать, на том и будите, не хотите, досвидание.


суть в другом. у вас есть возможность выбора. не важно кто вы и где.
вот при таком раскладе, вы выберите mvp.

Ок поясню какой ответ хотелось бы услышать.

Я работал c MVP в N проектах.
Да, выберу MVP сново, потому что это круто, потому что это правильно итд итп.
Нет, не выберу MVP снова, а буду все писать в батанкликах, потому что mvp отстой, потому что вы наткнетесь на кучу подводных комней, будете бороться с невидимыми деманами итд итп.


Ну вот как то так...
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429396
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G,

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

Честно говоря, MVP-реализации редко встречал, больше MVC/MVVM
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429408
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Артем G,

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

Честно говоря, MVP-реализации редко встречал, больше MVC/MVVM

Вот причина почему я строчу на форуме. Не ради личной забавы. Или чтоб покуражиться над тем кто будет читать.
А чтобы понимать чужое / чтобы понимали мое.

Прежде чем задавать вопросы я погуглил эту тему условно последний год-два. раз в пол года по 2-3-4 дня.
Как понял
С WinForms используют MVP.
С WPF используют MVVM.

Вот нашел пример LINK . Господа выше подтвердили что пример годен. Это MVP.
Ок, я посмотрю в интернете пример с Winforms + MVVM. Если не сложно, позволяет время то мне бы было интересно посмотреть на ваш пример или услышать в чем разница.


------------------------------------------------

а вопрос так и остался открытым. скопирую его чтобы не был пропущен.

Ок поясню какой ответ хотелось бы услышать.

Я работал c MVP в N проектах.
Да, выберу MVP сново, потому что это круто, потому что это правильно итд итп.
Нет, не выберу MVP снова, а буду все писать в батанкликах, потому что mvp отстой, потому что вы наткнетесь на кучу подводных комней, будете бороться с невидимыми деманами итд итп.

Ну вот как то так...
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429621
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально у винформс кривоватый биндинг, поэтому требовался некий посредник между моделью и вьюхой, который бы распихивал все из модели во вьюху и обратно. Его назвали presenter. Логика по максимому выносилась в презентер, но все равно вьюха была обвешана интерфейсом с кучей свойств для общения с презентером.

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

Просто в винформс не всегда легко можно отскочить биндингами, вот и вся разница
...
Рейтинг: 0 / 0
Лучший способ для работы с данными под винформс
    #39429629
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GАлексей Кпропущено...
Это способ создания code-behind там, где он не идёт "из коробки". Если, в таких системах как WPF, WinForms, Delph и других, code-behind присутствует, то для отказа от code-behind в пользу MVP, MVC, MVVM и других должны быть явные причины. Если таких причин нет, то и применять их в данном случае не нужно.


Приложения на формах.

Вот это можно назвать причиной?

- Если в интерфейс / в логику вносятся постоянные изменения
- Часто из за не опытности не правильно разрабатывается интерфейс. Спустя условно 3-6 месяцев приходит понимание как это должно было быть на самом деле.
- Есть желание уйти в будущем от винворм на mvc. Есть предположение что при использовании MVP перейти на MVC будет проще.Если речь идёт о реальном проекте, то причиной можно назвать только экономию времени на разработку и дальнейшее развитие проекта. Например, экономии времени можно достичь за счёт повторного использования кода, который выносится в отдельные классы при реализации шаблонов MV*. Если же нет чёткого понимания того, на чём удастся сэкономить благодаря применению шаблонов MV*, то лучше с ними не связываться.

Если речь идёт об учебном или "полу учебном" проекте, то обязательно нужно попробовать. Тут главное, чтобы потом были сделаны правильные выводы.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Лучший способ для работы с данными под винформс
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]