Autor Beitrag
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 11.05.14 21:01 
Zitat:
Der Bereich wo Load und SaveObject ist geht der dann nur für das Anlegen eines Mitarbeiters aus den vorherigen Treats?


So hatte ich mir das gedacht ja. Aber das Konzept funktioniert natürlich für jedes Klasse die zu deinem Model gehört.
Es müsste dann eben eine Klasse von Controller<T> abgeleitet werden für die dann zu nutzende andere Klasse. Die Klassen sehen dann alle im Prinzip genauso aus wie EmployeeController.

Aber wenn ich so weit am Ziel vorbeigeschossen habe lass es uns anders versuchen.
Gib uns einen tieferen Blick auf das was du da hast und wir hier im Forum versuchen das dann in die richtige Richtung zu lenken um auch die PIN Abfrage da unter zu bringen.
Wenn wir deinen Code sehen fällt es uns leichter das passende Niveau zu treffen und nicht irgendwelche Sachen auch mit unterzubringen die dir vielleicht jetzt gerade nicht helfen.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 11.05.14 21:27 
Hi,
also eigentlich, dachte ich ich könnte einfach ein Form mit einer TextBox (UserControl) machen, die ich immer nach belieben entweder beim Öffnen eines Forms oder beim Drücken eines Buttons anzeigen lassen kann unabhängig von welchem Modul aus. Mitarbeiter oder später auch andere.

Und wenn die Abfrage des Pins mit der Datenbank erfolgreich ist wird das Form geöffnet oder die Funktion des Buttons ausgeführt.
Dachte dass könnte man ohne große Probleme mit der Kommunikation zwischen 2 Forms von TH69 so machen.
Daher basierte darauf auch die Grundfrage.

Viel Code in meinem Projekt außer dem hier im Forum mit Employee etc habe ich ja noch nicht.

Was genau brauchst du ? Das ganze Projekt?

Müsste gucken ob ich das hochladen kann da ich das KryptonToolkit drin habe für die Optik

Gruß
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 12.05.14 07:16 
Guten Morgen,
habe nun die ganze Nacht kaum geschlafen, weil mich das alles belastet.
Wäre nicht folgendes Vorgehen vielleicht schon ausreichend?!

1.) Eine Modellklasse bauen für die Pinabfrage, die sich selber prüft, ob Daten eingegeben wurden sind.
2.) Diese mit Databinding an ein UserControl binden
3.) Die TextBox beim Verlassen eine Methode mit SQL Abfrage aufrufen lassen, ob er es darf oder nicht und den Namen des Mitarbeiters einlesen
4.) True oder False zurück liefern lassen
5.) Dieses True oder False und den Namen müsste ich dann irgendwie in die Form bekommen, die die PiNAbfrage aufgerufen hat (EVENT!?)

Oder ist das wieder völlig daneben?

EDIT: Sorry bin auf Antworten statt auf Editieren. Wenn gewollt bitte zusammenlegen.

EDIT2:
Also mein versuch ging jetzt erstmal dahin das UserControl mit der Databinding der Modelklasse zu machen und ein Event zu feuern und zu behandeln. Aber leider funktioniert schon das nicht.

ausblenden C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Recycle.Logics
{
    public class AuthorizationEventArgs : EventArgs
    {
        public string PIN { get; set; }

        public event EventHandler<AuthorizationEventArgs> AuthorizationNeeded;

        private void OnAuthorizationNeeded(AuthorizationEventArgs eventArgs)
        {
            EventHandler<AuthorizationEventArgs> ev = AuthorizationNeeded;
            if (ev != null)
                ev(this, eventArgs);
        }  

        public bool IsValid
        {
            get
            {
                return !string.IsNullOrWhiteSpace(PIN);
            }
        }
    }
}


Im UserControl bisher
ausblenden volle Höhe C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Recycle.Logics;

namespace Recycle.Controls
{
    public partial class AuthorizationUserControl : UserControl
    {
        public AuthorizationUserControl()
        {
            InitializeComponent();
        }

        private void txtSecId_Leave(object sender, EventArgs e)
        {

        }

        private void AuthorizationUserControl_Load(object sender, EventArgs e)
        {
            bsPin.DataSource = new AuthorizationEventArgs();

            AuthorizationEventArgs auth = new AuthorizationEventArgs();
            auth.AuthorizationNeeded += AuthorizationNeeded;
        }

        private void AuthorizationNeeded(object sender, AuthorizationEventArgs e)
        {
            MessageBox.Show("Test");
        }
    }
}



Hatte eigentlich gehofft, dass beim Eingeben einer Pin die TestMessageBox erscheint. An der Stelle würde ich dann die PinAbfrage auf der Datenbank machen?!

EDIT3: Ich habe jetzt leider einen Termin, danach versuche ich es mal mit der INotifyPropertyChanged, die wir in der ConnectionOptions gemacht haben.
Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 12.05.14 09:57 
In deinem Code kann ich leider die Stelle nicht sehen wo der Event auch ausgeführt wird. Es ist auch eher ungewöhnlich den Event von den EventArgs aus zu verwalten. Wer sollte wie OnAuthorizationNeeded aufrufen? Die ist ja nebenbei auch noch privat. In der Form ist das ein Sackgasse. Die Klasse wo der Code zum speichern/laden drin steckt und die du von der Form aus aufrufen willst sollte Herr des Events sein und denn auch aufrufen können.

Zitat:
Oder ist das wieder völlig daneben?


Weiß nicht. Ich habs nicht verstanden ;) Für ein einzelnes Element (die PIN) würde ich aber eher nicht eine eigene Model Klasse basteln. Die Eingabe kommt mir jetzt auch nicht so komplex vor das eine solche Klasse zum Databinding besonders hilfreich wäre. Mach dir einfach ein Form auf der du die PIN eingeben kannst. Dann gibt der Form eine Property über die man später von wo anders die PIN aus der Form auslesen kann oder wenn du die PIN gleich von der PIN Eingabe Form aus prüfen willst dann gib der Form eine boolsche Property die zurückgibt on die PIN gültig ist oder nicht.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 13.05.14 12:06 
Hi,
also so wollte ich es eigentlich zu Beginn machen, dachte aber es sei zu "unprofessionell" mit den Properties in der Form.
Nun gut ich habe mich jetzt mal damit auseinder gesetzt und auch ein ganzes Stück weiter gekommen. Leider fehlt noch eine Kleinigkeit.
(Try und Catch habe ich auch noch nicht flächendeckend erfasst, wollte erst mal dass es läuft)

In der HauptForm in der Menüleiste ruft Beispielsweise jemand Mitarbeiterverwaltung auf, welche bei mir die ID des Rechtes 5 hat.
Diese übergebe ich an die Zertifizierungsform und prüfe dort anhand eines SQL Strings, ob die eingegebene SecurityID dieses Recht ausführen darf.
Entsprechend werden die Properties gefüllt, welche ich dann in der Hauptform zur Verfügung hätte.

Nun möchte ich diesen ausgelesenen Mitarbeitername an die aufzurufende Form übergeben (aus Lernzwecken nicht mit einer Property) damit, wenn dieser in der neuen Form etwas tut sein Name in der Historie steht. Die Mitarbeiterverwaltung ist ein Form mit einem UserControl drauf welches den Speicherbutton hat. Dort soll der Name nutzbar sein.


Code für den Aufruf aus der MainForm
ausblenden volle Höhe C#-Quelltext
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:
        private void tsmMitarbeiterAnlegen_Click(object sender, EventArgs e)
        {
            //Prüft, ob lt. Optionen eine Zertifizierung vorgenommen werden soll
            if (MySqlSettings.GetOptionString(connStr, 2) == "Ja")
            {
                //ruf Zertifizeriungsform auf und übergibt das zu prüfende Recht an den Konstruktor
                Zertifizierung myAuth = new Zertifizierung(5);
                myAuth.ShowDialog();

                //Wenn das Fenster geschlossen wird prüfen, ob Auth erfolgreich
                if (myAuth.DialogResult == DialogResult.OK)
                {
                    //Wenn erfolgreich, dann Mitarbeiterverwaltung aufrufen
                    if (myAuth.Authorized == true)
                    {
                        Mitarbeiterverwaltung myEmployee = new Mitarbeiterverwaltung();
                        myEmployee.Show();

                        //Event feiern, welches im UserControl der  Mitarbeiterverwaltung behandelt werden soll
                        OnSendAuthentication(new AuthenticationEventArgs(myAuth.Employee));
                    }
                    else
                    {
                        MsgAusgabe.ShowError("Sie sind nicht berechtigt dieses Modul zu nutzen!");
                    }
                }
            }
                //Falls keine Zertifizierung stattfinden soll einfach anzeigen
            else
            {
                Mitarbeiterverwaltung myEmployee = new Mitarbeiterverwaltung();
                myEmployee.Show();
            }
        }


Code zum feuern des Events, welches in dem UserControl der Mitarbeiterverwaltung behandelt werden soll
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
        #region EventAuthentication
        public class AuthenticationEventArgs : EventArgs
        {
            public AuthenticationEventArgs(string text)
            {
                Text = text;
            }

            public string Text { get; set; }
        }

        public event EventHandler<AuthenticationEventArgs> SendAuthentication;

        protected virtual void OnSendAuthentication(AuthenticationEventArgs e)
        {
            EventHandler<AuthenticationEventArgs> ev = SendAuthentication;
            if (ev != null)
                ev(this, e);
        }
        #endregion


Code der Form Zertifizierung zum füllen der Propertys

ausblenden volle Höhe C#-Quelltext
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:
namespace Recycle.Dialogs
{
    public partial class Zertifizierung : KryptonForm
    {
        private static long modul;

        public string Employee { get; set; }
        public bool Authorized { get; set; }

        public Zertifizierung(Int64 id)
        {
            InitializeComponent();
            modul = id;
            Authorized = false;
            Employee = null;
        }

        private void txtSecId_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return)
            {
                btnWeiter.PerformClick();
            }
        }

        private void btnWeiter_Click(object sender, EventArgs e)
        {
            if (txtSecId.Text != string.Empty)
            {
                Employee = EmployeeMethods.GetEmployeeNameFromSecId(Convert.ToInt64(txtSecId.Text));

                if (AuthorizationMethods.GetAuthorization(Convert.ToInt64(txtSecId.Text), modul) == 1)
                {
                    Authorized = true;                
                }
                else
                {
                    Authorized = false;                
                }
            }
            else
            {
                MsgAusgabe.ShowError("Bitte erfassen Sie eine SecurityID!");
            }
        }
    }
}


Prüfung, ob der Mitarbeiter dies darf

ausblenden C#-Quelltext
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:
    public class AuthorizationMethods
    {
        private static string connStr = DbInfo.GetMySqlConnStr();
        private static string strSql = string.Empty;

        public static int GetAuthorization(long secId, long modul)
        {
            int rueckgabe = 0;
            strSql = "Select count(b.berechtigungmodulid) from mitarbeiter m inner join berechtigungmodulgruppe b " +
                     "on m.berechtigunggruppeid = b.berechtigunggruppeid where m.secid = ?secid and b.berechtigungmodulid = ?berechtigungmodulid";
            using (MySqlConnection conn = new MySqlConnection (connStr))
            {
                using (MySqlCommand cmd = new MySqlCommand (strSql, conn))
                {
                    conn.Open();

                    cmd.Parameters.AddWithValue("?secid", secId);
                    cmd.Parameters.AddWithValue("?berechtigungmodulid", modul);

                    rueckgabe = Convert.ToInt16(cmd.ExecuteScalar());

                    conn.Close();
                }
            }

            return rueckgabe;
        }
    }


Und hier komme ich jetzt nicht weiter, da ich nicht weiß wie ich mein UserControl umbauen müsste, damit es das Event behandelt!?
Ich hatte überlegt, ob ich dann in dem UserControl eine Referenz auf die MainForm setzen muss?!
Wenn der Gedanke ok ist, würde ich leider nicht wissen wie ich die beim Aufruf der Mitarbeiterverwaltung nicht an das Form sondern die UserControl weiter gebe und wie ich es dann abonniere.


Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 13.05.14 12:23 
Zitat:
Und hier komme ich jetzt nicht weiter, da ich nicht weiß wie ich mein UserControl umbauen müsste, damit es das Event behandelt!?


Was sollte den dieses Event tun? Ich vermute mal so wie es jetzt gelöst ist der Event unnötig geworden ist. Da du die Authorizierung vorher gemacht hast solltest du eigentlich alles was dort benötigt wird einfach in das UserControl reinschieben können (per Properties, Methoden oder wie auch immer). Also übergibt den Employee einfach an die Mitarbeiterverwaltung Form die das dann wiederum an das UserControl weiterreicht. Ich persönlich würde vermutlich die Show Methode überladen weil es sich dann einfach so sinnig im Code liest was da passiert myEmployee.Show(myAuth.Employee);.

Für diesen Beitrag haben gedankt: Talemantros
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 13.05.14 13:38 
Ok, dann würde ich das so lösen mit der ShowMethode und der Überladung.

Nur mal so als Lernzweck.
Ich habe bereits verstanden, wie ich in der MainForm ein Event behandel, welches in der SubForm ausgelöst wurde.
Aus meiner Sicht wäre es bei mir andersrum?

Wie würde es den grundsätzlich funktionieren, wenn das MainForm ein Event auslöst und die Subform es behandeln soll!?

Edit: also die ShowMethode habe ich irgendwie nicht richtig überladen bekommen, da ich den Fehler nicht verstanden habe :-(
Habe es nun so gemacht!

ausblenden C#-Quelltext
1:
2:
Mitarbeiterverwaltung myEmployee = new Mitarbeiterverwaltung(myAuth.Employee);
myEmployee.Show();

und habe den Konstruktor überladen!

Danke
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 13.05.14 14:00 
Hallo,

vom Prinzip her natürlich genauso ;-)

Ich frage mich nur, ob es bei dir wirklich so gedacht ist, daß du das Mitarbeiterverwaltung-Form(ular) nicht-modal (also per Show, anstatt per ShowDialog) aufrufen möchtest? Denn dann kann man ja verschiedenene dieser Forms gleichzeitig auf haben (und sogar mit unterschiedlicher Authentifizierung!) - denn das Main-Form ist ja dann weiterhin bedienbar?

Genau darauf gehe ich ja auch in meinem Artikel ein, d.h. Ereignisse (events) benötigt man entweder bei nicht-modalen Forms oder bei einer modalen-Form, welche währenddessen Infos an die aufrufende (oder irgendeine andere) Form weitergibt. Ansonsten kann man immer direkt vor dem Aufruf einer modalen Form bzw. nach dem Schließen die Werte direkt per Eigenschaften und/oder Methoden übergeben.

Für diesen Beitrag haben gedankt: Talemantros
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 13.05.14 19:26 
Hi,
danke

Mit den Events muss ich mir dann noch mal anschauen. War der Meinung habe nur die in die eine "Richtung" gesehen.

Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 13.05.14 19:31 
Zitat:
Wie würde es den grundsätzlich funktionieren, wenn das MainForm ein Event auslöst und die Subform es behandeln soll!?


Das würde man normalerweise nicht tun. Insofern stellt sich die Frage nicht wirklich ;)

Der Event ist in diesem Context normalerweise für Rückmeldungen gedacht. Zum Beispiel die Subform muß was an die Mainform melden. Um eine sauber Abhängigkeitsbeziehung zu haben, die in Zukunft nicht zu Problemen führt, kennt einer den anderen aber nicht umgekehrt. Beziehung möglichst immer nur oneway. Hier wird die Mainform die Subform kennen aber eben nicht umgekehrt.
Wenn aber trotzdem die Subform was an die Mainform melden soll hilft ein Event da der von der Mainform verdrahtet wird. Die Mainform registriert also den Event der Subform kann damit Dinge von der Subform empfangen aber die Subform kennt weiterhin nicht die Mainform und die Klassenbeziehungen zwischen den beiden bleiben sauber.
Im umgekehrten Fall für die Kommunikation von der Mainform zur Subform bedarf es keines Events. Die Mainform kennt ja die Subform und kann Dinge die an die Subform übergeben werden einfach dahinschieben.

Für diesen Beitrag haben gedankt: Talemantros
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 14.05.14 07:33 
Danke und schönen Tag noch

Gruß