Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Probleme DataSet zu finden
romeor
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Probleme DataSet zu finden

beantworten | zitieren | melden

Guten Tag,

ich hoffe ich bin hier richtig mit meiner Frage.

Ich habe lange gesucht, aber ich finde die Lösung auf folgendes Ziel nicht.

in form A erstelle ich einen Button zum speichern(dessen click-event ist in einer anderen Klasse gespeichert) und einen Grid


// button wurde schon erstellt

 DataSet ds = new DataSet("meinDataSet");
 ds.Namespace = "meinDataSet";
 SqlDataAdapter dsa = new SqlDataAdapter(sqlText, sql.getConnectionString());
 dsa.Fill(ds);
 DataTable dt = ds.Tables[0];
 meinGrid.DataSource = dt;

bis hierhin pass alles

in der Klasse myevent will ich jetzt beim klick auf den Button .. Änderung speichern?...abfragen lassen...

wie finde ich den datensatz jetzt?


private static void B_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    Form form = btn.FindForm();

    DataSet ds = ( hier will ich den "meinDataSet" finden? )
}

Folgender Versuch hat natürlich nicht geklappt.


DataSet ds = form.Controls.Find("meinDataSet", true) as DataSet;



Ich hoffe Ihr könnt mir weiterhelfen.

Vielen Dank im Voraus.
Liebe Grüße
Rommy
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von romeor am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.757

beantworten | zitieren | melden

Im Endeffekt Basics der Objekt-orientierten Programmierung: Du musst das DataSet in der Klasse halten, zB als Feld in der Form.
https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/fields

Dass Du den Button-Event statisch hast zeigt eigentlich, dass Du diesbezüglich noch ein paar Grundlagen erlernen solltest - denn das sollte man so nicht programmieren.
Der statische Code führt hier dazu, dass Du sehr viel durch Controls durchhangeln und rumcasten musst, was halt mega suboptimal ist.
Kann man alles vermeiden.

PS: bitte in Zukunft im richtigen Forenbereich posten, machts uns allen einfacher und Du bekommst auch eher Hilfe.
[Hinweis] Wie poste ich richtig?
private Nachricht | Beiträge des Benutzers
romeor
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Offensichtlich muss ich noch viel lernen.
vielen Dank für die Antwort. Ich hab zwar noch nicht ganz verstanden was ich jetzt machen muss,
und was static's für Vor- und Nachteile haben.
Ich schau mal wie weit ich komme. Aller Anfang ist schwer.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.757

beantworten | zitieren | melden

Das Microsoft Lernmodul dazu ist https://docs.microsoft.com/de-de/learn/modules/csharp-code-blocks/

In C# gibt es Gültigkeitsbereiche, zB von Variablen, Feldern, Methoden etc.
Du hast eien DataSet-Variable angelegt, die nur in der Methode bekannt ist.

Wenn Du das erzeugte DataSet jedoch als Feld verwendest, dann ist es auch anderen Methoden bekannt


public class MyClass
{

   private TextBox _textBox1;

   public MyClass()
   {
      _textBox1 = new TextBox();
   }

   private string _fieldXYZ;
   public void KlassenMethode_A()
   {
      string a1 = "abc"; // nur in dieser Methode bekannt
      _fieldXYZ = "xyz";
   }

   public void KlassenMethode_B()
   {
      // a1 aus Methode_A ist hier unbekannt

      // _fieldXYZ ist hier und kann verwendet werden.
       _textBox1.Text = _fieldXYZ;
   }
}

Willst Du also Dinge in verschiedenen Methoden nutzen, so musst Du sie in einen "Gültigkeitsbereich" (Scopes) verschieben, auf die alle Teilnehmer (zB Methoden) auch zugreifen können.
Eine statische Methode kann nicht auf Klassen-Felder zugreifen (sondern nur auf andere statische Dinge bzw. Parameter).
In Deinem Fall: die Form-Elemente und das DataSet sollten allen beteiligten Methoden bekannt sein, zB durch Felder.
Wenn Du den Standard Visual Studio Forms Designer verwendest: Controls sind automatisch beim drauf ziehen Felder.
Musst das halt auch so für das DataSet machen.

Statische Methoden haben ihren eigenen Nutzen.
Statische Klassen und statische Klassenmember – C#-Programmierhandbuch

Die .NET Community hat mit Microsoft neulich erst die Docs umstrukturiert; die Einstiegsbereiche sind nun kompakt und übersichlicht.
Klar, immer noch nicht wenig - die Sprache ist mächtig - aber es lohnt sich das ein mal durchgelesen zu haben.
Tour durch C# – Die Bausteine von C#-Programmen
private Nachricht | Beiträge des Benutzers
romeor
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Hallo Abt,

vielen Dank für die freundlichen Informationen.

Die DataSet-Variable löst in dem Fall mein Problem nicht, da zur Laufzeit mehrere DataSets erstellt werden
und die Menge aber je nach Vorgang variieren können : ds1 ds2 ds3 ds4.



for (int i = 1; i < 10; i++)
{
 
 DataSet ds = new DataSet("ds"+i.ToString());
 BindingSource bindingSource = new BindingSource(); // name kann nicht vergeben werden
}


Daher ist die Frage, (wie) kann man so wie man ja sonst auch nach componenten suchen kann, nach dem DataSet suchen?

Control.FindControl
Control.FindForm
Application.OpenForms[..];



   Form form = Application.OpenForms["Form1"];

   for (int i = 1; i < 10; i++)
  {
      DataSet ds = f.find??.("ds"+i.ToString());
      BindingSource bs =  f.find...("ds"+i.ToString()); // da kein Name verben wurde funktioniert es ja so nicht
   }


Ich hab versucht evtl. über die BindingSource die Sache zu lösen, aber leider kann man anscheinend zur Laufzeit keinen Namen vergeben, sodass
ich auch nicht danach suchen konnte.

I need some help :-)

Ich hoffe Ihr könnt mir helfen, bin schon seit einigen Monat dran, hab aber keine passende Lösung bisher.
Wenn es dennoch nicht gehen sollte, dann würde ich es mit einer Funtkion versuchen die die DataSets wie oben erstellt, und diese
einem Platzhalter speichert



for (int i = 1; i < 10; i++)
  {
               Control bscontroller = new Control();
                bscontroller.Name = "bs" + i.ToString();
                form.Controls.Add(bscontroller);
                bscontroller.Visible = false;
               ....
                string colname = dt.Columns[0].ColumnName;

               bscontroller.DataBindings.Add(new Binding("Text", bindingSource, colname, true, DataSourceUpdateMode.OnPropertyChanged));

}


dann könnte ich durch die FindControl funktion den bsController finden und somit auf die DS und BS zugreifen.

Über ein Feedback würde ich mich sehr freuen.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.320

beantworten | zitieren | melden

Hallo,
Zitat von romeor
Die DataSet-Variable löst in dem Fall mein Problem nicht, da zur Laufzeit mehrere DataSets erstellt werden und die Menge aber je nach Vorgang variieren können : ds1 ds2 ds3 ds4.
Benutze dazu einfach eine List<DataSet> als Member und durchsuche diese.
Vergiß das Controls.Find()(-Gefrickel).

Du solltest auch nicht zu sehr UI/Control-basiert denken, sondern datenorientiert, d.h. am besten du erzeugst für die Datenhaltung eine eigene Klasse [und erst recht für den Datenbankzugriff!] (s.a. [Artikel] Drei-Schichten-Architektur sowie [FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls).
private Nachricht | Beiträge des Benutzers