thevo1d
Goto Top

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

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.
frm_WorkInProgress frmWIP = new frm_WorkInProgress(tblFilter, lstTables[2], lstTables[1]);
frmWIP.ShowDialog();

Dies ist der Ganze Code der zweiten form, bzw der Form mit dem Backgroundworker:
//  Loading Components
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//  Namespace for the failed CI's form - Validator_Reloaded 
namespace Validator_Reloaded
{
    public partial class frm_WorkInProgress : Form
    {
        //  Define the tables that get importet
        DataTable tblCIs;
        DataTable tblCIService;
        DataTable tblServiceLists;

        //  Work in progress: Class
        public frm_WorkInProgress(DataTable tblCIs, DataTable tblCIService, DataTable tblServiceLists)
        {
            InitializeComponent();

            //  set the new createt tables to the same tables
            this.tblCIs = tblCIs;
            this.tblCIService = tblCIService;
            this.tblServiceLists = tblServiceLists;
        }

        //  define a new variable for the finished percent
        int percentFinished = 0;

        //  define datatables
        DataTable tblCont = new DataTable();
        DataTable tblServices = new DataTable();
        DataTable tblFailedCIs = new DataTable();

        //  Create Dataviews
        DataView dvFailedCIs = new DataView();
        DataView dvCIService;
        DataView dvServiceList;

        //  Create new Lists
        List<List<string>> lstCIs = new List<List<string>>();
        List<string> lstFailedCIs = new List<string>();
        List<string> lstCIServices = new List<string>();
        List<string> lstServices = new List<string>();
        List<string> lstContent = new List<string>();

        //  Create a new Array
        int arrColumnNr = { 0, 7, 9 };

        //  Load event
        private void _03_Validator_Progress_Load(object sender, EventArgs e)
        {
            // fill the the dataviews with the table CI's & tbl Service Lists 
            dvCIService = new DataView(tblCIs);
            dvServiceList = new DataView(tblServiceLists);

            //  foreach row in the CI table
            foreach (DataRow row in tblCIs.Rows)
            {
                //  set the lstContent as a new list
                lstContent = new List<string>();

                //  foreach integer in the Column Array
                foreach (int i in arrColumnNr)
                {
                    //  add a new row to the lstContent
                    lstContent.Add(row[i].ToString());
                }

                //  add the list to the CI - list
                lstCIs.Add(lstContent);
            }

            //  define the maximum from the pgbFortschritt - progressbar | as the lstCIs Count
            progressBar1.Maximum = lstCIs.Count;

            System.Windows.Forms.Application.DoEvents();

            //  Start the Backkground Worker
            worker.RunWorkerAsync(progressBar1.Value);
        }

        //  the Do Work event for the worker
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            //  foreach list in list CIs
            foreach (List<string> list in lstCIs)
            {
                //  Search the table for the current CI
                dvCIService.RowFilter = "CI Like '" + list + "'";  

                //  add the Dataview to a table
                tblCont = dvCIService.ToTable();

                //  get a table with the Servicelist CIs
                dvServiceList.RowFilter = String.Format("convert(Customer, 'System.String') Like '" + list[1].ToString() + "' AND convert(Model, 'System.String') Like '" + list[2].ToString() + "'");  
                tblServices = dvServiceList.ToTable();

                //  Set the two lists as new string Lists
                lstCIServices = new List<string>();
                lstServices = new List<string>();

                //foreach row in in the table Content
                foreach (DataRow row in tblCont.Rows)
                {
                    //  add the first item in the current row to the list CIServices
                    lstCIServices.Add(row[1].ToString());
                }

                //  foreach row in the table Services
                foreach (DataRow row in tblServices.Rows)
                {
                    //  add the 3rd item in the row to the List
                    lstServices.Add(row[3].ToString());
                }

                //  If the lenght from the List CIServices not equal the Services List lenght
                if (lstCIServices.Count != lstServices.Count)
                {
                    //  Add the CI to the failed CI list
                    lstFailedCIs.Add(list);
                }
                else
                {
                    //  Check if the lists arent equal 
                    var a = lstCIServices.All(lstServices.Contains);

                    if (a == false)
                    {
                        //  if it isn't equal ad dit to the Failed CI list 
                        lstFailedCIs.Add(list);
                    }
                }

                //  Add another point to the progressbar
                percentFinished++;
                worker.ReportProgress(percentFinished);
            }

            //  Update the label with bonus information
            lblAnzeige.Text = "Fertig stellen...";  
            
            //  set the dvFailedCIs as New DataView
            dvFailedCIs = new DataView(tblCIs);

            //  Make Sure the string is empty
            string strCMD = "";  

            //  Check if the list with the failed CI's isn't 0 
            if (lstFailedCIs.Count >= 1)
            {
                //  Create a filter string for a Dataview rowfilter.
                strCMD = strCMD + "(CI IN ('" + lstFailedCIs + "' ";  

                //  add each item in the Failed CIs list into the strCMD
                foreach(string i in lstFailedCIs)
                {
                    strCMD = strCMD + ", '" + i + "'";  
                }
                strCMD = strCMD + "))";  
            }
            else
            {
                //  else add 2 Points to the progressbar
                percentFinished = percentFinished + 2;
            }

            //  generate a datatable with the wrong CI string
            dvFailedCIs.RowFilter = strCMD;
            tblFailedCIs = dvFailedCIs.ToTable();

            e.Result = tblFailedCIs;
        }

        //  Update event for the worker
        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            lblAnzeige.Text = percentFinished.ToString() + " / " + lstCIs.Count.ToString();  
        }

        // Completet Event for Worker
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            DataTable tblTest = (DataTable)e.Result;

            lblAnzeige.Text = "Completed!";  
            button1.Enabled = true;
        }
        //  Klick event for the button
        private void btn_Okay_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

Content-Key: 357261

Url: https://administrator.de/contentid/357261

Printed on: April 16, 2024 at 12:04 o'clock

Member: emeriks
Solution emeriks Dec 06, 2017 at 20:47:53 (UTC)
Goto Top
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.
Member: mayho33
mayho33 Dec 10, 2017 updated at 09:06:59 (UTC)
Goto Top
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.
Member: TheVo1d
TheVo1d Dec 12, 2017 at 13:11:25 (UTC)
Goto Top
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