Laden...

[WinForms] Inhalt der Textbox in anderer Klasse verarbeiten.

Erstellt von Martin877 vor 8 Jahren Letzter Beitrag vor 8 Jahren 5.291 Views
M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren
[WinForms] Inhalt der Textbox in anderer Klasse verarbeiten.

Hallo,

ich absolviere gerade ein Praktikum und soll für meinen betrieb ein kleines Logistikprogramm schreiben. Leider bin ich "mal wieder 😄" ein Neuling in C#.

Ich habe schon super viel gegooglet und auch dieses Forum durchsucht, habe auch ein paar hilfreiche Informationen gefunden, da es diese Themen schon zu genüge gibt. Jedoch komme ich nicht zu einem Abschluss.

Also... Ich habe eine Form und mehrere Klassen(Datenbank.cs , Methoden.cs, usw.)
Über einen Handscanner wird in die Textboxen eine Nummer eingelesen und diese will ich in miener Datenbank.cs speichern/übergeben.

Ich kann auch meine Form instantiieren jedoch kann ich in meiner Datenbank.cs nicht auf die "Textbox.Text" zugreifen bzw auslesen??

Es ist garantiert trivial aber an der stelle fehlt es einfach bei mir.

using System;


namespace LogaScan
{
     public class Datenbank
    {

              
/// <summary>
/// /////////////////////////////////////////////////INSERT INTO//////////////////////////////////////////////////////////////////////
/// </summary>
          public static void Insert()

            {

                LogaScan loga = new LogaScan();
                
               
                String connection_string;
                String commandostring = " ";
                int nsatzzahl;
                DataTable fehlertabelle = new DataTable();
                OleDbCommand _command = new OleDbCommand();
                OleDbConnection _connection = new OleDbConnection();
                String cadetn_pfad =
                connection_string = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source= " + Pfad.cdaten_pfad + "; Extended Properties= dBase III";
                DataTable dt = new DataTable();
                

                string PALETTEN_N_val = "'',";
                string BEZEICHNNG_val = "'',";
                string MSN_val = "'',";
                string VERP_DATUM_val = "'',";
                string PACKSTELLEN_val = "'',";
                string VERP_EINH_val = "'St',";
                string ANZAHL_val = "'',";
                string PERS_NR_val = "'',";
                //int POSITIONEN_val    = 0;
                string POSITIONEN_val_str = "''";


using System;

namespace LogaScan
{
    public partial class LogaScan : Form
    {

        public LogaScan()
        {
            InitializeComponent();
            
        }

       
        public void Packstelle_TextChanged(object sender, EventArgs e)
        {

        }

    }// Ende Klasse

}// Ende Namespace
2.207 Beiträge seit 2011
vor 8 Jahren

Hallo Martin877,

kannst du bitte nur die relevanten Codestellen posten? Lass uns doch bitte nicht deinen kompletten Quellcode nachschauen. (Du hast 2x "Alles Markieren" und "Copy/Paste" gedrückt. Das reicht nicht als Eigeninitiative) Hilf uns ein wenig dir zu helfen.

Beachte auch [Artikelserie] SQL: Parameter von Befehlen

Und damit du die Stelle findest, wo es nicht stimmt:

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Wenn du in deiner Datenbank.cs etwas von woanders übernehmen willst, musst dus einfach übergeben. Als Parameter beispielsweise. Ich weiss nicht, wos hängt, aber du machst in dem Drucken-Click einen (auskommentierten) Aufruf der Datenbank. Einfach mitgeben, was du mitgeben magst.

Lies dir nochmal den Unterschied zwischen "normalen" Objekten und static-an.

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Hey,

die Datenbankabfrage sowie Insertt funktionieren mit meinem Pseudonymen.
Aber jetzt will ich die richtigen Werte aus der Textbox übergeben.

Mein Problem liegt darin, dass ich in der Datenbank.cs meine Form(Logascan) mit

LogaScan loga = new LogaScan();  
 instantiiere jdeoch trotzdem nicht auf eine Textbox der Form zugreifen kann.  

Heißt ich bekomme keine Fehlermeldung.. sondern weiss einfach nicht wie ich direkt an die Daten aus der Textbox komme.

Danke 👍

2.207 Beiträge seit 2011
vor 8 Jahren

Wenn deine Textbox nicht public ist, dann kann das auch nicht funktionieren.

Wie gesagt: Geh den anderen Weg. Wenn du willst, dass du etwas in die DB einträgst, gib der Methode zum Eintragen mit, was sie eintragen soll.

Gib deiner DB-Methode einen Parameter und gib den Text der Textbox mit.

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Habe alle meine Textboxen auf Public gesetzt.

Bsp.:

 public void Packstelle_TextChanged(object sender, EventArgs e)
        {

        }

Und das "Drucken-Click" war vorerst nur zum Test und hat mit der Datenbank nichts mehr zu tun.
Habe es doch in der Art schon gesehen, dass von einer anderen Klasse auf die Textbox zugegriffen wird und dies auch schon alles versucht.

Dafür habe ich mir meine Datenbank auch geschrieben, dass ich an die bestimmten zugewiesenen Felder die Textboxen übergeben kann.

R
228 Beiträge seit 2013
vor 8 Jahren

Dein Codeausschnitt zeigt keine Textbox, sondern ein Event einer Textbox. Coffeebean hat dir schon gesagt, wie du es lösen solltest.

Deine Datenbank klasse sollte die Form nicht kennen müssen und auch nicht die Textbox. Die Kommunikation sollte anders herum funktionieren.

Erstelle dir eine Form mit deiner Textbox und zum Beispiel einem Button. In dem Button_Click Event (doppelt auf den Button klicken im WYSIWY-Editor) übergibst du dann den Wert der Textbox an die Datenbank klasse.


public class Datenbank
{

      public void Insert(string textboxvalueausderform){
           //Insert mit Value
      }
}

1.040 Beiträge seit 2007
vor 8 Jahren

Und die ganzen leeren Eventhandler solltest du zum besseren Verständnis und zur besseren Übersicht entfernen.
Z.B.

public void Packstelle_TextChanged(object sender, EventArgs e)
{

}
M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

OK, ich bedanke mich erstmal und melde mich, wie ich vorangekommen bin 👍

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Hey,

hoffe nicht, dass ich mir euren Unmut auf mich ziehe aber bekomme es nicht hin.
Euren Ansatz verstehe ich schon aber bekomme es einfach nicht hin ihn umzusetzen.

nochmal zum Verständnis... ich Habe meine Datenbank.cs in der ich mit folgenden Feldern meine DBF füllen will:


                string PALETTEN_N_val = "'',";
                string BEZEICHNNG_val = "'',";
                string MSN_val = "'',";
                string VERP_DATUM_val = "'',";
                string PACKSTELLEN_val = "'',";
                string VERP_EINH_val = "'St',";
                string ANZAHL_val = "'',";
                string PERS_NR_val = "'',";
                //int POSITIONEN_val    = 0;
                string POSITIONEN_val_str = "''";

dazu habe ich meinen Commandostring und meinen Feldtext


 cfeldtext = PALETTEN_N_val + BEZEICHNNG_val + MSN_val + VERP_DATUM_val + PACKSTELLEN_val + VERP_EINH_val + ANZAHL_val + PERS_NR_val + POSITIONEN_val_str;
                        
commandostring = "insert into " + Pfad.cfullfile + " (PALETTEN_N,BEZEICHNG,MSN,VERP_DATUM,PACKSTELLE,VERP_EINH,ANZAHL,PERS_NR,POSITIONEN) values (" + cfeldtext + ");";

und in meiner Form habe ich verschiedene TextBoxen die mir Informationen ausgeben, die ich in die jeweiligen Felder alle gleichzeitig eintragen möchte(pro TextBox ein Feld)

Den Datenbank.insert(), den ich bis jetzt auf den Button gelegt habe soll einmal verschwinden und alles nur noch mit einem Tastendruck auf dem Handscanner erfolgen.

habe mir wirklich noch einiges im Netz durchgelesen aber komme wie gesagt einfach nicht zur richtigen Lösung

grüße

2.207 Beiträge seit 2011
vor 8 Jahren

Was bekommst du nicht hin? Wo hakts? Fehlermeldung? "Ich bekomms nicht hin" ist keine Fehlermeldung;-) Bitte beachte meinen schon geposteten Link

[Artikelserie] SQL: Parameter von Befehlen

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Deinen Link habe ich mir durchgelesen. 🙂

Was ich nicht hinbekomme ist es, den Inhalt der Textboxen richtig an meine Felder Der Datenbank.cs zu übergeben bzw. zuzuweisen.

Da in meiner Form beispielsweise Die MSN-Nummer aus der TextBox:

MSN_Anzeiger

kommt.

und in die Klasse der Datenbank in das Feld

string MSN_val = "'',";

gespeichert werden soll.

J
251 Beiträge seit 2012
vor 8 Jahren

z.B. sowas?



Datenbank db = new Datenbank();
db.Property = "Foo";
//oder
var FooParameter = "Foo"; 
db.MachDas(FooParameter);

Dann würde ich dir [FAQ] Wie finde ich den Einstieg in C#? empfehlen

Ansonsten brauchen wir evtl. eine genauere Erklärung, wo es hakt und was du schon so getrieben hast.

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

was wir meinen ist Folgendes: Deine Datenbank soll sich nicht für die Form oder gar die Textbox interessieren - darf diese gar nicht erst kennen - und muss dieses auch nicht. Beispiel für den msnVal:


public class LogaScan : Form
{
	Textbox textbox_MSN_Val;
	Button speichernButton;
	
	// .. Textbox und Button sind ja schon initialisiert bei dir
	
	// Du möchtest wohl automatisch speichern, sobald sich der Text ändert? Dann so:
	public void Packstelle_TextChanged(object sender, EventArgs e)
	{
		Datenbank.Insert(textbox_MSN_Val.Text);
	}	
}

public class Datenbank
{
	public static void Insert(string msnVal)
	{
		LogaScan loga = new LogaScan();

		// ...
		string MSN_val = msnVal; // hier hast du dann den Wert aus der Textbox
		// ...
	}
}

Und wenn du es ordentlich machst - was du solltest - dann überleg dir, ob du nicht lieber eine Klasse erstellt, die die Informationen, die in den ganzen Textboxen & Co stehen speichert - und die du dann nur noch als einen einzigen Parameter an die Insert-Methode übergeben musst.

LG

T
64 Beiträge seit 2011
vor 8 Jahren

Deinen Link habe ich mir durchgelesen. smile

und was hast du daraufhin geändert?
Ich hoffe doch, dass du die Datentypen angepasst hast und VERP_DATUM_val jetzt ein DateTime ist oder es sich bei ANZAHL_val um einen Integer handelt? Wenn nicht wird es lustig wenn mal jemand auf die Idee kommt und in eine deiner Textboxen DROP TABLE Tabellenname schreibt.

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

großen Dank 🙂 👍

das verstehe ich soweit 😁

jedoch bekomme ich jetzt eine Fehlermeldung:

Der Aufruf unterscheidet nicht eindeutig zwischen folgenden Methoden und Eigenschaften: "LogaScan.Datenbank.Insert(string)" und "LogaScan.Datenbank.Insert(string)"

  Datenbank.Insert(MSN_Anzeiger.Text);

So wie ich im Forum gelsen habe liegt es wohl an einer nicht eindeutigen Datentypen konvertierung und liegt wohl hieran.

public void Insert(string msnVal)
16.806 Beiträge seit 2008
vor 8 Jahren

Dann les Dir doch mal die Fehlermeldung durch und schau die Methoden an.
Da kann man doch ein bisschen überlegen und erkennen, was der Fehler ist. Ist doch sehr eindeutig diese Meldung....

Grundlagen schön und gut, aber alles vorkauen müssen wir dann auch nicht. 🤔

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Stimmt das war ein ziemlich trivialer Fehler von mir

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Und wenn du es ordentlich machst - was du solltest - dann überleg dir, ob du nicht lieber eine Klasse erstellt, die die Informationen, die in den ganzen Textboxen & Co stehen speichert - und die du dann nur noch als einen einzigen Parameter an die Insert-Methode übergeben musst.

Habe es versucht mit deinem Vorgehen umzusetzten.


        public class LogaScan : Form
{
        Textbox textbox_MSN_Anzeiger;

        public void Packstelle_TextChanged(object sender, EventArgs e)
        {
            Datenbank.Insert(MSN_Anzeiger.Text);
        }
       //.....
}


public static void Insert(string MSN_val)

            {
                LogaScan loga = new LogaScan();

                 string MSN_Anzeiger.Text = MSN_val ;
             //......
            }

leider ohne Erfolg 🙁

mir wird der:

 MSN_Anzeiger.Text 

gar nicht in der IntelliSense-Vervollständigungsliste angezeigt.

Ich weiss das meine Anliegen hier im Forum eigentlich nichts zu suchen haben, da es nicht für Anfänger vorgesehen ist aber mir bleibt in dem Fall keine Andere Möglichkeit.

Hinweis von Coffeebean vor 8 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 2.3

2.207 Beiträge seit 2011
vor 8 Jahren

Wieso versuchst du denn den Text wieder auf deine Box zu werfen?

string MSN_Anzeiger.Text = MSN_val ;

Die Methode sagt "Insert" und nimmt einen string. Jetzt musst du den einfach nur noch in die DB einfügen. Taipi88 hats dir sogar gezeigt. Und beachte seinen Hinweis, dass du besser eine Klasse statt einem String machst. Und die dann übergibst. Und daraus dann die Parameter abfüllst bzw. dein Insert zusammenbaust.

1.029 Beiträge seit 2010
vor 8 Jahren

Hallo Martin,

entschuldige - aber das ist jetzt echt nicht mehr ausreichend - du hast nicht einmal korrekt abgeschrieben.

LG

M
Martin877 Themenstarter:in
15 Beiträge seit 2015
vor 8 Jahren

Sorry.. hatte da was erheblich durcheinander gebracht. auf alle fälle habe ich jetzt den Ablauf verstanden 👍

vielen Dank an euch

p.s. es funktioniert jetzt