Forum: PC-Programmierung C# Wpf DataGrid daten Zeile für Zeile ausgeben


von Jonas N. (medustv)


Angehängte Dateien:

Lesenswert?

Hallo ich versuche jetzt schon seid knapp 2 Stunden aus einem DataGrid 
bestimmte werde aus Zellen ausgeben zu lassen und diese mit einander zu 
vergleichen und wenn eine bestimmte Bedingung erfüllt ist soll eine 
weitere spalte erstellt werden die dann entweder Grün oder Rot ist. das 
ganze soll zeile für Zeile passieren. Ich habe mal in ein Bild erstellt 
wie es denn am ende aussehen soll. Das angehängte Bild ist nur ein 
Beispiel. Ich hatte das schon so in der Idee das man es über die 
LoadingRow Methode macht damit dann Zeile für Zeile die daten überprüft 
werden können und sich dann so endschieden wird ob in der letzten spalte 
die Zelle rot oder grün angezeigt werden soll. Mein Problem liegt eher 
dabei wie ich mir überhaupt erstmal diese daten ausgeben lassen kann.

Ich erwarte nicht von euch das ihr mir die ganze Methode programmiert 
sondern einfach nur ein wenig Hilfe da ich im Internet leider nichts 
passendes gefunden habe.

von Schlaumaier (Gast)


Lesenswert?

Wenn das ein Datagridview von VB ist, ist das einfach.

rowi = gg_st.CurrentCell.RowIndex ' fragt die aktuelle Zelle ab
kenn_nr = gg_st.Rows(rowi).Cells(1).Value  - gibt den Wert der ZWEITEN 
Spalte der aktuelle Zelle aus.

gg_st.Rows(rowi).Cells(1).Style.BackColor = Color.Blue   <- setzt den 
Hintergund der Zelle blau. ;)

Wie gesagt, das gilt für Visual-Basis + vermutlich auch für Visual.net.

Ansonsten denk mal an die Salami und gibt die Infos nicht in dünnen 
Scheiben.

von Jonas N. (medustv)


Lesenswert?

Nein es geht um das DataGrid aus C#

von Schlaumaier (Gast)


Lesenswert?

Jonas N. schrieb:
> soll eine
> weitere spalte erstellt werden die dann entweder Grün oder Rot ist

Das geht nicht wirklich.
Du musst die Spalte grundsätzlich erstellen. Und dann halt die Zelle in 
der Spalte nach deiner Bedingung " füllen ". Wie in deinen Beispiel.

Also mit einer Schleife die Zeilen (rows) abfragen und dann was machen

Flatterrand ist NICHT möglich. ;)

von Jonas N. (medustv)


Lesenswert?

Naja also momentan fülle ich das DataGrid mit dieser Methode:

private void datenbankanzeige()
        {

            string constring = "datasource=localhost; port=3306; 
username=root; password=";
            string Query = "SELECT attributenames.PK_ID_attributename AS 
'ID#', attributenames.attribute_name AS 'ATTRIBUTE_NAME', 
attributevalues.valuevalue AS 'VALUE', attributeworsts.worstvalue AS 
'WORST', attributethreshs.threshvalue AS 'THRESH', 
attributewhen_faileds.when_failedvalue AS 'WHEN_FAILED', 
attributeraw_values.attribute_valuevalue AS 'RAW_VALUE'  FROM 
smartcontrol.attributenames INNER JOIN smartcontrol.attributevalues ON 
attributevalues.FK_ID_attributename = attributenames.PK_ID_attributename 
INNER JOIN smartcontrol.attributeworsts ON 
attributeworsts.FK_ID_attributename = attributenames.PK_ID_attributename 
INNER JOIN smartcontrol.attributethreshs ON 
attributethreshs.FK_ID_attributename = 
attributenames.PK_ID_attributename INNER JOIN 
smartcontrol.attributewhen_faileds ON 
attributewhen_faileds.FK_ID_attributename = 
attributenames.PK_ID_attributename INNER JOIN 
smartcontrol.attributeraw_values ON 
attributeraw_values.FK_ID_attributename = 
attributenames.PK_ID_attributename INNER JOIN smartcontrol.harddisks ON 
harddisks.PK_harddisk = attributevalues.FK_harddisk INNER JOIN 
smartcontrol.cases ON cases.PK_case = harddisks.FK_case AND 
harddisks.PK_harddisk = attributeworsts.FK_harddisk AND 
harddisks.PK_harddisk = attributethreshs.FK_harddisk AND 
harddisks.PK_harddisk = attributewhen_faileds.FK_harddisk AND 
harddisks.PK_harddisk = attributeraw_values.FK_harddisk WHERE 
cases.PK_case LIKE '" + anzeige_gehaeuse + "';";
            MySqlConnection conDataBase = new 
MySqlConnection(constring);
            MySqlCommand cmdDataBase = new MySqlCommand(Query, 
conDataBase);

            try
            {

                MySqlDataAdapter sda = new MySqlDataAdapter
                {
                    SelectCommand = cmdDataBase
                };
                DataTable dbdataset = new DataTable();
                sda.Fill(dbdataset);
                BindingSource bSource = new BindingSource
                {
                    DataSource = dbdataset
                };
                showData.ItemsSource = bSource;
                sda.Update(dbdataset);

            }

            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message);
            }
        }

denkst du es ist dennoch irgenwie möglich?

von Michael (Gast)


Lesenswert?

Jonas N. schrieb:
> Nein es geht um das DataGrid aus C#

Vielleicht solltest du erst einmal die Grundlagen lernen. C# ist nur 
eine Sprache. Das Framework heißt .net und ob du VB oder C# nutzt, ist 
völlig irrelevant...

Beitrag #6697854 wurde vom Autor gelöscht.
von Schlaumaier (Gast)


Lesenswert?

Michael schrieb:
> Vielleicht solltest du erst einmal die Grundlagen lernen. C# ist nur
> eine Sprache. Das Framework heißt .net und ob du VB oder C# nutzt, ist
> völlig irrelevant...

Ich will mal hoffen das du nicht mich gemeint hast. Ich kann VB im 
Schlaf. Und ich übersetzte den Code von C# immer in VB.

ABER, ich mache keine Aussage wo ich mir nicht sicher bin das sie 
funktionieren. Und es wäre möglich da das Datagrid unter c# seine 
Eigenheiten hat.

Mit den Kalender-Modul habe ich schon Stress gehabt wegen so 
"Eigenheiten".

Mein Code oben in C# umzuwandeln ist leicht wenn man C# kann.

Davon abgesehen @TO würde ich das alles ganz anderes machen.

Ich würde das Datagrid in der Form anlegen was die anzahl der SPALTEN 
angeht, und auch den normalen Style.  Name = gg ;)


Dann in einer Schleife die daten einlesen, und den Grid zuweisen.

das geht dann so.


Zeile = -1
do while Daten = da
  Zeile= Zeile +1
  gg.rows.add (1) ' legt eine neue Zeile an
  gg.Rows(Zeile).Cells(0).Value  = eingelesene_daten_zeile_1_spalte_1
loop

Der Code muss nur noch um die Enleseroutine der Quelle erweitert werden.

Wie gesagt das geht in C# genau so. Ich habe nur etwas Probleme mit der 
Syntax und den unzähligen Klammern. Sorry

von Jonas N. (medustv)


Angehängte Dateien:

Lesenswert?

Schlaumaier schrieb:
> Wenn das ein Datagridview von VB ist, ist das einfach.
>
> rowi = gg_st.CurrentCell.RowIndex ' fragt die aktuelle Zelle ab
> kenn_nr = gg_st.Rows(rowi).Cells(1).Value  - gibt den Wert der ZWEITEN
> Spalte der aktuelle Zelle aus.
>
 Hast du eine Ahnung was ich statt RowIndex und Rows verwenden soll?

von Schlaumaier (Gast)


Lesenswert?

So geht übrigens das einlesen via SQL von einer Access-Datenbank.
Bei einer Anderen Datenbank sie die folgenen 2 Zeilen anzupassen. Ich 
mache das auch mit z.b. sqlite-Datenbanken. Dann muss aber in der IDE 
das SQL-Modul importiert werden.

dim dbpath As String = System.IO.Path.Combine(Application.StartupPath, 
"daten.mdb")
dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data 
Source=" & dbpath & ";")



Dim cmd As New OleDbCommand(sql, conn)
Dim da As New OleDbDataAdapter(cmd)
Dim ds As New DataSet

cmd.CommandText = "select * FROM " + tabelle$ + " where nr = " + 
Str(kenn_nr)

da.Fill(ds, tabelle$)

Dim row As DataRow
Dim dt As DataTable = ds.Tables(tabelle$)
For Each row In dt.Rows
      feld$ = "Name_1" : If Not DBNull.Value.Equals(row(feld$)) Then 
wert$ = row(feld$) Else wert$ = ""

next

Dann steht in Wert$ der Wert des Feldes Name_1.

Falls du dich über die seltsame Einlesemethode wunderst. Wenn in ein 
Feld den Absolute_NULL Wert hat, führt das sonst zum Absturz. So wird 
dieser Zustand geprüft.

von Schlaumaier (Gast)


Lesenswert?

Jonas N. schrieb:
> Hast du eine Ahnung was ich statt RowIndex und Rows verwenden soll?

NEIN. Das sind Eigenschaften.

Gib in deiner IDE einfach ein . <-punkt ein, und er listet die dir auf.

https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.datagridview.rows?view=net-5.0

Lies mal den Text z.b. Das ist übrigens C# Code. Wie gesagt mich nerven 
die Klammern ;)

von Schlaumaier (Gast)


Lesenswert?

Ich vermute mal du das das Datagridview nicht deklariert.

Ich mache das in den ich es einfach PASSEND auf die Form ziehe und ihm 
den passenden Namen geben (bei mir immer gg aber das ist wurst, Vorgabe 
ist Datagridview1 )

von Jonas N. (medustv)


Lesenswert?

Schlaumaier schrieb:> Ich mache das in den ich es einfach PASSEND auf die Form ziehe und ihm
> den passenden Namen geben (bei mir immer gg aber das ist wurst, Vorgabe
> ist Datagridview1 )

Es ist ein unterschied ob man eine Forms oder WPF Application nimmt, 
unter wpf ist es einfach DataGrid. Benutze als Namen aber showData, der 
Name war eigentlich auch nur als Platzhalter gedacht und wird später in 
etwas passenderes geändert.

Finde übrigens leider nicht  die passenden Eigenschaften..  So  langsam 
bin ich echt frustriert.. :(

: Bearbeitet durch User
von Schlaumaier (Gast)


Lesenswert?


von Roger S. (edge)


Angehängte Dateien:

Lesenswert?

Fuer so Sachen nutzt man eigentlich converter, statt dies im code-behind 
einzumassieren.

Cheers, Roger

von Schlaumaier (Gast)


Lesenswert?

Roger S. schrieb:
> Fuer so Sachen nutzt man eigentlich converter, statt dies im code-behind
> einzumassieren.

Naja, Es kommt auf die Auswertung an.  Da ja eine SQL-Tabelle vorliegt, 
und wenn du Auswertung kompliziert ist, geht es ohne Converter prima. 
Weil was will man besseres als eine SQL-Datei. ;)

Ich gehe i.d.R. andersherum vor. Ich ziehe die unterschiedlichen 
Datenstrukturen in eine SQL-Datei.

Und mache dann die Abfragen. Das Ergebnis kommt dann in die Tabelle.

Sieh Code oben. ;)

Aber der TO hat ja schon ne Sql-Datei. ;)

von Roger S. (edge)


Lesenswert?

Schlaumaier schrieb:
> Naja, Es kommt auf die Auswertung an.  Da ja eine SQL-Tabelle vorliegt,
> und wenn du Auswertung kompliziert ist, geht es ohne Converter prima.

Das einfaerben einer Zelle geht halt nun mal am besten mit einem 
converter.

> Weil was will man besseres als eine SQL-Datei. ;)
SQL-Datei? Was soll das sein?

> Ich gehe i.d.R. andersherum vor. Ich ziehe die unterschiedlichen
> Datenstrukturen in eine SQL-Datei.
> Und mache dann die Abfragen. Das Ergebnis kommt dann in die Tabelle.

Es ist halt nicht grad 'best practice' ein result set mittels for-loop 
im code behind nochmals durchzuackern und im Zweifelsfall noch weitere 
Kolumnen/Zeilen anzuhaengen. Kann man machen.. Jedem das Seine.

> Sieh Code oben. ;)
Gibt mehr code da oben als man das eindeutig identifizieren koennte.


Cheers, Roger

von Schlaumaier (Gast)


Lesenswert?

Roger S. schrieb:
> SQL-Datei? Was soll das sein?

Naja SQL-Datenbank halt. Datei ist alles ;)

Ich mache eine Abfrage besagter Datenbank. Damit ich nur die Sätze 
bekomme die mich interessieren.

Nun ziehe ich diese (gefilterten) Sätze via For-Next schleife in das 
Datagrid VIEW und gebe wie der TO das will , das Ergebnis der Analyse 
in der letzten Spalte aus. z.b. Rot wenn ein gewisser Wert 
unterschritten ist, grün wenn nicht.

Das ganze ist NUR eine temporäre Anzeige. Deshalb heißt das Teil auch 
VIEW im Namen.

Da der TO in seinen Code eine Connection zu einer SQL-Datenbank aufmacht 
gehe ich davon aus der ein eine hat.

Sollte es sich bei den Daten aber um Abfragen handeln die das Ergebnis 
vom EINMALIGEN AKTUELLEN Auslesen von SMART-Werten sind (darauf lässt 
der Text schließen) dann kann man sich das SQL-Zeug sogar sparen.

Dazu einfach das Datagridview UNBOUND anlegen. Dann hat man eine nackte 
Tabelle. Man füttert sie mit Daten via Direktzuweisung, und hat als 
Ergebnis eine schnelle und chice Anzeige. Nicht mehr und nicht weniger.

Mache ich manchmal wenn ich zu faul bin jede Menge Text/Label-Felder 
anzulegen. ;)

von Roger S. (edge)


Lesenswert?

Schlaumaier schrieb:
> Roger S. schrieb:

> Nun ziehe ich diese (gefilterten) Sätze via For-Next schleife in das
> Datagrid VIEW und gebe wie der TO das will , das Ergebnis der Analyse
> in der letzten Spalte aus. z.b. Rot wenn ein gewisser Wert
> unterschritten ist, grün wenn nicht.

Eben, das kann man sich sparen und in der anzeige machen denn:

Beitrag "Re: C# Wpf DataGrid daten Zeile für Zeile ausgeben"
> Das geht nicht wirklich.
> Du musst die Spalte grundsätzlich erstellen. Und dann halt die Zelle in
> der Spalte nach deiner Bedingung " füllen ". Wie in deinen Beispiel.

Stimmt nicht, wie in meinem Beispiel gezeigt kann man sehr wohl Spalten 
erstellen die es nur in der Anzeige und nicht in der Datenquelle gibt.

---
Es gibt verschiedene Wege ans Ziel, man kann es auch in die SQL Abfrage 
mit rein nehmen, und die Datenbank die klassifizierung machen lassen.

Cheers, Roger

von c-hater (Gast)


Lesenswert?

Schlaumaier schrieb:

> Michael schrieb:
>> Vielleicht solltest du erst einmal die Grundlagen lernen. C# ist nur
>> eine Sprache. Das Framework heißt .net und ob du VB oder C# nutzt, ist
>> völlig irrelevant...
>
> Ich will mal hoffen das du nicht mich gemeint hast. Ich kann VB im
> Schlaf. Und ich übersetzte den Code von C# immer in VB.
>
> ABER, ich mache keine Aussage wo ich mir nicht sicher bin das sie
> funktionieren. Und es wäre möglich da das Datagrid unter c# seine
> Eigenheiten hat.

Kompletter Unsinn. Michael hat vollkommen Recht. Bei der Benutzung 
irgendwelcher Controls spielt es absolut keine Rolle, ob man den Kram in 
C# oder VB.net schreibt. Ist ja auch logisch: Das Control ist doch 
dasselbe.

Und die Sprachen sind (hinter den Kulissen) auch sehr eng miteinader 
verwandt, die auf der "Oberfläche" benutzte Sprache ist ja nur ein 
Frontend für die tatsächlich benutzte Sprache und die ist in beiden 
Fällen dieselbe. Der einzige Unterschied ist, dass ein VB.net einige 
Features nicht verfügbar sind, die es im C#-Frontend gibt. Das 
allerdings sind Sachen, die man zum Zugriff auf Controls weder braucht 
noch benutzt.

> Mein Code oben in C# umzuwandeln ist leicht wenn man C# kann.

Um irgendwas wandeln zu können, muss man schlicht beides können. So wie 
ich...

von Schlaumaier (Gast)


Lesenswert?

c-hater schrieb:
> Um irgendwas wandeln zu können, muss man schlicht beides können. So wie
> ich...

Es geht nicht um Code selbst, es isst die reine Syntax.

In meinen Beispiel muss er halt nur die For-Next schleife in C anpassen 
und jede Menge Klammern verteilen.

Aber in einen gebe ich dir Recht. Die Sprachen nähern sich immer mehr. 
Weshalb meine Aussage um so genauer ist.

Bloß da mich die Erfahrung gelernt hat, das MS gerne schon mal an 
"Kleinigkeiten" bastelt die dann böse Auswirkungen haben, bin  ich mit 
Aussagen die ich nicht beweisen kann vorsichtig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.