PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : vb.net Wert durch Bild ersetzen


tsaG
2008-03-29, 12:36:39
Ich habe eine .xml Datei aus der ausgelesen und dann eine Tabelle erstellt wird (datagridview).

Ich möchte so sachen wie map, areaid und permissions aber garnicht anzeigen lassen. Wenn ich jedoch bei DataGridView.DataMember bspw nur "name" eintrage, gibt es bei der Ausführung einen error :

Argument Exception wurde nicht behandelt
Die untergeordnete Liste für das Feld name kann nicht erstellt werden.

Wenn ich jedoch im Data Gridview unter Coloums direkt die Spalten definiere, bekomme ich schon beim Kompilieren folgenden Error:

Der Wert vom Typ "String" kann nicht in "System.Data.DataTable" konvertiert werden.


Das ist der Code des Buttons, welcher das Datagridview mit daten füllt.

DataGridView1.Show()
Dim filePath As String = "http://google.de/beispiel.xml"

DataSet.ReadXml(filePath)

DataGridView.DataSource = AuthorsDataSet
DataGridView.DataMember = "gmplr"


Beispiel.xml Datei
<gmplr>
<name>Teal</name>
<race>1</race>
<class>2</class>
<gender>0</gender>
<pvprank>2</pvprank>
<level>70</level>
<map>449</map>
<areaid>1519</areaid>
<ontime>0 hours, 7 minutes, 20 seconds</ontime>
<latency>48</latency>
<permissions>xp</permissions>
</gmplr>
<gmplr>
<name>Saren</name>
<race>11</race>
<class>7</class>
<gender>0</gender>
<pvprank>1</pvprank>
<level>70</level>
<map>555</map>
<areaid>3688</areaid>
<ontime>0 hours, 38 minutes, 36 seconds</ontime>
<latency>58</latency>
<permissions>xp</permissions>
</gmplr>
<gmplr>
<name>Quade</name>
<race>6</race>
<class>1</class>
<gender>0</gender>
<pvprank>1</pvprank>
<level>38</level>
<map>0</map>
<areaid>1682</areaid>
<ontime>1 hours, 49 minutes, 9 seconds</ontime>
<latency>77</latency>
<permissions>p</permissions>
</gmplr>


EDIT:

2tens wäre noch das ich Werte in der spalte "race" durch ein bild ersetzen möchte. Also wenn in der Spalte "race" der Wert 2 auftaucht soll er durch bild.gif ersetzt werden.. wie mache ich das denn? o0

Monger
2008-03-29, 13:03:00
Hm...

Wenn du als Quelle ein DataSet wählst und dieses befüllst, muss dieses DataSet ein bestimmtes Schema haben. Hast du dieses Schema angelegt?

Ein DataSet ist eine Sammlung von DataTables, in deinem Fall heißt die Tabelle "gmplr". Gerade Visual Studio bietet einem ja an, alles sehr schön über die graphische Oberfläche zu machen. Sich das Schema im Code zusammenzufriemeln und dann nochmal im DataGridView, ist oftmals hässlich.

Füg in deinem Projekt einfach mal eine DataSet Datei hinzu. Leg dann über den grafischen Editor eine Tabelle mit name, race, class etc. an. Dann klick in der DataGridView im Editor auf diesen kleinen schwarzen Pfeil, und wähl als Datenquelle aus dem DataSet eben die Tabelle "gmplr" aus - dann brauchst du nicht eine einzige Zeile Code zu schreiben, und das sollte dann auch so gehen. Jetzt kannst du ja spaßeshalber mal ein paar Daten ins Grid reinklopfen, und es speichern, und dir dann die dazu passende XML Datei anschauen. Oder eben die Tabelle (auch die hat ein "ReadXML") bzw. das DataSet laden, und schauen ob irgendwas ankommt.

Ist ein großes Thema, probier es erstmal Stück für Stück aus. Aber ich vermute, dass deine erste Exception daher stammt, dass eine Tabelle eben kein Dataset ist, und deshalb es bei so einer Zuweisung kracht.

tsaG
2008-03-29, 13:54:33
Also, wenn ich aus dem Ausgangstatus von oben (als Data Source ist nichts angegeben), jetzt im Datagridview die Source auf DataSet stelle, zeigt Datagridview garnichts an.

Okay, wenn ich dann aber im Datagridview eine Tabelle erstelle kommen folgende Fehler:

Der Wert vom Typ "String" kann nicht in "System.Windows.Forms.DataGridViewTextBoxColumn" konvertiert werden.

und

WithEvents Variable "name" verursacht einen Konflikt mit property "name" in Basis-class "Control" und sollte als "Shadows" deklariert werden.

Wenn ich aus dem Ausgangstatus von oben ( keine Tabellen sind im Dataset definiert) auch nur eine Tabelle über den Editor definiere. Markiert er DataGridView.DataMember = "gmplr" im Quellcode Gelb und sagt "Die untergeordnete Liste für das Feld gmplr kann nicht erstellt werden."

Dann habe ich in den Optionen des DataSets mal GenerateMember auf False gestellt weil ich mir gedacht habe das er dadurch keine Tabellen selbst generiert sondern nur diese nimmt, welche ich auch im Data Set angelegt habe....
Dann war ich jedoch völlig perplex das 2 Komplett andere Fehler entstanden o0

Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.

und

"DataSet" ist ein Typ und kann nicht als Ausdruck verwendet werden.



Wenn ich jetzt nochmal alles Lösche und komplett neu anfange. Gibt es da ein Guide wie es genau funktioniert? Ich hab mir das teilweise aus ein paar msdn guides gezogen, welche aber auch nicht wirklich das bewirken sollten, was ich haben wollte...

gr@fz@hL
2008-03-29, 14:05:19
DataGridView ist lediglixh das Control-Objekt, sprich das Gitter, dass gezeichnet wird. Als Datasource musst du eine DataTable festlegen, die wiederrum Bestandteil eines Datasets ist. Seiten und Onlinehilfen gibt es dazu haufenweise, google ist dein Freund ;).

Gast
2008-03-29, 14:13:44
Bei DataMember darfst du nicht "Name" eintragen. Wenn du nur den Namen anzeigen lassen willst, erstellst du einfach eine DataGridViewColumn (kannst du leicht über den VS Designer im Eigenschaftsfenster machen).
Die Eigenschaft DataMember vom DataGridView ist nur dazu da, wenn du ein Objekt an das DataGrid bindest, dass mehrere Auflistungen enthält. Also z.B. ein DataSet mit mehreren DataTables.

Gast
2008-03-29, 14:15:21
^^ habe ich ganz und gar vergessen, bei der DataGridViewColumn gibt es eine Eigenachaft DataPropertyName, dieser du dann den Wert "Name" zuweisen müsstest.

Monger
2008-03-29, 14:22:25
Wenn man erstmal weiß wie es geht, ist es ganz simpel. In Visual Studio geht das alles direkt im grafischen Editor. Ich weiß nur nicht wie ich dir das textuell erklären soll...

Wir brauchen in diesem Forum dringend ein Whiteboard! :ugly:

tsaG
2008-03-29, 15:12:06
Evtl wäre dann ein Screenshot howto nicht schlecht xD
Oder ein Link zu einer Webseite, habe gegoogelt aber nichts gefunden....


Bei DataMember darfst du nicht "Name" eintragen. Wenn du nur den Namen anzeigen lassen willst, erstellst du einfach eine DataGridViewColumn (kannst du leicht über den VS Designer im Eigenschaftsfenster machen).
Die Eigenschaft DataMember vom DataGridView ist nur dazu da, wenn du ein Objekt an das DataGrid bindest, dass mehrere Auflistungen enthält. Also z.B. ein DataSet mit mehreren DataTables.
^^ habe ich ganz und gar vergessen, bei der DataGridViewColumn gibt es eine Eigenachaft DataPropertyName, dieser du dann den Wert "Name" zuweisen müsstest.

Wenn ich das mache zeigt er mir garnichts an, also es tut sich nichts.

Gast
2008-03-29, 15:22:04
Das obilge Xml Dokument ist sowieso ungültig, da kein Root Element vorhanden ist.

tsaG
2008-03-29, 15:24:00
So, habs hinbekommen.. fragt mich nicht was ich falsch gemacht hab, aber es läuft nun endlich :D

Jetzt kommt nurnoch das "problem" mit dem Werte durch bilder ersetzen.

Gast
2008-03-29, 15:40:17
Da gibt es letztendlich mehrere Wege. Am einfachsten geht das über das CellFormatting Event vom DataGridView.
Du erstellst also erst einmal für das DataGridView eine DataGridViewImageColumn, das kannst du auch bequem über das Eigenschaftsfenster machen.
Im CellFormatting Event machst du dann z.B. eine if Abfrage auf den ColumnIndex, damit der behandelnde Code eben nur bei der Bildspalte ausgeführt wird. Dann holst du dir erst mal die gebundene DataRow (weil du das ja in ein DataSet geladen hast) der aktuellen DataGridViewRow. Habe das zwar nicht getestet, aber es solle in etwa so aussehen:


private void DataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 1) // 1 = zweite Spalte im DataGridView = Bildspalte
{
DataRow row = (DataRow)((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem).Row;

if ((int)row["pvprank"] == 1)
{
Image img = Image.FromFile("");
e.Value = img;
}
}
}

Monger
2008-03-29, 16:43:53
Und da ich mal vermute, dass diese Bilder statisch in dein Programm eingebettet sein sollten, packst du die geschickterweise in die Resources Datei. Das macht die Verwendung darin dann doch sehr hübsch unkompliziert.
So ungefähr müsste das dann aussehen:

e.Value = My.Resources.Bild1

tsaG
2008-03-29, 18:00:32
Sorry für meine dreistigkeit, aber geht das auch in vb.net? Wenn ich den unten genannten Code in vb.net einfüge gibts "ein paar" fehler ;D

Gast
2008-03-29, 19:00:04
^^ Der Code ist in C# geschrieben, musst du natürlich noch in VB umwandeln. Ein wenig kannst du ja auch selbst machen ;)

tsaG
2008-03-29, 19:25:23
hrhr, okay ich hab vor 3 Tagen mit vb angefangen, aber ich versuchs mal X-D

tsaG
2008-03-29, 21:27:19
Sry für doppeltpost. Aber der Browser in .net benutzt ja leider Standartmässig den IE . Gibt es eine möglichkeit den Firefox zu benutzen, weil ansonsten ein script nicht funktioniert?

Monger
2008-03-29, 22:41:36
Hä? Was konkret hast du denn vor ???

Und was genau meinst du mit "Browser in .NET"? Was genau machst du denn?

Bietchiebatchie
2008-03-30, 01:58:11
Ich gehe mal davon aus, dass er den System.Windows.Forms.WebBrowser meint - was in der Tat eine .net-Kapselung des IE's ist.
Und nein natürlich kannst du nicht einfach den IE durch den FireFox ersetzen; maximal könnte es eine .net api für firefox o.ä. geben. Ohne jetzt danach gegooglet zu haben schätze ich die Chancen eher schlecht, dass sowas existiert.

tsaG
2008-03-30, 01:58:25
Joa, es gibt duch in .net dieses Webbrowser tool.

Code des Buttons, mit dem wird dem Browserfenster der Befehl gegeben es soll auf google.de gehen. Dann der Timer gestartet und der ladebalken sichtbar gemacht
browser.browserfenster.Navigate("http://www.google.de")
Hauptmenü.preload.Enabled = True


hier die Anweisung des Ladebalkens, wenn Ladebalken voll, dann wird der Timer gestoppt, der Ladebalken wieder auf 0 gesetzt und das browserfenster gezeigt. Das danach sagt das der ladebalken wenn er aktiv ist angezeigt und inaktiv ausgeblendet wird.

ladebalken.Value = ladebalken.Value + 10
If ladebalken.Value = 100 Then
preload.Enabled = False
ladebalken.Value = 0
browser.Show()
If ladebalken.Value > 1 Then ladebalken.Show()
If ladebalken.Value < 1 Then ladebalken.Hide()
End If

Das ganze ist ziemlich simpel aufgebaut, so wie ich es mag. Bin stolz auf mich das ich das hinbekommen hab xD

tsaG
2008-03-30, 19:38:16
So, dann noch eine Frage.

Ich möchte gerne in das Programm ein Newsfenster einbauen. Wie macht man sowas am besten? Ich hab das mal mit einer xml Datei ausprobiert welche dann über ein Datagrid und Datagridview angezeigt wird. Das ganze geht denklich schlecht da ja nur eine Reihe angezeigt werden kann....


Funktioniert das auch mit einer Textbox, sowas wie TextBox1.DataBindings.Add(datagrid) oder so ähnlich (wobei ich jetzt nicht weiss was contains macht ^^)? Über Datamember verfügt die Box ja leider nicht X-D

Oder ist da eine Textdatei besser? o0

Also die News kommen auf einen Webserver, diese kann das Programm dann aufrufen.