Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

RJ45

C# Windows Forms взаимодействие

Препоръчан отговор


Здравейте. Направил съм си две форми(ще ги кръстя Form1 и Form2). В първата(Form1) имам TableLayoutPanel, в който си нареждам label-и. От Form1 извиквам Form2, в която попълвам някакви данни и в зависимост от тези данни, се променят label-ите във Form1. Искам по някакъв начин, когато затворя Form2, директно да ми се прерисува всичко във Form1, без да трябва да спирам и да пускам наново програмата(данните от Form2 се пазят във файл). Някакви идеи? Пробвах с Refresh(), но не става. Мога да си го направя с бутон, но не ми харесва така с тоя бутон, предпочитам да го оставя за краен случай. Направих го при смяна на формите да ги затварям и да ги пускам наново, но и така не ми харесва. Искам автоматично да се прерисува. Мога ли по някакъв начин при затваряне на Form2 да пусна някоя функция от Form1? Или пък по някакъв друг начин?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте. Направил съм си две форми(ще ги кръстя Form1 и Form2). В първата(Form1) имам TableLayoutPanel, в който си нареждам label-и. От Form1 извиквам Form2, в която попълвам някакви данни и в зависимост от тези данни, се променят label-ите във Form1. Искам по някакъв начин, когато затворя Form2, директно да ми се прерисува всичко във Form1, без да трябва да спирам и да пускам наново програмата(данните от Form2 се пазят във файл). Някакви идеи? Пробвах с Refresh(), но не става. Мога да си го направя с бутон, но не ми харесва така с тоя бутон, предпочитам да го оставя за краен случай. Направих го при смяна на формите да ги затварям и да ги пускам наново, но и така не ми харесва. Искам автоматично да се прерисува. Мога ли по някакъв начин при затваряне на Form2 да пусна някоя функция от Form1? Или пък по някакъв друг начин?

Гледам, че въпросчето е старичко, но, за да насърчаваме форума, ще постна отговор :)

Form2 може да се стартира ShowDialog() - като диалог (модално) или Show().

Стартирането като диалог е синхронно (блокиращо) и, докато се изпълнява - само тази форма е активна (не може да се активира Form1)

Sлед затваряне на Form2 програмата във Form1 продължава със следващия оператор след този, с който е показана Form1, например:

blablaba..Form2.ShowModal()--> след като завърши Form2 се връщаме точно тук

И "точно там :)" може да изчетем визуалните елементи от Form2 и да ги отразим в визуалните елементи на Form1 и да обновим Form1.Refresh().

 

Втория вариант: да изпълним Form2.Show() е асинхронен, неблокиращ - потребителят може да щтрака и да активира коя и да е от двете форми.

В тоя случей трябва да обработим бутона OK на втората форма (той я затваря с положителен отговор) и Form1 да разбере, че Form2 е затворена - че сме завършили работата с Form2.

Има разни начини Form1 да се усети :), че Form2 е завършила.

Някои разбирачи слагат таймер, който следи някоя променлива в Form2 - дървено, но разбираемо.

Хубавият начин е да се сложи делегат, който да се вика като CallBack при затваряне на Form2.

Както и да е - въпрос на въображение.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Публикувано изображение Благодаря за отговора. Аз отдавна се оправих, но все пак може да е полезно за някой друг. Аз го направих с custom event. Направих следният клас, който следи какви действия са извършени в различните форми(при мен лично следи дали някой се е логнал и дали са променяни данни):

 public class CloseFormEvent : EventArgs    {        public bool CloseForm { get; set; }        public bool EditedData { get; set; }        public bool IsLogged { get; set; }        public string LoggedUser { get; set; }        public string AccessToken { get; set; }    }
След това в кода на всяка форма имам event handler от този клас и функция, която при затваряне "съобщава" на Main формата, дали са променяни данни:

 public event EventHandler<CloseFormEvent> formClosed;        protected virtual void onFormClosed(CloseFormEvent e)        {            if (formClosed != null)                formClosed(this, e);        }
 Там където променям данни си създавам един обект и го пускам като аргумент на функцията, която "съобщава" на Main формата какво се е случило:

  CloseFormEvent s = new CloseFormEvent();                s.CloseForm = true;                s.EditedData = true;                onFormClosed(s);                Close(); 
Ето какво имам и в Main формата:

 

  private void formClosed(object sender, CloseFormEvent e)        {            if (e != null)            {                if (e.CloseForm != false)                    this.Enabled = e.CloseForm;                if (e.EditedData != false)                {                    draw_TableLayoutPanel(0);                    Initialize_General_Info();                    Load_Users_File();                    Load_Reservations_File();                }                if (e.IsLogged)                {                    isLogged = e.IsLogged;                    loggedUser = e.LoggedUser;                    accessToken = e.AccessToken;                    UserLogin();                }            }        }
В зависимост от това какво се е случвало, сменям съответните променливи и "прерисувам" различните части от формата и/или зареждам наново файловете, с които работя.

П.П.1: Не знам дали е добре да се прави така в професионалните програми, защото ми се струва, че се нарушава капсулацията. На мен това ми трябваше за курсова работа, така че ми върши работа.

 

П.П.2: Не го обясних много добре май, ама ако на някой му трябва нещо подобно, може да търси в гугъл, как се правят custom event-и.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

×
×
  • Добави ново...