Entwickler-Ecke

WinForms - Wie werden die Daten am besten eingeschränkt ?


moori64 - Mo 12.12.11 16:23
Titel: Wie werden die Daten am besten eingeschränkt ?
Hallo,

ich komme einfach nicht drauf wie ich es am besten machen könnte.

Ich habe ein datagridview und ringsherum comboboxen.
Ich habe eine Tabelle die ich mit meinen Comboboxen immer genauer eingrenzen will.

z.b.

10 gaststätten wurde von einer gewissen anzahl lieferanten beliefert und wenn ich mir in der combobox eine gasstätte aussuche will ich nur die lieferanten dieser gaststätte haben und wenn ich in einer combobox mir einen lieferanten auswähle dann will ich nur die daten von diesen einen lieferanten haben .
muss ich das auch mit ein master detail formular machen oder gibt es da eine andere möglichkeit.

die daten verändern sich ja immer und ich müsste die tabelle ja immer anpassen aber wie.


Th69 - Mo 12.12.11 17:58

Hallo,

ich hoffe mal, daß du DataBinding für dein DGV verwendest (z.B. über eine BindingSource oder eine DataTable)? Und dann brauchst du doch nur den Filter entsprechend deinen ComboBoxen setzen (bei mehreren dann entsprechend mit "AND" verknüpfen).


moori64 - Mo 12.12.11 18:30

hallo,

ich habe das buch von galileo aber mit filter setzten,

meinst du das so

C#-Quelltext
1:
SqlCommand command = new SqlCommand("SELECT * FROM   XXX where  gaststaette = selected.index.changed ", conn);                    

aus der combobox . jetzt steht der wert in der table.
erfolgt der nächste loop jetzt über table?

C#-Quelltext
1:
dgvgast.bindingsource = table                    

nur als beispiel aber die table verändert sich doch nicht oder doch ?

gruß uwe

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Mo 12.12.11 18:55

Du könntest natürlich jedesmal eine neue Query absetzen (je nach Datenvolumen und Performance).
Oder aber du holst dir einmalig alle Daten und bindest das DGV dann an ein DataView der DataTable:

C#-Quelltext
1:
dgv.DataSource = dataTable.DefaultView;                    

Und über diesen DataView kannst du dann den Filter setzen, z.B.

C#-Quelltext
1:
dataTable.DefaultView.Filter = "gaststaette = " + id;                    

Beim Filter kannst du dann auch alle gängigen SQL Operatoren (AND, OR, NOT) benutzen.

Und bei den ComboBoxen solltest du auch DataBinding (DataSource, DisplayMember, ValueMember) benutzen.
Dann kannst du über

C#-Quelltext
1:
int id = (int)comboBox.SelectedValue; // Edit: vorher stand hier SelectedItem                    

an die Id für deinen Filter kommen (solange ValueMember auf die Id-Spalte gesetzt wurde).
Evtl. noch einen Dummy-Leereintrag zu der DataBinding-Liste hinzufügen und diesen dann entsprechend behandeln (d.h. für die Filterung ignorieren).

P.S: Lies dich am besten mal in die DataView-Klasse [http://msdn.microsoft.com/de-de/library/system.data.dataview.aspx] ein.

Edit: SelectedItem nach SelectedValue korrigiert, s.a. http://www.c-sharp-forum.de/viewtopic.php?p=656211#656211


moori64 - Mo 12.12.11 20:55

hallo,

hab vielen dank für deine mühe , das werde ich mal tuen .


viele grüße

uwe


moori64 - Di 13.12.11 09:49

Guten Morgen,

ich habe da mal was angefangen, nun habe ich 2 probleme die comboboxen zeigen mir nun alle einträge aus den lieferanten und gaststätten an es müssten aber nur jeweils 6 sein
und wie kann ich das filter nun so setzten das wenn ich eine kneipe ausgewählt habe auch nur die daten dieser einen bekomme?
genau das selbe für die lieferanten auch?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
            SqlConnection conn = new SqlConnection(connstr);

            SqlCommand command = new SqlCommand("SELECT *  FROM gaststaetten", conn);
            adapterchartdata = new SqlDataAdapter(command);

            table = new DataTable();
            adapterchartdata.Fill(table);

            cmbwerk.DataSource = table;
            cmbwerk.DisplayMember = "gaststaette";
            cmbwerk.ValueMember = "gaststaette";

            cmblieferant.DataSource = table;
            cmblieferant.DisplayMember = "Lieferant";
            cmblieferant.ValueMember = "Lieferant";

            dgvmaterial.DataSource = table.DefaultView;


Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet.


Th69 - Di 13.12.11 11:29

Hallo,

eigentlich müßte mein Code doch reichen, d.h. einfach im ComboBox_SelectedIndexChanged-Ereignis den Filter zusammenbauen.

Der Artikel Filtering and Sorting in ADO.NET [http://www.akadia.com/services/dotnet_filter_sort.html] müßte aber ganz hilfreich sein.

Im Internet habe ich noch folgende ähnliche Anfrage gefunden: ComboBox Filtering in DataGridView [http://www.daniweb.com/software-development/csharp/threads/285966] (auch wenn hier die ComboBoxen als Spalten vorliegen anstatt wie bei dir außerhalb, das Prinzip ist aber das gleiche).

Alternativ könntest du auch mal folgenden Artikel anschauen: Building a Drop-Down Filter List for a DataGridView Column Header Cell [http://msdn.microsoft.com/en-us/library/aa480727.aspx] (bzw. den Code herunterladen und benutzen).

So ich hoffe, dir nun genug Lesestoff gegeben zu haben ;-)


moori64 - Di 13.12.11 12:14

Hallo,

ich werde das mal durcharbeiten , ich habe ja auch noch dieses riesen buch von galileo aber da ist sehr viel schon in wpf eingearbeitet und das soll ich
noch nicht machen , wurde mir gesagt ich soll erst mal bei den grundlagen bleiben. trotzdem vielen dank für deine mühe.


uwe


Th69 - Di 13.12.11 12:55

Hallo Uwe,

unter http://openbook.galileocomputing.de/visual_csharp/ gibt es noch das OpenBook "Visual C# 2008".
Dort sind im Kapitel 28 die Klassen DataSet, DataTable, DataView etc. beschrieben.


moori64 - Di 13.12.11 13:22

Hallo.

ich back jetzt erst mal kleine brötchen 2 comboboxen und ein datagrid , wenn ich das geschafft habe lade ich dich auf ein mittag ein.
bin ja öfters in bielefeld. :-)

gruß uwe

Moderiert von user profile iconNarses: Beiträge zusammengefasst

hallo nochmal,

ich weiß das ich dazu ein neues thema aufmachen müsste , aber ich habe folgendes probelem

wenn ich mit dem tool versuche ein txt datei in die datenbank einzulesen schlägt das immer fehl erstens habe ich in der textdatei
keine id spalte und 2 formatiert er immer die felder die ich als text deklariert habe in float obwohl ich die aber als char habe will.
ich kann das in der datenbank ja nicht mehr ändern oder doch ?


gruß uwe


moori64 - Do 15.12.11 09:57

Hallo,

@ TH69 brauche ich um dieses Filter zu setzen zwingend eine ID in der Datenbank ?


Momentan bekomme ich die ID mit dem Assistenten nicht eingespielt in die Datenbank.


Viele Grüße Uwe