Уроки C# - Управление контролами из дочерней формы

Поділитися
Вставка
  • Опубліковано 16 лип 2021
  • Донаты ➜ www.donationalerts.com/r/jail...
    Эксклюзив для спонсоров ➜ / xpuct
    Если недоступна спонсорка ➜ boosty.to/xpuct
    #Уроки #Control
  • Наука та технологія

КОМЕНТАРІ • 85

  • @user-kn8vd1iz8g
    @user-kn8vd1iz8g 2 роки тому +7

    Спасибо! Два дня убиты напрасно, т.к. с самого начала не хотелось смотреть видео, выданное гуглом. И совершенно напрасно. Автор - крут !

  • @1nigm4
    @1nigm4 2 роки тому +23

    Десятая секунда видео и уже словил улыбку :)
    А я в Form1.cs создавал поле public static Form1 Main; И в конструкторе после Initialization() присваивал Main = this; Далее я мог абсолютно из любого места обращаться к Form1 (Form1.Main.Button1.Text = "Ураааа!";)

    • @XpucT
      @XpucT  2 роки тому +2

      Лайфхак 👍

  • @yaniww
    @yaniww 2 роки тому +1

    Спасибо огромное. Самостоятельно изучаю C#, Ваши уроки очень помогают.

  • @igorthelight
    @igorthelight 2 роки тому +8

    Для тех, для кого всё равно "не дошло":
    * Чтобы изменить что-то у Формы1, нужно к ней обратиться
    * Чтобы к ней обратиться, нужна ссылка на неё. У нашей Формы2 нет ссылки на Форму1. Никакой.
    * Для этого, при создании экземпляра Формы2, мы передаём ей ссылку на Форму1 (this - ссылка на себя).
    * А в Форме2, мы принимаем эту ссылку (в Конструкторе) и записываем в переменную типа Form1.
    * Теперь мы можем обратиться к Форме1 через эту новую переменную, которая хранит ссылку на Форму1, и поменять в ней всё, что мы могли бы поменять из самой Формы1.

  • @aut0ritet445
    @aut0ritet445 2 роки тому +3

    Как по мне есть более простой способ, я когда создаю новый проект всегда в классе Program пишу так:
    internal static class Program {
    public static FormMain? FormMain { get; private set; }
    [STAThread]
    private static void Main() {
    ApplicationConfiguration.Initialize();
    FormMain = new();
    Application.Run(FormMain);
    }
    }
    Теперь можно из любого места программы написать Program.FormMain.button1.text = "Блаблабла"

    • @XpucT
      @XpucT  2 роки тому

      Ничего не забыл в коде? =)

  • @up9380
    @up9380 2 роки тому +1

    Помню, долго над этим вопросом бился. Но потом для себя методом проб и перебора вариантов открыл именно это способ, который показал Хачатур, и до сих пор его успешно использую.

  • @115-gagarin
    @115-gagarin Рік тому +1

    Спасибо! Классная подача! Замучили меня эти формы ))))

  • @Random-go3jh
    @Random-go3jh Рік тому +2

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

    • @XpucT
      @XpucT  Рік тому +1

      Скоро сниму ещё кое-что по этой теме =)

    • @pas9857
      @pas9857 11 місяців тому

      @@XpucTдоброго времени суток. Подскажите, новое видео есть?

  • @user-fp6pe4ne1q
    @user-fp6pe4ne1q 3 місяці тому +2

    Краса, не знаю що ще додати. На фоні більшості іт-блогерів ти крутий!

  • @okitkin
    @okitkin 6 місяців тому +1

    Огромная благодарность автору !!!!)))

  • @spacerecluse
    @spacerecluse 2 роки тому +1

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

  • @arsenyeghoyan5773
    @arsenyeghoyan5773 5 місяців тому +1

    Спасибо,все понятно и все работает,но можно вопрос.Как с кнопки form2 изменить переменную на form1, и как при нажатии кнопки с form1 менять кнопку form2?

  • @vadymkon
    @vadymkon Рік тому +1

    Какая жесть. Я только упомянул в онлайн лекции в универе wforms, и тут же полилось в чате, "ну хотя бы wpf" и тд. от однокурсников. So scary atmosphere

    • @XpucT
      @XpucT  Рік тому

      =))

    • @vadymkon
      @vadymkon Рік тому +1

      @@XpucT да не радостно чето нифига, теперь ясно почему ты иногда в уроках отдельные блоки посвящаешь таким прик0листам

    • @XpucT
      @XpucT  Рік тому +1

      @@vadymkon Ты даже примерно не представляешь, как это достало. У Меня поток такой, что держись психика...

    • @vadymkon
      @vadymkon Рік тому +2

      @@XpucT в Ютубе вроде есть банворд для настроек комментариев. Можно закинуть туда wpf+лучше))0)

  • @mus_catta
    @mus_catta 2 місяці тому +1

    Большое спасибо!:)

  • @seal8910
    @seal8910 2 роки тому +2

    Спасибо большое за видео и уроки я думал с ума сойду

  • @michellesfero4068
    @michellesfero4068 Рік тому

    Шикарное видео! На мой взгляд это лучшее решение.

  • @Ais_Hunt
    @Ais_Hunt Рік тому +1

    хах, а Я то думал это и есть костыль, ссылка на родительский объект посылаемый в конструкторе класса дочернего объекта. Я пришел в C# из С++, и не придумал ничего лучше чем ссылаться на родительский объект, т.е. все формы, кнопки лейбы, это всё объекты у которых разный уровень доступа, видимости и т.д., а тут мы просто изворачиваем программу так что бы иметь доступ ко всем интересующим нас объектам и их свойствам, методам, событиям.
    Теперь буду и дальше использовать без опаски порицания)))

  • @user-ud4gd9bd7y
    @user-ud4gd9bd7y 4 місяці тому +1

    Хитрый способ. То есть мы в параметрах отправляем ссылку на форму (cамого себя или же родительское окно), а уже в дочерней форме эту ссылку используем. Спасибо, Хачатур!

  • @bakhtiyarov_dj
    @bakhtiyarov_dj 7 місяців тому +1

    Благодарю вас. Спасли

  • @brainfood6580
    @brainfood6580 2 роки тому +1

    Где это видео было раньше, я с wpf когда делал синхронизацию контролов, чисто случайно сидел думал как можно сделать, и решил попробовать подобное, и как я удивился когда это сработало.
    С одной стороны это хорошо что сам додумался, а с другой кучу времени убил.
    Делал это примерно так:
    Public static MainWindow Main;
    И в конструкторе указывал:
    Main = this;
    Думал что это костыль, но ты показал что нет, вполне нормальный способ.

  • @user-be9rc4yz8r
    @user-be9rc4yz8r Рік тому

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

  • @king_fox_3106
    @king_fox_3106 2 роки тому

    Блин, помню я ломал голову над подобным 😂
    Я не додумался гуглить, но за то додумался использовать ваш метод к которому пришёл сам спустя пару дней 😅

  • @Diana-xv5tl
    @Diana-xv5tl Рік тому +1

    очень помог, спасибо огромное😊

  • @Anton-Os
    @Anton-Os 2 роки тому +1

    Огромное спасибо!

  • @UFO26
    @UFO26 Рік тому +1

    Правильно ли я понимаю: нажатие на крестик [X] у созданного окна, не делает form2.visible = false; а отправляет к сборщику мусора? Я во второй форме в поле ввода текста ввожу этот самый текст, закрываю форму [X], открываю снова, а текста нет...
    - Мама, а собаки нет... - (С) Малыш и Карлсон.
    То есть получается мне надо создать метод FormClose(); отловить нажатие на [X] и вместо убийства формы, делать form2.visible = false?

    • @XpucT
      @XpucT  Рік тому +1

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

  • @MysteryMarshak
    @MysteryMarshak 2 роки тому +2

    Привет, Хачатур 👋.
    Что скажешь насчет оптимизации памяти? Какие практики эффективны и какие сам используешь? Как лучше работать с изображениями, которые ты скачиваешь через вебклиент (или хттп веб реквест) и сохраняешь в виде списка? Если будет урок, то будет интересно посмотреть 👍🏻

    • @serpotapov
      @serpotapov 2 роки тому +2

      В рамках уроков C# по ссылке ниже как раз пройден этап с using, с http запросами и прочими плюшками, которые не дают утекать памяти.
      ua-cam.com/play/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb.html

  • @UFO26
    @UFO26 Рік тому +1

    Почему в шарпе для каждого поля, класса и метода надо писать public/private, почему Майкрософт не сделали как в плюсах: один раз написал и всё что ниже true или false. Так же экономнее.

    • @XpucT
      @XpucT  Рік тому +1

      Можно не писать private. Я не пишу. По умолчанию это будет private.

  • @okeJS3560
    @okeJS3560 4 місяці тому +1

    христ, благословит тебя бог, хахах, наконец то нормальный способ, сука АААААААА, спасибо огромное

  • @puser-yh9lv7kl1h
    @puser-yh9lv7kl1h 2 роки тому +2

    Новых видосов от тебя не было, ждем ... Интересно было например, про яндекс диск, я как то делал на костылях, чтобы мои документы, рабочий стол и т.д. резервировались на яндекс диске, помню проблема еще была, считывал имена папок поочередно, ругался на мои рисунки и т.д. так так это были ссылки. Путь был типа Enviroment.Documents, чтобы не задавать вручную. Или что-нибудь про работу с глобальным буфером обмена, скриншотами. Про Linq и DataGrid через SQL интересно было бы. Или вообще про API telegram, выкачивать файлы с каналов. Как то так

    • @puser-yh9lv7kl1h
      @puser-yh9lv7kl1h 2 роки тому

      найти бы еще как внедрить кнопки, безопасного извлечения флешек

  • @Official_Kelvin
    @Official_Kelvin Рік тому +1

    Очень полезно давно хотел так зделать на WinForm а на Wpf переходить не хочю там трудно всё

  • @user-ww1ok9lj9r
    @user-ww1ok9lj9r 2 роки тому +1

    огонь!!!

  • @mikhailskylark8417
    @mikhailskylark8417 Рік тому +1

    Привет, Хачатур! Писал тебе примерно месяц назад, что после переименования формы пропала функциональность "назад-вперёд" (а-ля ctrl+z и ctrl+y), ты порекомендовал пофиксить это тем, что переименовать через нотепад++ все остатки Form1 на новое название. Всё так и сделал, всё прекрасно работает... Только вот переменные Form1 всё-таки не видны)). Провёл эксперимент той же самой программы, но без переименования формы - всё работает и все переменные, так же как и методы, видны.
    У меня по кнопке формы1 запускается отдельный cs файл в новом потоке, и хоть я и могу передать в него Form1 f, криворучки из Майкрософт как-то так намудрили, что ни одна переменная главной формы всё равно не видна... Но зато методы видны, и я теперь под каждую свою нужду в изменении переменной накостылял кучу методов в основной форме, которые тупо меняют значение переменной, но через void метод....
    Хачатур, точно никак не получится нормально переименовать форму с сохранением всех возможностей?) Я интернет опять таки обыскал, об этом почти никто не пишет, да если и пишут, то либо не по теме, либо не работает.

    • @XpucT
      @XpucT  Рік тому

      Привет 🖐
      Не помню, Тебе отвечал или нет, просто берёшь и во всех файлах с помощью Notepad++ меняешь имя Form1 на то, что нужно.
      Ну и сами файлы, если нужно. Метод рабочий и гарантированный.

    • @mikhailskylark8417
      @mikhailskylark8417 Рік тому

      @@XpucT да, ты как раз мне про это отвечал - кароче, переменные всё равно не видны (грустный смайлик)

    • @mikhailskylark8417
      @mikhailskylark8417 Рік тому +1

      @@XpucT Это я тупанул, переменную не нужно делать статической, только публичной, тогда к ней можно будет легко обратиться через owner.var = 5;
      Всё в итоге работает, спасибо!

  • @justdummy527
    @justdummy527 11 місяців тому

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

  • @SHILY-PROJECT
    @SHILY-PROJECT 2 роки тому +2

    Серьёзно?! Это вообще законно?!O.o
    Я так-то давно с WinForms не работаю, но, в своё время, данного материала мне очень не хватало...:(
    Теперь буду знать:)
    Спасибо большое, Хачатур!:)

  • @Murad_A
    @Murad_A 2 роки тому +3

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

  • @stasbelka
    @stasbelka Рік тому

    Блин это конечно круто, но я пытался с шарпов перенести на плюсы но без успешно видимо я еще мало в программировании, буду у преподавателя спрашивать как это сделать, может на плюсах метод полегче есть

  • @TheLjubin
    @TheLjubin 2 роки тому +1

    А я делаю так...
    В файле Program.cs - точька входа в программу, добавляю экземпляр класса нужного "окна" прямо в метод - static void Main()
    и после этого главное окно проги и то которое добавил - "видят друг друга".
    namespace Gyro
    {
    static class Program
    {
    internal static Main main;
    internal static selectAnotherCOMport selectCOMport; //------------------------------ второе окно.
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    main = new Main();
    selectCOMport = new selectAnotherCOMport(); //------------------------------ второе окно.
    Application.Run(main);
    }
    }
    }
    Далее, например кликая по кнопке во втором окне, можно запустить метод в главном окне программы.
    private void btnOk_Click(object sender, EventArgs e)
    {
    this.Hide(); //Скрываем окно
    Program.main.viaUSB(); // Запускаем метод в основном окне программы.
    }
    Ну и у меня вопрос - Это вообще законно? )))

    • @XpucT
      @XpucT  2 роки тому

      Тоже интересно. Чуть ниже был ещё лайфхак, ещё короче =))

  • @pro100chok
    @pro100chok 2 роки тому +1

    Как раз искал решение, ахахах, просто мужик ты лучший!)

  • @agentsmit09
    @agentsmit09 Рік тому

    Я почему-то при такое передачи формы владельца привожу в object. Наверное мне просто не нравится что-то вроде Form1 и т.д. в типе параметра. Но это чисто вкусовщина

  • @user-mcm
    @user-mcm 2 роки тому +1

    Прикольно когда так херачил и был доволен 😌 хорошие видосы , отличная подача материала !

  • @PravdaGe
    @PravdaGe 2 роки тому +1

    Привет, ХрисТ Благодарю за ещё один полезный урок ,
    Скажи будут ли уроки на тему дизайна формы ТК в Русском Ютубе нет норманых уроков,
    И ещё скажи дизайн Win 10 Tweaker это (тема - skin ) или каждый элемент рисован отдельно , и очень интересно как ты сделал звук в форме .

    • @XpucT
      @XpucT  2 роки тому +3

      Привет 🖐
      Тема дизайна уже раскрыта на вкладке Сообщество для спонсоров.
      Дал даже готовый проект. Новый проект с готовыми скинами и их быстрым изменением на очереди ;)

  • @Official_Kelvin
    @Official_Kelvin Рік тому +1

    а как управлять сразу несколькими формами из одной формы🤔 я пытался добавить ещё нового овнера но не получается проект просто не компилируется

    • @XpucT
      @XpucT  Рік тому +1

      Абсолютно также. Будет работать также.

    • @Official_Kelvin
      @Official_Kelvin Рік тому

      ​@@XpucT Я вот сколько пробую не получиться, может я не првельно вопрос задал, у меня есть Forms1, и я хочу открыть Forms2, но я хочу изменить не Forms1 из Forms2, а Forms 2 из Forms1.

  • @prototyp3612
    @prototyp3612 Рік тому

    а как сделать так чтоб 2-я кнопка нажималась а не менялся его название т.е. текст

  • @Brometey
    @Brometey Рік тому +1

    Почему у меня все равно пишет, что недоступно из-за уровня защиты(

    • @XpucT
      @XpucT  Рік тому

      Пересмотрите видео. Фишка в модификаторе.

    • @Brometey
      @Brometey Рік тому +1

      @@XpucT укуси меня пчела, у вас батон в модификаторе публичный :)

  • @86werth
    @86werth Рік тому

    Финальная версия 9:30

  • @loger_1328
    @loger_1328 2 роки тому +1

    Топчик! :)

  • @HeyWhoTheFuckAreYou
    @HeyWhoTheFuckAreYou 2 роки тому +1

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

  • @justmax180
    @justmax180 2 роки тому +1

    Все интересно, но можно говорить чуть помедленнее и четче