Autor |
Beitrag |
greentiger
      
Beiträge: 33
|
Verfasst: Fr 16.12.11 22:04
Guten Abend!
Ich möchte ein Programm schreiben, dass mir Informationen über bestimmte Filme liefert.
Jedoch gibt es ein Problem beim Aufrufen der library.
themoviedbapi.codeplex.com/documentation
TheMovieDBLib.dll habe ich als Verweis hinzugefügt + using Verweis aber irgendwie kann er mit
TmdbAPI api = new TmdbAPI("apikey");
nichts anfangen?
MfG greentiger
Zuletzt bearbeitet von greentiger am Fr 16.12.11 22:22, insgesamt 3-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 16.12.11 22:15
Was heißt "damit kann er nichts anfangen"? Wenn eine Fehlermeldung kommt, ist es nützlich, sie hier mit anzugeben 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Fr 16.12.11 22:22
Ganz vergessen
Fehlermeldung: "Der Typ- oder Namespacename "TmdbAPI" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)"
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Fr 16.12.11 22:42
Hi,
auf Groß-und-Kleinschreibung muss man schon achten. Denn es heißt:
C#-Quelltext 1:
| TmdbApi api = new TmdbApi("apikey"); | Okay, in der Doku steht es falsch, aber mit IntelliSense kriegt an das ja schnell raus.
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Fr 16.12.11 22:49
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Sa 17.12.11 20:31
TmdbMovie[] movies = api.MovieSearch("batman");
Fehlermeldung:
Der Typ System.Collections.Generic.IEnumerable<TheMovieDb.TmdbMovie>" kann nicht implizit in "TheMovieDb.TmdbMovie[]" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
In was soll ich sie umwandeln?
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Sa 17.12.11 20:55
Auch wenn das hier immer mehr in einen Thread mit vielen Themen ausartet:
Du kannst das IEnumerable mit der Erweiterungsmethode ToArray() in ein Array konvertieren. Du könntest movies aber auch gleich in einer foreach-Schleife durchlaufen.
Zuletzt bearbeitet von Yogu am Sa 17.12.11 21:20, insgesamt 1-mal bearbeitet
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Sa 17.12.11 21:06
Danke, habe es einfach mit toArray() gelöst.
Die Doko sollte auch einmal überarbeitet werden
Edit: würdest du es mit einer foeach Schleife so lösen?
C#-Quelltext 1: 2: 3: 4:
| foreach (string elemente in movies) { textBox1.Text = elemente; } |
MfG
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Sa 17.12.11 21:19
greentiger hat folgendes geschrieben : | würdest du es mit einer foeach Schleife so lösen?
C#-Quelltext 1: 2: 3: 4:
| foreach (string elemente in movies) { textBox1.Text = elemente; } |
MfG |
Die Elemente sind nicht vom Typ string, sondern TmdbMovie, und die Variable hieße besser element. Davon abgesehen, ja.
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Fr 23.12.11 19:44
Möchte jetzt gerne so vorgehe, dass ich alle gefunden Filme ausgeben und den richtigen Film auswählen kann, anschließend sollen die Infos über den Film erscheinen.
1. Wollte alle gefunden Filme einmal in der textbox1 ausgeben, jedoch kommt er aus der Schleife nicht mehr heraus, die Namen werden richtig aufgerufen aber das Form1 öffnet sich nicht, Fehlermeldung gibt es keine:
C#-Quelltext 1: 2: 3: 4:
| foreach (TmdbMovie element in movies) { textBox1.Text += element.AlternativeName.ToString(); } |
2. Wie könnte ich das machen, dass beim Klicken/Enter auf den richtigen Film, dass Array bekomme wo der Name gespeichert ist um später die Informatione auszugeben?
Besten Dank im Voraus.
MfG greentiger
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Fr 23.12.11 20:32
greentiger hat folgendes geschrieben : | 1. Wollte alle gefunden Filme einmal in der textbox1 ausgeben, jedoch kommt er aus der Schleife nicht mehr heraus, die Namen werden richtig aufgerufen aber das Form1 öffnet sich nicht, Fehlermeldung gibt es keine |
Der Code sieht gut aus. Was passiert denn, wenn du einen Haltepunkt setzt und dich per Einzelschritt durcharbeitest? Wo genau hängt er sich da auf?
greentiger hat folgendes geschrieben : | 2. Wie könnte ich das machen, dass beim Klicken/Enter auf den richtigen Film, dass Array bekomme wo der Name gespeichert ist um später die Informatione auszugeben? |
Ich würde vorschlagen, statt der TextBox eine ListBox zu nehmen und einen Eintrag für jeden Film hinzuzufügen. Dann kannst du im SelectedIndexChanged-Ereignis den Namen des neuen Films ermitteln. Das Array muss dann natürlich ein Feld des Formulars sein.
Besser wäre es, eine eigene kleine Klasse zu schreiben, die eine Instanz von TmdbMovie hält und über die Methode ToString den Wert von AlternativeName zurückgibt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| class MovieListItem { public MovieListItem(TmdbMovie movie) { Movie = movie; }
public TmdbMovie Movie {get; private set; }
public string ToString() { return Movie.AlternativeName.ToString(); } } |
Statt dem Namen kannst du nun Instanzen dieser Klasse zur ListBox hinzufügen. In der SelectedIndexChanged-Routine kannst du SelectedItem dann in ein MovieListItem zurückkonvertieren und auf das TmdbMovie-Objekt zugreifen:
C#-Quelltext 1: 2:
| MovieListItem listItem = (MovieListItem)listBox1.SelectedItem; TmdbMovie movie = listItem.Movie; |
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Fr 23.12.11 20:56
Danke für deine Antwort, werde mich über die Feiertage damit bemühen
Yogu hat folgendes geschrieben : |
Was passiert denn, wenn du einen Haltepunkt setzt und dich per Einzelschritt durcharbeitest? Wo genau hängt er sich da auf?
|
Ich habe es vorher schon mit Breakpoints getestet, die Filmergebnisse werden richtig abgerufen und auch ausgeben(Messagebox bzw TB1), jedoch ist nach der Schleife schluss. Letzter Wert ist null(siehe Bild) dann müsst er aus der Schleife gehen -> Programm schließt sich.
dl.dropbox.com/u/178...00/Filmdatenbank.bmp
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 23.12.11 21:01
Hallo greentiger,
ein Nullwert kann ja auch nicht als String ausgegeben werden, d.h. du mußt explizit auf 'null' testen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Fr 23.12.11 21:03
greentiger hat folgendes geschrieben : | Letzter Wert ist null(siehe Bild) |
Da ist element.AlternativeName null, und du rufst element.AlternativeName.ToString() auf - das löst eine NullReferendeException aus, und deshalb wird das Formular nicht angezeigt. Du müsstest abfragen, ob denn AlternativeName null ist.
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: Sa 24.12.11 18:34
Okay, Danke.
Wenn ich null abfange werden alle Filme korrekt ausgegeben.
Empfehlung von Yogu eine Klasse zu erstellen.
Habe jetzt die Klasse erstellt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class MovieListItem { public MovieListItem(TmdbMovie movie) { Movie = movie; }
public TmdbMovie Movie { get; private set; }
public string ToString() { return Movie.AlternativeName.ToString(); } } |
Aufruf:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TmdbApi api = new TmdbApi("Key"); TmdbMovie[] movies = api.MovieSearch("batman").ToArray(); foreach (TmdbMovie element in movies) { listBox1.Items.Add(new MovieListItem(element)); } |
Er gibt mir ganz was anderes aus(Projektname).
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 25.12.11 11:29
Hallo,
schau dir mal die Warnung an (oder hast du die etwa ausgeschaltet bzw. nicht gesehen?).
Yogu hatte noch einen kleinen Fehler in seinem Code...
Die Lösung dazu überlasse ich dir als Weihnachtsaufgabe 
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 25.12.11 13:20
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: So 25.12.11 13:57
Th69 hat folgendes geschrieben : |
schau dir mal die Warnung an (oder hast du die etwa ausgeschaltet bzw. nicht gesehen?).
|
Der Code ist so wie oben gepostet, bekomme aber keine Warnung.
Edit: Meinst du dies hier?
C#-Quelltext 1: 2: 3: 4:
| public new string ToString() { return Movie.AlternativeName.ToString(); } |
Bei der Ausgabe hat sich jedoch nichts geändert.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 25.12.11 14:10
greentiger hat folgendes geschrieben : | Der Code ist so wie oben gepostet, bekomme aber keine Warnung. |
Die Warnung ist bei mir jetzt tatsächlich auch nicht gleich gekommen, und als sie dann da war, ist sie nach dem nächsten Compilieren wieder verschwunden. Wie dem auch sei, so lautet sie:
Zitat: | "MovieListItem.ToString()" blendet den vererbten Member "object.ToString()" aus. Damit der aktuelle Member diese Implementierung überschreibt, fügen Sie das override-Schlüsselwort hinzu. Ansonsten fügen Sie das new-Schlüsselwort hinzu. |
greentiger hat folgendes geschrieben : | Meinst du dies hier?
C#-Quelltext 1: 2: 3: 4:
| public [b]new[/b] string ToString() { return Movie.AlternativeName.ToString(); } |
Bei der Ausgabe hat sich jedoch nichts geändert. |
Richtige Baustelle, falsches Baumaterial  Du willst keine neue ToString-Methode erstellen, sondern die vorhandene überschreiben, sodass statt der Methode von object deine aufgerufen wird. Also ist override das richtige Schlüsselwort.
|
|
greentiger 
      
Beiträge: 33
|
Verfasst: So 25.12.11 14:37
Okay.
Es kann ja jetzt immer noch null zurückgegeben werden umd das abzufangen hätte ich try and catch verwendet und die Exception gibt den string "null" zurück.
Jedoch brauch ich diesen Wert nicht in der Ausgabe, wie könnte ich verhindern das der Wert ausgegeben wird?
Ich dachte mir ich könnte das Item löschen, bzw abfragen wenn es "null" ist das es nicht erstellt wird, jedoch klappt das nicht so gut, was wäre in diesem Fall die optimale Lösung?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| public override string ToString() { try { return Movie.AlternativeName.ToString(); } catch (NullReferenceException) { return "null";}; } |
|
|