Zugriff auf DataTable

happydigit

Grünschnabel
Hallo,

ich hänge mal wieder bei den Basisc der OOP.

In der Classe Form1 werden mehrere DataTables (dt1 bis dt4) durch Aufrufen verschied. Funktion befühlt.

Nun ist es so, dass diese Auffüllwerte zufällig aus einer Datenbank geholt werden. Klappt alles einwandfrei. NUR: :)

In der DataTable dt2 gibt es ein Feld in jeder Zeile, das den gleichen Wert wie das gleiche Feld in der gleichen Zeile in dt1 haben muss.

Hätte ich alles in einer Klasse, dann könnte ich das Problem so lösen:

Code:
dr[dc.ColumnName] = dt1.Rows[y][x]

y und x sind bekannt, das Problem ist, das "dt1" in der Klasse nicht bekannt ist - weil diese eben aus Form1.cs kommt.
Ich weiß das ich irgendwie die DataTable public oder so machen muss - nur wie Quelltextmässig?

Danke für Eure Hilfe vorab.
 
der weg wie ich es hinbekommen habe ist direkt in der Klasse dein Datatable so zu initialisieren:

public static datatable dt2;

dann sollte es in den anderen Klassen bekannt sein wenn du aufrufst

[Name der Klasse in der dt2 liegt].dt2 = blafasel
 
naja das habe ich halt auch probiert und genau das geht halt net - rein syntaktisch nicht.

Code:
DataTable dt1 = new DataTable();
public static DataTable dt1
{
dt1 = objOS.GenerateOrders1().Tables[0];
dataGrid1.DataSource = dt1;
}
 
Zuletzt bearbeitet:
Versuchs mal direkt oben in der Klasse, also in etwa so:

Code:
	public class bla: System.Windows.Forms.Form 	
{
		public static DataTable dt2;
[...]
[bla bla]

dt1 = objOS.GenerateOrders1().Tables[0];
dataGrid1.DataSource = dt1;

so müsste es gehen, habs aber nicht getestet
 
erstmal danke für deine hilfe.

er unterstreicht das neue

public static DataTable dt2;

rot.

was mir ansich auch logisch ist, weil der "befehl" bischen komisch aussieht? soll das ne funktion sein?

dann müssen wir ja { und } setzten und das ; muss weg.
wiederrum brauch ich ja aber ein objekt auch noch davon mit
DataTable dt2 = new Datatable ... wo soll das hin? Davor oder dahinter?

Du siehst, ich hab net all soviel Ahnung von dem Zeugs, bin halt neu in der OOP und mach das mit Learning by doing...
 
Mal ein anderer Ansatz:
Du hast doch 2 Klassen - richtig?
Definiere in der einen Klasse eine Prozedur (als Public), die die Zuweisung(en) enthält. Dieser gibst du einen Parameter DataTable mit - also so:
PHP:
public class bla1: System.Windows.Forms.Form 	
{
[...]
public void ZusatzSpalteFuellen(DataTable dt2)
{
// Hier schreibst du dann was du möchtest, z.B.:
dr[dc.ColumnName] = dt2.Rows[y][x]
}
[...]
}
Dann brauchst du nur noch den Aufruf in der zweiten Klasse:
PHP:
class bla2: System.Windows.Forms.Form 	
{
[...]
private DataTable dtable2;
bla1.ZusatzSpalteFuellen(dtable2);
[...]
}
So, hoffe das hilft Dir. :)
 
versuchs mal mit dem buch visual c# schritt für schritt, hat mir ziemlich geholfen ;-)

ansonsten, bei mir sieht es so aus:

Code:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
// bla bla, hier halt die ganzen usings einfügen, sind bei mir noch einige andere dinge dia aber nicht wichtig sein dürften.

namespace User_Management_
{
	/// <summary>
	/// Zusammenfassung für UserControl1.
	/// </summary>
	public class User_Management : System.Windows.Forms.UserControl	{
		public Data_Access_Base managerObjekt;
		public static DataSet meinDataSet;
		public static string befehl;
		public static DataSet DataSetUser_ID;
		private DataTable myTable; // der müsste dann bei dir public static sein

		private System.Windows.Forms.DataGrid dataGrid1;
		private System.Windows.Forms.Button newButton;
		private System.Windows.Forms.Button changeButton;
		private System.Windows.Forms.Button deleteButton;
		private System.Windows.Forms.Button button_DOWN;
		private System.Windows.Forms.Button button_UP;
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public User_Management()
		{
			// Dieser Aufruf ist für den Windows Form-Designer erforderlich.
			InitializeComponent();
			managerObjekt = new Data_Access_Base();
			// Meine Datenbankverbindung					
                           meinDataSet = new DataSet();
                           // hier könntest du auch deinen datatable bauen wenn du willst
			// TODO: Initialisierungen nach dem Aufruf von InitComponent hinzufügen
                     
		}

Den DataTable solltest du noch irgendwo initialisieren, ja...
Ich hoffe du wirst daraus schlauer....

Meike
 
Zuletzt bearbeitet:
Hallo,

danke für Deine ganze Arbeit aber ich glaube wir haben an einander vorbei geredet *g*

Ich versuch das Problem nochmal zu schildern:

In der Form1.cs wird eine DataTable erzeugt und gefüllt (die Tatsache das dies Wiederrum über mehrere andere Classen geschieht, sollte egal sein, da es funktioniert.)

In einem weiteren Schritt wird die nächste DataTable befüllt. Auch hier springt das Programm zum befüllen wieder in eine andere Classe (Order.cs) - so und jetzt kommt das Problem:

In dieser DataTable muss ich eine Spalte befüllen, der bereits schon einmal so in der ersten DataTable enthalten ist. Das heißt, ich muss in der Order.cs auf einen Wert aus der ersten DataTable zugreifen...

Und genau das geht anscheinend nicht :(
 

Neue Beiträge

Zurück