Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

C-Sharp - Backgroundworker - Rückgabe - Verständnis

Frage Entwicklung C und C++

Mitglied: TheVo1d

TheVo1d (Level 1) - Jetzt verbinden

06.12.2017 um 18:11 Uhr, 159 Aufrufe, 3 Kommentare

Hallo zusammen

Ich arbeite an einer grösseren Applikation welche an einer bestimmten Stelle, eine zweite Form öffnet in der ein Progressbar & ein Backgroundworker untergebracht sind.
In dem Backgroundworker läuft ein grosser Code Brocken in der Zwischenzeit zählt der Progressbar immer mit. Soweit so okay! Dies funktioniert nun alles.
Dieser Backgroundworker sollte allerdings einen Data Table zurückgeben den ich daraufhin auch noch in die erste / Main form zurück geben will.
Zu diesem Thema lassen sich einige Beiträge im Internet finden und ich habe mich heute auch gut damit eingedeckt. Jedoch klappte keiner der Lösungsvorschläge.
Dies muss aber nicht unbedingt an den Lösungen liegen, ich selber bin auch noch nicht so erfahren und deshalb fehlt mir auch oft die benötigte Auffassungsgabe um
die Ansätze zu verstehen.

Mein Problem:
Ich bin Ratlos wie ich mein Table zurück geben kann, nachdem der Backgroundworker durchgelaufen ist.
Dazu müsste ich dies möglichst verständlich erklärt bekommen, da ich wie gesagt noch nicht so lange im business bin.

Frage:
Wie exportiere ich mein Data Table aus dem Backgroundworker?

Code:
Ich öffne die zweite Form mit einem "Form.ShowDialog();". Hierbei sind die Tables im "new Form event" die Tabellen die ich mitgebe.
01.
frm_WorkInProgress frmWIP = new frm_WorkInProgress(tblFilter, lstTables[2], lstTables[1]); 
02.
frmWIP.ShowDialog();
Dies ist der Ganze Code der zweiten form, bzw der Form mit dem Backgroundworker:
01.
//  Loading Components 
02.
using System; 
03.
using System.Collections.Generic; 
04.
using System.ComponentModel; 
05.
using System.Data; 
06.
using System.Drawing; 
07.
using System.Linq; 
08.
using System.Text; 
09.
using System.Threading.Tasks; 
10.
using System.Windows.Forms; 
11.
 
12.
//  Namespace for the failed CI's form - Validator_Reloaded 
13.
namespace Validator_Reloaded 
14.
15.
    public partial class frm_WorkInProgress : Form 
16.
17.
        //  Define the tables that get importet 
18.
        DataTable tblCIs; 
19.
        DataTable tblCIService; 
20.
        DataTable tblServiceLists; 
21.
 
22.
        //  Work in progress: Class 
23.
        public frm_WorkInProgress(DataTable tblCIs, DataTable tblCIService, DataTable tblServiceLists) 
24.
25.
            InitializeComponent(); 
26.
 
27.
            //  set the new createt tables to the same tables 
28.
            this.tblCIs = tblCIs; 
29.
            this.tblCIService = tblCIService; 
30.
            this.tblServiceLists = tblServiceLists; 
31.
32.
 
33.
        //  define a new variable for the finished percent 
34.
        int percentFinished = 0; 
35.
 
36.
        //  define datatables 
37.
        DataTable tblCont = new DataTable(); 
38.
        DataTable tblServices = new DataTable(); 
39.
        DataTable tblFailedCIs = new DataTable(); 
40.
 
41.
        //  Create Dataviews 
42.
        DataView dvFailedCIs = new DataView(); 
43.
        DataView dvCIService; 
44.
        DataView dvServiceList; 
45.
 
46.
        //  Create new Lists 
47.
        List<List<string>> lstCIs = new List<List<string>>(); 
48.
        List<string> lstFailedCIs = new List<string>(); 
49.
        List<string> lstCIServices = new List<string>(); 
50.
        List<string> lstServices = new List<string>(); 
51.
        List<string> lstContent = new List<string>(); 
52.
 
53.
        //  Create a new Array 
54.
        int[] arrColumnNr = { 0, 7, 9 }; 
55.
 
56.
        //  Load event 
57.
        private void _03_Validator_Progress_Load(object sender, EventArgs e) 
58.
59.
            // fill the the dataviews with the table CI's & tbl Service Lists 
60.
            dvCIService = new DataView(tblCIs); 
61.
            dvServiceList = new DataView(tblServiceLists); 
62.
 
63.
            //  foreach row in the CI table 
64.
            foreach (DataRow row in tblCIs.Rows) 
65.
66.
                //  set the lstContent as a new list 
67.
                lstContent = new List<string>(); 
68.
 
69.
                //  foreach integer in the Column Array 
70.
                foreach (int i in arrColumnNr) 
71.
72.
                    //  add a new row to the lstContent 
73.
                    lstContent.Add(row[i].ToString()); 
74.
75.
 
76.
                //  add the list to the CI - list 
77.
                lstCIs.Add(lstContent); 
78.
79.
 
80.
            //  define the maximum from the pgbFortschritt - progressbar | as the lstCIs Count 
81.
            progressBar1.Maximum = lstCIs.Count; 
82.
 
83.
            System.Windows.Forms.Application.DoEvents(); 
84.
 
85.
            //  Start the Backkground Worker 
86.
            worker.RunWorkerAsync(progressBar1.Value); 
87.
88.
 
89.
        //  the Do Work event for the worker 
90.
        void worker_DoWork(object sender, DoWorkEventArgs e) 
91.
92.
            //  foreach list in list CIs 
93.
            foreach (List<string> list in lstCIs) 
94.
95.
                //  Search the table for the current CI 
96.
                dvCIService.RowFilter = "CI Like '" + list[0] + "'"; 
97.
 
98.
                //  add the Dataview to a table 
99.
                tblCont = dvCIService.ToTable(); 
100.
 
101.
                //  get a table with the Servicelist CIs 
102.
                dvServiceList.RowFilter = String.Format("convert(Customer, 'System.String') Like '" + list[1].ToString() + "' AND convert(Model, 'System.String') Like '" + list[2].ToString() + "'"); 
103.
                tblServices = dvServiceList.ToTable(); 
104.
 
105.
                //  Set the two lists as new string Lists 
106.
                lstCIServices = new List<string>(); 
107.
                lstServices = new List<string>(); 
108.
 
109.
                //foreach row in in the table Content 
110.
                foreach (DataRow row in tblCont.Rows) 
111.
112.
                    //  add the first item in the current row to the list CIServices 
113.
                    lstCIServices.Add(row[1].ToString()); 
114.
115.
 
116.
                //  foreach row in the table Services 
117.
                foreach (DataRow row in tblServices.Rows) 
118.
119.
                    //  add the 3rd item in the row to the List 
120.
                    lstServices.Add(row[3].ToString()); 
121.
122.
 
123.
                //  If the lenght from the List CIServices not equal the Services List lenght 
124.
                if (lstCIServices.Count != lstServices.Count) 
125.
126.
                    //  Add the CI to the failed CI list 
127.
                    lstFailedCIs.Add(list[0]); 
128.
129.
                else 
130.
131.
                    //  Check if the lists arent equal  
132.
                    var a = lstCIServices.All(lstServices.Contains); 
133.
 
134.
                    if (a == false) 
135.
136.
                        //  if it isn't equal ad dit to the Failed CI list 
137.
                        lstFailedCIs.Add(list[0]); 
138.
139.
140.
 
141.
                //  Add another point to the progressbar 
142.
                percentFinished++; 
143.
                worker.ReportProgress(percentFinished); 
144.
145.
 
146.
            //  Update the label with bonus information 
147.
            lblAnzeige.Text = "Fertig stellen..."; 
148.
             
149.
            //  set the dvFailedCIs as New DataView 
150.
            dvFailedCIs = new DataView(tblCIs); 
151.
 
152.
            //  Make Sure the string is empty 
153.
            string strCMD = ""; 
154.
 
155.
            //  Check if the list with the failed CI's isn't 0 
156.
            if (lstFailedCIs.Count >= 1) 
157.
158.
                //  Create a filter string for a Dataview rowfilter. 
159.
                strCMD = strCMD + "(CI IN ('" + lstFailedCIs[0] + "' "; 
160.
 
161.
                //  add each item in the Failed CIs list into the strCMD 
162.
                foreach(string i in lstFailedCIs) 
163.
164.
                    strCMD = strCMD + ", '" + i + "'"; 
165.
166.
                strCMD = strCMD + "))"; 
167.
168.
            else 
169.
170.
                //  else add 2 Points to the progressbar 
171.
                percentFinished = percentFinished + 2; 
172.
173.
 
174.
            //  generate a datatable with the wrong CI string 
175.
            dvFailedCIs.RowFilter = strCMD; 
176.
            tblFailedCIs = dvFailedCIs.ToTable(); 
177.
 
178.
            e.Result = tblFailedCIs; 
179.
180.
 
181.
        //  Update event for the worker 
182.
        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
183.
184.
            progressBar1.Value = e.ProgressPercentage; 
185.
            lblAnzeige.Text = percentFinished.ToString() + " / " + lstCIs.Count.ToString(); 
186.
187.
 
188.
        // Completet Event for Worker 
189.
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
190.
191.
            DataTable tblTest = (DataTable)e.Result; 
192.
 
193.
            lblAnzeige.Text = "Completed!"; 
194.
            button1.Enabled = true; 
195.
196.
        //  Klick event for the button 
197.
        private void btn_Okay_Click(object sender, EventArgs e) 
198.
199.
            this.Close(); 
200.
201.
    }
Mitglied: emeriks
LÖSUNG 06.12.2017 um 21:47 Uhr
Hi,
Wie exportiere ich mein Data Table aus dem Backgroundworker?
Gar nicht. Du musst diese nur außerhalb der Subroutine deklarieren (in der Form oder global). Dann kommst Du auch von überall ran.

E.
Bitte warten ..
Mitglied: mayho33
10.12.2017, aktualisiert um 10:06 Uhr
Du könntest einen Zwischenschritt einfügen.

exemplarisch:

Static ObsevableCollection DataTable... (Sorgt dafür, dass Änderungen in der Datatable automatisch aktualisiert werden)

Deine View auf diese verknüpfen (Spricht, die Aktualisierung in der ObservableCollection DataTable übernehmen)

Im BackGroundWorker im Bereich ProgessChanged einen Methode implemetieren die die Änderung in die ObservableCollection DataTable schreibt.


So funktionierts zumindest bei mir.

Das ganze wäre dann entsprechend dem MVVM (Model- View-View-Model)

Wie @emerics schon erwähnt hat müssen Methoden und Variablen außerhalb des BW deklariert sein um deine View außerhalb des BW zu aktualisieren.


Edit:
Habe gerade gesehen, dass du Forms verwendest. Ob du MVVM in Forms anwenden kannst bezweifle ich.
Bitte warten ..
Mitglied: TheVo1d
12.12.2017 um 14:11 Uhr
Hey mayho
Vielen Dank, für deine Hilfe.
ich habe den Fehler bei mir gefunden.
Er lag nicht an der Rückgabe des Backgroundworkers ich hatte in einem Rowfilter string falsche angaben.
Welche ich einfach nicht sehen konnte, da der String im Backgroundworker erstellt wird.
Wie emerics schon oben erklärt hat, hat es im Endeffekt auch funktioniert. so hatte ich es ja auch schon gebildet...
nur dachte ich das ich für diese Rückgabe etwas spezielles unternehmen muss. Dem war nicht so X_X.
Vielen Dank Trotzdem!

Gruss

TheVo1d
Bitte warten ..
Ähnliche Inhalte
IDE & Editoren
IDE für C-Sharp und C++ auf Windows
gelöst Frage von BugdroidIDE & Editoren8 Kommentare

Hallo, Ich nutze derzeit Visual Studio, aber auf Dauer ist es mir etwas zu Ressourcenfressend und für meine Zwecke ...

C und C++
C Sharp XAML Universal
Frage von DippsC und C++3 Kommentare

Hallo ich versuche gerade mit C#2015 ein Projekt Universal XAML zu erstellen um auf einem Raberry PI 2 mit ...

C und C++
C-sharp SearchPattern (Regex)
Frage von YanmaiC und C++6 Kommentare

Hallo ihr Administratoren, ich verwende ein AUtocpmpletemenu Plugin. Dort habe ich Snippets, die dann sozusagen completed werden. Beim erstellen ...

C und C++
C-sharp Form buggt
gelöst Frage von YanmaiC und C++2 Kommentare

Hallo ihr Administratoren. Ich habe ein kleines Problem. Unszwar möchte ich eine Ordner von C# zu einem PHP Script ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 23 StundenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 1 TagInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server18 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement16 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...