Eventy i delegaty winforms zmiana tekstu

0

Siema mam problem ze zdarzeniami i delegatami, chcę zrobić coś takiego, że po jakiejś zmianie w bazie danych(taka imitacja z właściwością) w głównym formularzu(subkrybent) w stopce będzie informacja co ostatnio zrobiono np: "Dodano pracownika" tylko nie wiem jak zasubskrybować
Klasa publikatora

public delegate void DbOperationHandler(string text);
public partial class EmployeesForm : BaseForm
    {
        public event DbOperationHandler SendInfo;
        Pracownicy model = new Pracownicy();
        public EmployeesForm()
        {
            InitializeComponent();
        }
        private string dboperation = "Nic nie zrobiono";
        public string Dboperation
        {
            get
            {
                return dboperation;
            }
            set
            {
                bool change = dboperation != value;
                if (change) SendInfo?.Invoke(value);
            }
        }
        private void EmployeesForm_Load(object sender, EventArgs e)
        {
            LoadData();  

        }

        private void addEmployeeButton_Click(object sender, EventArgs e)
        {
            model.Imie = formPrimaryDataEmployee.NameUserControl;
            model.Nazwisko = formPrimaryDataEmployee.SurnameUserControl;
            model.Pesel = formPrimaryDataEmployee.PeselUserControl;
            model.NrTel = formPrimaryDataEmployee.PhoneUserControl;
            model.Wyplata = decimal.Parse(paymentEmployeeFormTextBox.Text);
            model.Stanowisko = positionEmployeeFormTextBox.Text;
            if (ValidateChildren(ValidationConstraints.Enabled))
            {
                using (SzpitalEntities db = new SzpitalEntities())
                {
                    db.Pracownicies.Add(model);
                    MessageBox.Show("Dodano do bazy");
                    dboperation = $"Dodano pracownika: {model.Imie}";
                    db.SaveChanges();
                    
                }
                LoadData();
                Clear();
            }
        }
}

Klasa subskrybenta

public partial class MainForm : BaseForm
    {
        List<Form> openedForm = new List<Form>();
        EmployeesForm ef = new EmployeesForm();
       
        public MainForm()
        {
            InitializeComponent();
        }

        private void openChildForm(Form form)
        {
            form.TopLevel = false;
            form.Parent = this;
            form.FormBorderStyle = FormBorderStyle.None;
            form.Dock = DockStyle.Fill;
            form.BringToFront();
            form.Show();
        }

        private void homeMainMenuButton_Click(object sender, EventArgs e)
        {
            foreach (Form form in openedForm)
            {
                form.Dispose();
            }
        }
        private void MainForm_Load(object sender, EventArgs e)
        {
            ef.SendInfo += DbOperationInfo;
        }

        private void DbOperationInfo(string text)
        {
            dbOperationInfoValue.Text = text;
        }
    }
0

Ale chodzi ci o to że coś w kodzie powyżej nie działa, czy że chcesz coś dorobić?

0

Jeżeli dobrze rozumuję to teraz w oknie głównym w 'dbOperationInfoValue.Text' masz wyświetlane tylko ostatnio wprowadzona wartość 'Dboperation'. Jeżeli potrzebujesz więcej informacji, np.jaki konkretnie obiekt, jaka właściwość się zmieniła z jakiej wartości na jaką to potrzebujesz zdefiniować jakies 'EventArgs' i w nim przenosić te dodatkowe informacje.

Tu jest to opisane na przykładzie zmian współrzędnych punktu.
Zdarzenia

0

Chodzi o to, że w dbOperationInfoValue.txt nic nie ma czyli nie działa , potrzebuję tylko wartości Dboperation po tym jak się zmieni ta wartości czyli np. gdy dodam rekord do bazy ma zadziałać te zdarzenie i ma przesłać wartość do głównego formularza i wyświetlić to właśnie w dbOperationInfoValue.txt.

0

a czy przypadkiem nie chodzi o to ze:

using (SzpitalEntities db = new SzpitalEntities())
                {
                    db.Pracownicies.Add(model);
                    MessageBox.Show("Dodano do bazy");
                    dboperation = $"Dodano pracownika: {model.Imie}";
                    db.SaveChanges();

                }

powinienes ustawiac wlasciwosc "Dboperation" a Ty ustawiasz pole "dboperation", ustawiajac pole omijasz settera i nie odpala Ci sie zdarzenie.

0

@Varran: Zmieniłem sprawdziłem i nadal nic.

0

sprawdz czy pod zdarzenie "Load" masz podpieta metode "MainForm_Load", ewentualnie na probe przenies to:

ef.SendInfo += DbOperationInfo;

do konstruktora za "InitializeComponent();".

i sprawdz.

0

@Varran: Mam podpięte i w konstruktorze tak samo nie działa. Dodam, że sama wartość dboperation się zmienia po dodaniu bo sprawdziłem.

0

W takim razie podglądają w debugerze wartość "SendInfo", jeżeli nie działa tzn że nadal jest nnull'em . Cudów nie ma. Skopiowałem Twój kod, wyciąłem wszystko co operowalo na bazie i modelu i "u mnie działa" ;)

0

@Varran: No jest nullem cały czas, ale to ciekawe, że u ciebie działa a u mnie nie :D i tak dzięki za pomoc będę próbował dalej.

0

Może jeszcze w ińnym miejscu tworzysz to EmpleyeesForm, i wtedy w jednym miejscu rejestrujesz subskrybentów a w drugim nadpisujesz obiekt nowym czystym obiektem.. Co robisz z openedForm i gdzie ładujesz do niego utworzone okna?

1 użytkowników online, w tym zalogowanych: 0, gości: 1