C# Methode aus einer externen Klasse, in der Main-Methode aufrufen

Captium

Cadet 4th Year
Registriert
Apr. 2017
Beiträge
81
Hallo,

ich will eine Methode aus einer externen Klasse, in der Main-Methode aufrufen. Aber der sagt mit, das dieser im aktuellen Kontext nicht vorhanden sei:
(Beim ersten Codeblock ist nur der Teil ganz unten wichtig)

Main-Methode:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ImportCSVtoSQL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void btnImport_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor; // Wandelt während der dauert vom Import den Mauszeiger in den "Ladenden" Runden Mauszeiger um.

            DataTable importData = GetDataFromFile(); // Weist dem "DatabTable" die von der Methode "GetDataFromFile();" erzeugten Daten zu.

            if (importData == null) // ICH GLAUBE: Wenn in "importData" nichts drinne ist, gibt er nichts zurück, wenn was drinne ist führt er die Methode "SaveImportDataToDatabase(importData)" aus.
            {
                return;
            }
            SaveImportDataToDatabase(importData);

            MessageBox.Show("Import Complete"); // Wenn die Schritte davor durchgeführt wurden kommt eine Fester das "Import Complete" ausgibt.
            txtFileName.Text = string.Empty; // Löscht den Pfad in der Textbox

            Cursor = Cursors.Default; // Wandelt den Cursor wieder in den normalen zustand.
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            //
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.DefaultExt = ".csv"; // ?
            ofd.Filter = "Comma Separated (*.csv)|*.csv"; // ?
            ofd.ShowDialog(); // Öffnet den Windows Explorer

            txtFileName.Text = ofd.FileName; // Schreibt in die Textbox den Pfad der Datei
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close(); // Schließt das Fenster
        }
        public DataTable GetDataFromFile()
        {
            DataTable importedData = new DataTable(); // Erstellt eine "DataTable"
            try
            {
                using (StreamReader sr = new StreamReader(txtFileName.Text))
                {

                    string header = sr.ReadLine();
                    if (string.IsNullOrEmpty(header)) // ? Wenn Textbox leer dann das ausgeben ???? oder schaut nach ob die erste Zeile vom File befüllt ist
                    {
                        MessageBox.Show("No file data");
                        return null;
                    }

                    string[] headerColumns = header.Split(',');
                    foreach (string headerColumn in headerColumns)
                    {
                        importedData.Columns.Add(headerColumn);
                    }

                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }
                        string[] fields = line.Split(',');

                        DataRow importedRow = importedData.NewRow();

                        for (int i = 0; i < fields.Count(); i++)
                        {
                            importedRow[i] = fields[i];
                        }

                        importedData.Rows.Add(importedRow);

                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
            return importedData;

            
        }

        DBHelper saveImport = new DBHelper();
        saveImport.SaveImportDataToDatabase(); // SO RUFT MAN DOCH ASU EINER KLASSE EINE METHODE AUF ODER?


    }
}

Die andere Klasse mit der Methode:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace ImportCSVtoSQL
{
    public class DBHelper
    {
        protected Form1 save;
        public DBHelper()
        {
          this.importData = SaveImportDataToDatabase; // DACHTE ICH MUSS EINFACH EIN KONSTRUKTOR EINFÜGEN, KRIEGE ES ABER NICHT HIN IRGENDWIE
        }

        public void SaveImportDataToDatabase(DataTable importData) 
        {
            using (SqlConnection conn = new SqlConnection("Server=localhost; Database=TestDB;Trusted_Connection=True;"))
            {
                conn.Open();
                foreach (DataRow importRow in importData.Rows)
                {
                    SqlCommand cmd = new SqlCommand("INSERT INTO ImportData (StatioID, ClientID, rate, ShowTitleID) " +
                                                    "VALUES (@stationId, @clientId, @rate, @showTitleID)", conn);

                    cmd.Parameters.AddWithValue("@stationId", importRow["StationID"]);
                    cmd.Parameters.AddWithValue("@clientId", importRow["ClientID"]);
                    cmd.Parameters.AddWithValue("@rate", importRow["rate"]);
                    cmd.Parameters.AddWithValue("@showTitleID", importRow["ShowTitleID"]);

                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}


ich habe mir die Seele aus dem Leib gegoogelt, aber finde nicht passendes.
Hoffe jemand kann mir helfen.
Danke schonmal!
 
Zuletzt bearbeitet:
du kannst die Methode nur innerhalb einer anderen Methode aufrufen und nicht innerhalb der Klassen Definition.
Edit: bei deinem Edit scheint was schiefgelaufen zu sein
 
Also der Inhalt des Konstruktors in der 2. Klasse ist erst mal Quatsch und kann weg. Der Aufruf in der Main ist an sich schon richtig, aber die Signatur stimmt nicht. Die Methode erwartet einen Parameter.

Edit: und ja, die Stelle an der du das versuchst Aufzurufen sieht auch falsch aus... wobei das ohne der [ code ] Einbindung schwer lesbar ist.

Edit2: jepp, der Aufruf muss natürlich innerhalb einer Methode der ersten klasse stehen und nicht einfach zusammenhanglos in der Klasse selbst.
 
Zuletzt bearbeitet:
Übergib in Zeile 113 das importedData, in der DBHelper Klasse gibt es keine SaveImportDataToDatabase()-Methode, welche ohne Parameter aufgerufen werden kann (vorausgesetzt der Code ist vollständig).

Was willst Du bei der "anderen Klasse" in Zeile 16 mit dem Code bewirken?

Es gibt keine Property/Variable mit dem Namen "importData".. Eine Methode musst Du mit den Klammern und dem Argument aufrufen.
 
Bin leider erst Anfänger und komme nicht ganz mit.

edit: "DBHelper saveImport = new DBHelper();
saveImport.SaveImportDataToDatabase();"

Das funktioniert nicht.
 
Es gibt ja auch keine Methode SaveImportDataToDatabase(), sondern nur eine Methode SaveImportDataToDatabase(DataTable importData)

Du musst dem Methodenaufruf auch schon die Daten mitgeben, die sie wegspeichern soll. Also in etwa
Code:
DBHelper saveImport = new DBHelper();
saveImport.SaveImportDataToDatabase(importData);
 
Okay, und wo soll der Aufruf dann hin? Weil dort wo er jetzt ist, ist es ja anscheinend falsch.
 
Ich seh grad das in Zeile 32 der ersten Klasse genau das schon versucht wird, aber ohne die 2. Klasse zu instanziieren... ich schätze das es da schon einen Fehler beim Compilieren gibt und einfach an der Stelle das ganze ausgebessert werden muss...
 
In Zeile 110 schließt du deine Funktion "public DataTable GetDataFromFile()", die du in Zeile 60 öffnest.

Code kannst du nur innerhalb von Funktionen aufrufen, daher wird das da unten gar nicht funktionieren.

In Zeile 32 hast du bereits einen korrekten Aufruf deiner Methode, sogar mit einer DataTable.
Wo genau brauchst du denn die Methode erneut?
 
Alles klar, habs endlich hinbekommen. Ich brauche die Methode nur oben. Ich dachte ich muss die Methode erst unten instanziieren um Sie überhaupt zu instanziieren. Vielen Dank Leute!!!

Edit: Ich depp xD
Ergänzung ()

Jetzt will ich die Methode "GetDataFromFile" auch auslagern in eine eigene Klasse und dann wie in Zeile 26 zu sehen ist, dem "DatabTable" die von der Methode "GetDataFromFile();" erzeugten Daten zuzuweisen. Das geht natürlich nicht, da GetDataFromFile nicht instanziiert ist. Jetzt habe ich das gemacht --> DataTaker takeData = new DataTaker();

Aber was ich jetzt machen muss ist die Frage. Ich hab die Methode mal aufgerufen aber GetDataFromFile "kann nicht wie eine Methode verwendet werden". Wie muss ich jetzt vorgehen?
 
Zuletzt bearbeitet:
Eine Methode kann man nicht initiieren, Instanzen von Klassen (Objekte) schon ;)

Das sieht laut der Fehlermeldung eher danach aus, dass Du versuchst eine Klasse, Variable oder Property wie eine Methode mit "()" am Ende aufzurufen, das geht nicht.

Wie rufst Du denn die Methode auf? Zeig uns doch mal bitte deinen neuen Code.
 
Auskommentierte Stellen sind wichtig:


Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ImportCSVtoSQL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void btnImport_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor; 

            DataTaker takeData = new DataTaker();
            takeData.GetDataFromFile();

           // DataTable importData = GetDataFromFile(); DAS HIER FUNKT NICHT

            if (importData == null)
            {
                return;
            }
            
            DBHelper saveImport = new DBHelper(); 
            saveImport.SaveImportDataToDatabase(importData);

            MessageBox.Show("Import Complete");
            txtFileName.Text = string.Empty; 

            Cursor = Cursors.Default; 

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            // 
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.DefaultExt = ".csv"; 
            ofd.Filter = "Comma Separated (*.csv)|*.csv"; 
            ofd.ShowDialog(); 

            txtFileName.Text = ofd.FileName; 
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close(); 
        }     
    }
}

Die Methode GetDataFromFile:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ImportCSVtoSQL
{
    class DataTaker
    {
        public DataTable GetDataFromFile()
        {
            DataTable importedData = new DataTable(); // Erstellt eine "DataTable"
            try
            {
                using (StreamReader sr = new StreamReader(txtFileName.Text)) // txtFileName SOLL ANSCHEINEND IM AKTUELLEN KONTEXT NICHT VORHANDEN SEIN
                {

                    string header = sr.ReadLine();
                    if (string.IsNullOrEmpty(header)) 
                    {
                        MessageBox.Show("No file data");
                        return null;
                    }

                    string[] headerColumns = header.Split(',');
                    foreach (string headerColumn in headerColumns)
                    {
                        importedData.Columns.Add(headerColumn);
                    }

                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }
                        string[] fields = line.Split(',');

                        DataRow importedRow = importedData.NewRow();

                        for (int i = 0; i < fields.Count(); i++)
                        {
                            importedRow[i] = fields[i];
                        }

                        importedData.Rows.Add(importedRow);

                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
            return importedData;


        }

    }
}
 
Zuletzt bearbeitet:
Funktioniert es mittlerweile? Du musst ja nur deine fehlerhafte Zeile mit der darüber vergleichen.
 
Zurück
Oben