Laden...

Events und Delegates

Erstellt von LangWind vor einem Jahr Letzter Beitrag vor einem Jahr 617 Views
L
LangWind Themenstarter:in
6 Beiträge seit 2022
vor einem Jahr
Events und Delegates

Hallo zusammen.

Ich Arbeite an einem Project was Pdf's ausliest und die benötigten Textfelder in der Pdf extrahiert und in eine Karteikarte schrieb und mittels Api an Trello Postet bis hier hin keine Problem.

Nur habe ich jetzt das Problem das ich den in UserControl (UC_Upload_Anmeldung) weiterleiten möchte und das mir der Text mittels Event unmittelbar nach dem Post in die Textbox geschrieben und angezeigt wird.

string ausgane = $"{Name} + {Desc} + {CardId}";

Ich bitte um Hilfe da ich keine Lösung für mein Problem finde uns am verzweifeln bin 😭
Wenn es eine Anfängerfreundliche Anleitung gibt würde ich mich auf einen verweis freuen!

Das ist mein aktueller versuch funktioniert aktuell aber nur in Verbindung mit einem klick auf
den Button

        private void btnOrderCard_Click(object sender, EventArgs e)
        {
            Uc_Upload uc_Upload = new Uc_Upload();
            Upload_Panel.Controls.Clear();
            Upload_Panel.Controls.Add(uc_Upload);
        }

Der das Uc_Upload quasi erneut öffnet


 public ApiRequest(string name, string label, string desc, string date, string patientNumber, int parm)
        {
            Name = name;
            Label = label;
            Desc = desc;
            Date = date;
            PatientNumber = patientNumber;
            Parm = parm;
        }
        public async void PostCard()
        {
            JsonData jsonRead = new JsonData("config.json");
            switch (Parm)
            {
                case 0:
                    IdList = jsonRead.ConfigReader().IdListAnmeldung;
                    ArchivPath = "Anmeldung.txt";
                    break;
                case 1:
                    IdList = jsonRead.ConfigReader().IdListVoranmeldung;
                    ArchivPath = "Voranmeldung.txt";
                    break;
            }
            try
            {
                TelloJsonSetData newPost = new TelloJsonSetData();
                newPost.name = Name + " : " + PatientNumber;
                newPost.desc = Desc;
                newPost.due = Date;
                newPost.labels = Label;
                newPost.idList = IdList;
                newPost.idBoard = jsonRead.ConfigReader().IdBoard;
                newPost.token = jsonRead.ConfigReader().Token;
                newPost.key = jsonRead.ConfigReader().ApiKey;

                var json = JsonConvert.SerializeObject(newPost);
                var jsondata = new StringContent(json, Encoding.UTF8, "application/json");
                var url = "https://api.trello.com/1/cards?";
                HttpClient client = new HttpClient();
                var result = client.PostAsync(url, jsondata).Result.Content.ReadAsStringAsync().Result;

                var jo = JObject.Parse(result);
                CardId = jo["id"].ToString();

                string ausgane = $"{Name} + {Desc} + {CardId}";

                PostPdf(CardId);
                return;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


    public partial class UC_Upload_Anmeldung : UserControl
    {
        public UC_Upload_Anmeldung()
        {
            InitializeComponent();
            filllist("Anmeldung.txt");
        }
        public void filllist(string path)
        {
            TextSave TS = new TextSave();
            BetterList<string> list = new BetterList<string>();
            list.Added += tbAnmeldung_TextChanged;
            list.Add(TS.txtlesen(path));
        }

        private void tbAnmeldung_TextChanged(object sender, AddedEvendArgs e)
        {
            tbAnmeldung.Text = e.AddedItem.ToString();
        }
    }
    delegate void AddedEventHandler(object sender, AddedEvendArgs e);
    class BetterList<T> : List<T>
    {
        public new void Add(T item)
        {
            base.Add(item);
            OnAdded(item);
        }
        public event AddedEventHandler Added;
        private void OnAdded(T item)
        {
            if (Added != null)
            {
                Added(this, new AddedEvendArgs(item));
            }
        }
    }
    class AddedEvendArgs : EventArgs
    {
        public object AddedItem { get; set; }
        public AddedEvendArgs(object sender)
        {
            AddedItem = sender;
        }
    }

T
50 Beiträge seit 2010
vor einem Jahr

Wie soll denn die Methode PostCard aufgerufen werden? Soll das durch eine manuelle Aktion gestartet werden oder irgendwie automatisch passieren?

Die Frage ist, ob hier ein Event überhaupt notwendig ist. Dein UserControl könnte eine Methode habe, wo der darzustellende Text von außen übergeben werden kann. Sehr wahrscheinlich wird Dein Fenster die Kontrolle über Deine Klasse ApiRequest haben, da dort die Instanz erzeugt wird und somit auch Kontrolle über die die Methode PostCard. Passe die Methode an, sodass sie Deinen erstellter String als Rückgabewert liefert. Wenn Du Dir dann noch die im Fenster dargestellten UserControls merkst, kannst Du den Rückgabewert der Methode des Controls übergeben.

Ach ja, schau Dir mal das Konzept von async und await an. Verwende await statt .Result. Async-Methoden sollten darüber hinaus immer einen Task als Rückgabewert liefern - bis auf Events.

Vermeide MessageBox-Aufrufe in der Logik. Die Aufrufe sollten immer nah an der Oberfläche sein bzw. da wo eine Aktion gestartet wird, also z.B. in einem abonnierten Event. Wird so eine Methode von einem Dienst verwendet, hast Du ein Problem.

F
10.010 Beiträge seit 2004
vor einem Jahr

Vollkommen falsche Herangehensweise.
[Artikel] Drei-Schichten-Architektur
Ein UserControl ist zur Anzeige von Daten in einem bestimmten Format gedacht.
Deine Businesslogic hat da nichts drin verloren.
Trenne Daten von den Controls, erstelle Services für die Verarbeitung und benutze DataBinding und beschäftige dich mit den Grundlagen von Async/Await,
denn das was Du da in ApiRequest machst ist die falsche herangehensweise.