Как создать форму из трех частей, две статические и одна (левая верхняя) неопределенная... пользователь сам решает какую таблицу открыть
подскажите как правильнее это сделать?
Я бы посоветовал оплатить труд того, кто в этом разбирается. Это будет самое правильное :)
Либо оплатить того, кто научит. Курсы по скайпу обойдуться в среднем - $5 -$30/ час в зависимости от уровня вхождения.
Вопрос сформулирован так, что дать на него конкретный ответ не возможно.
давайте представим, что у нас есть 20 форм с таблицами (DataGridView), и мне нужно чтобы на экране всегда было видно три таблицы! две постоянные и одна не определенная по выбору пользователя...
сложность в том, что мне нужно чтобы таблица 1 находилась с права от таблицы которая не определенная, а таблица 2 под этими двумя
NNNN111
22222222
если у кого есть идеи как это можно реализовать, буду очень благодарен
А я попробую. :)
KrutVladimir, используй TableLayoutPanel.
давайте представим, что у нас есть 20 форм с таблицами (DataGridView), и мне нужно чтобы на экране всегда было видно три таблицы! две постоянные и одна не определенная по выбору пользователя...
сложность в том, что мне нужно чтобы таблица 1 находилась с права от таблицы которая не определенная, а таблица 2 под этими двумя
NNNN111
22222222
если у кого есть идеи как это можно реализовать, буду очень благодарен
на самом деле сложности здесь нет никакой - но вы подходите к задаче не с того конца.
Во-первых, какая разница сколько у вас форм? Таблиц, которых вы отображаете всего три.
Во-вторых, что бы загружать нужную/нужные по выбору пользователя - создайте отдельно класс отображения (который будет управлять тем, что вы показываете) и передавайте ему в качестве какихто параметров, то что можно отображать.
Я пытался описать как это сделать в статье, не знаю, насколько понятно получилось. Если не понятно - задайте вопросы.
я забыл уточнить что начал изучать C#.
а сложность я вижу в том что при формировании динамической формы нужно помнить состояние двух остальных таблиц, можно конечно передавать параметры классу и он будет каждый раз устанавливать предыдущее состояние, но это как я понимаю будет перерисовывать всю форму а мне очень хочется чтобы перерисовывалась только одна четвертая часть формы.
я совсем новичок так что сильно не пинайте)
интересно а в пользовательский контроллер можно запихнуть часть формы... с таблицей и кнопками управления, а потом удалять предыдущий контрол и на его место прорисовать новый контрол? но при этом состояние остальной формы должно остаться без изменения.
интересно а в пользовательский контроллер можно запихнуть часть формы... с таблицей и кнопками управления, а потом удалять предыдущий контрол и на его место прорисовать новый контрол? но при этом состояние остальной формы должно остаться без изменения.
можно. но не нужно.
За перерисовку формы должен отвечать не контроллер, а представление - и ему и нужно передавать данные, обработанные контроллером.
Это невозможно т.к frm1 потомок Form1.
можно тут по подробнее?
я давно хочу написать одну программу, систему даже можно сказать ради которой решил уйти из 1С и освоить C# для ее реализации... на данный момент все еще на стадии планирования! и исходного кода нет! но все детали уже просчитаны, я четко уже представляю себе программу во всех деталях, осталось набить только код... но си подобные языки мне в новинку и я не все возможности понял! на данный момент мне нужны идеи (желательно с примером) как можно реализовать в программе возможность открывать любую форму (разные данные возможно карта или справочники) но при этом обязательно должен быть сбоку список контактов а снизу рекламная лента!
если идей не будет то я создам просто форму на которой панелями распределю зоны и остальное помещу TabControl журналы, прочее будет в отдельных модальных окнах... в принципе для данной задачи это приемлемо так как большая часть данных оперативная. Но каждый опытный программист скажет что это плохо для будущего усовершенствования проекта, через пол года я захочу внедрить 50 справочников и куда их тогда пихать?!.... Мне нужна область в которой я смогу выводить любую информацию но с прилепленными контактами и рекламой)
согласен, но на практике лучше всего изучать язык на конкретном примере! я из своего опыта знаю, не первый язык изучаю
Дайте Skin вашей программы как Вы это представляете.
Не понятен ещё один аспект платформы
Это на базе Microsoft Silverlight C# or C# Win
Дайте Skin вашей программы как Вы это представляете.
C# or Windows Desktop
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace cshKrutVladimir
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
UC[1] = new UserControl1();this.Controls.Add(UC[1]);
UC[2] = new UserControl2();this.Controls.Add(UC[2]);
}
UserControl[] UC = new UserControl[3];
Size memSize;
Point memLocation;
int IndexUC = 1;
private void Form1_Load(object sender, EventArgs e)
{
UC[IndexUC].Size = new Size
(ClientSize.Width - panel1.Width,
ClientSize.Height - webBrowser1.Height-mnuMain.Height);
UC[IndexUC].Location = new Point(0, mnuMain.Height);
memLocation = new Point(0, mnuMain.Height);
memSize = UC[IndexUC].Size;
}
private void subFileExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void Form1_Resize(object sender, EventArgs e)
{
//здесь надо делать координацию маштаба для UserControl's
UC[IndexUC].Size = new Size
(ClientSize.Width - panel1.Width,
ClientSize.Height - webBrowser1.Height - mnuMain.Height);
memSize = UC[IndexUC].Size;
}
private void bntChangeScreen1_Click(object sender, EventArgs e)
{
UC[1].Hide();
IndexUC = 2;
UC[2].Location = memLocation;
UC[2].Size = memSize;
UC[2].Show();
}
private void btnShowWebBrowser_Click(object sender, EventArgs e)
{
try
{
webBrowser1.Navigate(new Uri("http://codenet.ru/"));
}
catch (System.UriFormatException)
{
return;
}
}
}
}
UserControl это таже форма.
Примерно так.
Спасибо большое!!!!!!!!
но правда теперь напрашивается новый вопрос... если у меня будет свыше 50 UserControl с таблицами? и они будут все открыты... наверняка это будет тяжеловато для системы... возможно ли чтобы в памяти был только один UserControl, при вызове следующего по имени... текущий UserControl освобождал память а тот который вызывают появился в место него?
И ыщё нашел ЛЯП в коде и исправил на это:
{
// 2 это есть UserControl2 и т.д по коду
SettingsUC(2, IndexUC, memLocation, memSize);
}
private void bntChangeScreen2_Click(object sender, EventArgs e)
{
SettingsUC(3, IndexUC, memLocation, memSize);
}
private void btnMainScreen_Click(object sender, EventArgs e)
{
SettingsUC(1, IndexUC, memLocation, memSize);
}
private void SettingsUC(int _IndexUC, int _HideUC, Point _memLocation, Size _memSize)
{
//скрываем все видимые UserControl
foreach (Control ctrl in Controls)
{
if (ctrl is UserControl)
{
ctrl.Hide();
}
}
//какой UserControl открыт
IndexUC = _IndexUC;
//координаты UserControl
UC[_IndexUC].Location = _memLocation;
//размер UserControl
UC[_IndexUC].Size = _memSize;
//показать UserControl
UC[_IndexUC].Show();
}
Я больше переживаю не за UserControl а за то что будет на нем... если на каждом вывести таблицу... а их будет к примеру с выше 50 и они все будут крутится одновременно, конечно для пользователя будет отображаться один, но остальные все еще будут в памяти...
отличным вариантом было бы объявлять UserControl не при инициализации формы а по событию.... ну к примеру захотелось пользователю открыть UserControl к примеру UserControl23... сначала передаются параметры на отключение текущему UserControl после чего убивается совсем (не скрывается)... когда UserControl нет активных то начинается поиск запрашиваемого... (как еще не знаю) возможно где-то в настройках приложения будет храниться описание всех UserControl.... это будет правильнее мне кажется, так как пользователь возможно на 90% будет интересовать один два UserControl остальные он может открывать раз в месяц к примеру....
{
// 2 это есть UserControl2 и т.д по коду
SettingsUC(2, IndexUC, memLocation, memSize);
}
private void bntChangeScreen2_Click(object sender, EventArgs e)
{
SettingsUC(3, IndexUC, memLocation, memSize);
}
private void btnMainScreen_Click(object sender, EventArgs e)
{
SettingsUC(1, IndexUC, memLocation, memSize);
}
private void SettingsUC(int _IndexUC, int _HideUC, Point _memLocation, Size _memSize)
{
//скрываем все видимые UserControl
foreach (Control ctrl in Controls)
{
if (ctrl is UserControl)
{
ctrl.Hide();
}
}
//какой UserControl открыт
IndexUC = _IndexUC;
//координаты UserControl
UC[_IndexUC].Location = _memLocation;
//размер UserControl
UC[_IndexUC].Size = _memSize;
//показать UserControl
UC[_IndexUC].Show();
}
Спасибо большое мне это очень помогло!
я правда уже тоже переделал на свой лад, но это сколько программистов столько и вариантов решения) я сделал ближе к второму варианту но избавился от всех размеров, просто поместил еще одну панель на место UserControl присвоил ему panel2.dock = DockStyle.Full; и UC[1].dock = DockStyle.Full; panel2.Controls.Add(UC[1]); //больше вычислять и передавать размеры не нужно)
Я вообще больше хотел сказать об UserControl , что-бы было понять о концепции UserControl, а если Вы решили изучать .NET то F# это сила or C++ там без дураков , а VB or С# это так себе, я даже лучше выбрал-бы VB, теже яйца только в профиль.
вот на скорую руку:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace cshKV
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
UserControl[] UC = new UserControl[104];
int memIndexUC;
private void Form1_Load(object sender, EventArgs e)
{
UC[0] = new MainUC() ; panel3.Controls.Add(UC[0]);
UC[0].Dock = DockStyle.Fill;
}
private void SubMnuExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void bntChangeScreen1_Click(object sender, EventArgs e)
{
panel3.Controls.Remove(UC[memIndexUC]);
UC[1] = new UserControl1(); panel3.Controls.Add(UC[1]);
UC[1].Dock = DockStyle.Fill;
memIndexUC = 1;
}
private void bntChangeScreen2_Click(object sender, EventArgs e)
{
panel3.Controls.Remove(UC[memIndexUC]);
UC[2] = new UserControl2(); panel3.Controls.Add(UC[2]);
UC[2].Dock = DockStyle.Fill;
memIndexUC = 2;
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace cshKrutVladimir
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CreateUserControl(new UserControl1());
}
UserControl myUserControl;
private void uc1_Click(object sender, EventArgs e)
{
CreateUserControl(new UserControl1());
}
private void uc2_Click(object sender, EventArgs e)
{
CreateUserControl(new UserControl2());
}
private void CreateUserControl(UserControl UC)
{
panel2.Controls.Clear();
myUserControl = UC;
myUserControl.Dock = DockStyle.Fill;
panel2.Controls.Add(myUserControl);
}
}
}
Теперь в проекте видим так и работаем как с формой:
Выше напечатанный мной код рабочий , но можно и так:
{
panel3.Controls.Remove(UC[memIndexUC]);
memIndexUC = 1;
UC[memIndexUC] = new UserControl1(); panel3.Controls.Add(UC[memIndexUC]);
UC[memIndexUC].Dock = DockStyle.Fill;
}
...
Теперь в проекте видим так и работаем как с формой:
...
Выше напечатанный мной код рабочий , но можно и так:
{
panel3.Controls.Remove(UC[memIndexUC]);
memIndexUC = 1;
UC[memIndexUC] = new UserControl1(); panel3.Controls.Add(UC[memIndexUC]);
UC[memIndexUC].Dock = DockStyle.Fill;
}
Умение читать чужой код это основное качество хорошего программиста! и поверьте я прекрасно понял ваш код, как для уровня студента он вполне пригодный но в рабочий проект он абсолютно не пригодный... это я сужу по своему горькому опыту! лет восемь назад я начал разработку одной конфигурации в 1С... когда я показал первую альфа версию руководству то они сразу заставили своих сотрудников работать в ней... я был в шоке так как там всего 10% было реализовано... ничего говорят они, в процессе допишешь! и я в мыле начал писать на скорую руку... главное реализовать функционал... о правиле хорошего тона в написание кода мне некогда было думать, ведь ко мне 20 сотрудников постоянно бегало... где то?! как это?! ...
В результате этот проект до сих пор успешно работает... пользователи довольны но внутри такая хрень, что мне стыдно за этот проект.... там только у основного документа в модуле формы с выше 10 тысяч строк кода... мусора вернее... если грамотно переписать то получится максимум 1.5 тыс строк кода.
Исключительно из за уважения я не хотел указывать вам на ваши ошибки... я еще в самом начале воссоздал ваш код и во время тестирования нашел много уязвимых мест! поэтому попытался усовершенствовать его.... результат вы уже увидели, хочу чтобы покритиковали опытные программисты так как там есть одно большое НО... я не уверен, что используя одну ячейку памяти не уверен что при замене типа память освобождается, ведь там используется new и вполне возможно, что просто создается новый экземпляр...
и еще... это не мой проект, то что мы тут обсуждаем это маленькая соринка... то что я хочу написать, это довольно таки крупный проект... и создавать его буду исключительно я! и не надеюсь, что за меня кто-то выполнит всю работу!!!
Во как громко напечатано !!!
Это пишет человек , который вчера ещё не знал , что есть UserControl
Мне теперь по барабану Ваше уважения я дам ответ за каждую строчку моего кода.
Вот строки кода Профессионала KrutVladimir
{
CreateUserControl(new UserControl2());
}
private void CreateUserControl(UserControl UC)
{
panel2.Controls.Clear();
myUserControl = UC;
myUserControl.Dock = DockStyle.Fill;
panel2.Controls.Add(myUserControl);
}
Объявлена процедура CreateUserControl(тут есть детали - ладно опускаю на 50%/ok)
private void CreateUserControl(UserControl UC)
panel2.Controls.Clear():
Здесь покажу пример:
UserControl1 в конструкторе:
UserControl1: после panel2.Controls.Clear():
Профессионал KrutVladimir
Получает чистую Form
myUserControl = UC;
Опаньки Профессионал KrutVladimir даёт ЛЯП.Это при народе KrutVladimir кричал надо резать код.
Уважаемой проще надо к коду, надо так:
panel2.Controls.Add(UC);
далее по коду исправил Ляп Профессионала KrutVladimir :
panel2.Controls.Add(UC);
При каждом нажатии uc2_баттон
Создаётся новый UserControl
Теория моего 1-кода верна т.к иметься связь между интерфейсами.
P/S
Стучу по клаве более 36 лет и 7 месяцов и 12 дней
А Вам слабо или Вы думали та на дурака на рвались Профессионал KrutVladimir
Вот такие дела товарищ KrutVladimir
Ваш 1С как у БаоБаБа интернет.
Про 10.000 or 1500 Вы Лучше эти сказки оставте для внуков.
Мысли в вслух Типа 1С
Все правильно, я действительно в C# нулевой почти! но разрабатываю программы с 1998 года... дальше комментировать не буду! не интересно и неприятно!
дальше по коду:
- мой код! я действительно благодаря вашим подсказкам смог легко разобраться с UserControl и за это я вам очень благодарен!
Теперь ваша критика! к сожалению вы ничего не покритиковали по существу, вы указали на то, что я и хотел добиться!
- ваш код! все работает... я проверял. и даже тестировал на защиту от дураков (есть такое понятие, ну и у меня таких человек 30 было) если хотя бы у одной из переменной произойдет событие null или другое значение то panel3.Controls.Remove(UC[memIndexUC]); не сработает и UserControl будет висеть на форме до закрытия приложения, убрать не возможно, panel2.Controls.Clear() может удалить не нужные UserControl а так как требовалось чтобы активным должно быть только один UserControl то это очень даже подходит! Ну это рабочий момент, возможно повезет и сбоев не произойдет!... Дальше по правилам хорошего написания кода: задайте себе вопрос, зачем создавать 104 элемента массива если требовалось только один UserControl держать активным?! ну конечно можно предусмотреть открытие нескольких форм, но тогда нужно сразу предусматривать ярлычки для переключения между ними! в противном случае это просто трата памяти... И еще одно... это не ошибка но тоже желательно этого избегать! Очень много повторяющего кода! в будущем это может значительно затруднить читать код! Но это все детали которые меня не сильно волнуют! я просто хотел усовершенствовать ваш код! и как мне кажется у меня получилось... хотя это мое мнение... как вы выразились Профессионал который еще вчера не знал про UserControl
Зато я не побираюсь на форумах с протянутой рукой как нищий.
KrutVladimir он есть
Дмитрий Голуб
Slava241
Я печатал, что это есть МАКЕТ or вот на скорую руку:
Здесь и как на других форумах я на 90% печатаю код из головы.
Сделаю отступ не зная концепции программы я печатал код в своём понимании концепции
Ладно поясню на пальцах
memIndexUC должен отслеживать сам программист самый простой способ и нужный это
[ tryStatements ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ] ]
[ Exit Try ]
...
[ Finally
[ finallyStatements ] ]
End Try
Сделайте так и увидите результат.
{
panel2.Controls.Clear();
//myUserControl = UC;
//myUserControl.Dock = DockStyle.Fill;
//panel2.Controls.Add(myUserControl);
}
Ответ я печатал выше
Повторяю не зная концепции программы, это Вам решать сколько UserControl подключать.
немного поправлю... не Form очищается а только panel2 остальные элементы формы остаются не измены.
немного поправлю... не Form очищается а только panel2 остальные элементы формы остаются не измены.
Это теория
Я с Вами согласен по идеи должно очиститься только panel2 , но в help напечатано очищает все коллекции.
Вследствие я получаю чистую Form(согласно инструкции) код прошел тест на компе в реальной программе.
Ладно проехали.
Из нашей перепечатки для себя я узнал новый аналог перевода click - кнопать взял на заметку.