Ah Danke, da habe ich die Zeile wohl übersehen. An der anderen Stelle hatte ich es ja auskommentiert...manchmal sieht man halt das offensichtliche nicht. Den Link schau ich mir mal an, grad nur überflogen. Als C#-Sprachanfänger wird man anscheinend bei den Lehrgängen oft mit noch veralteter Vorgehensweise an bestimmte Dinge herangeführt...
Hallo, ich habe in einer wpf-Anwendung eine listBox erstellt, mit der Einträge nach oben und unten verschoben werden können. Funktioniert auch alles prima, bis auf 1 kleines Detail:
wenn ich einen Eintrag mehrfach nach unten verschiebe, wird er an der untersten Stelle angekommen und dann erneut auf nach unten verschieben geklickt plötzlich abgewählt und man muss erst wieder einen neuen Eintrag oder den selbigen anwählen. Im Gegensatz zum nach oben verschieben, da bleibt der Eintrag auch ausgewählt, wenn ich ganz oben angelangt bin und versuche ihn erneut nach oben zu verschieben. Es wird lediglich die Meldung ausgegeben, das der Eintrag schon ganz oben ist und er bleibt aktiv. So wie ich es wollte. Mit welchem Befehl kann ich beim nach unten Verschieben an der letzten Position dann den Eintrag ebenfalls selektiert lassen bzw. den gleichen Eintrag erneut ausgewählt haben?
hier erstmal mein soweit funktionierender Code-Auszug aus der MainWindows.xaml.cs:
private void btnNachOben_Click(object sender, RoutedEventArgs e)
{
int index = listBox.SelectedIndex;
if (listBox.SelectedItem == null)
{
statusLabel.Content = "Eintrag auswählen";
return;
}
else
if (index == 0)
{
statusLabel.Content = "Eintrag ist schon ganz oben";
}
else
{
int platzO = index;
index--;
Verschieben(index);
statusLabel.Content = "Eintrag nach oben verschoben auf Platz " + platzO;
}
}
private void btnNachUnten_Click(object sender, RoutedEventArgs e)
{
int index = listBox.SelectedIndex;
if (listBox.SelectedItem == null)
{
statusLabel.Content = "Eintrag auswählen";
return;
}
if (index == listBox.Items.Count - 1)
{
listBox.SelectedIndex = -1;
statusLabel.Content = "Eintrag ist schon ganz unten";
return ;
}
else
index++;
int platzU = index + 1;
Verschieben(index);
statusLabel.Content = "Eintrag nach unten verschoben auf Platz " + platzU;
//listBox.SelectedIndex = -1; //Eintrag wieder abwhählen / deselektieren
// wenn mehrfaches verschieben gewünscht wird, muss die obige Anweisung auskommentiert werden oder
// in einen extra Button "Deselektieren" ausgelagert werden
}
private void Verschieben(int index)
{
Object item = listBox.SelectedItem;
listBox.Items.Remove(item);
listBox.Items.Insert(index, item);
listBox.SelectedIndex = index;
}
Ich hoffe, jemand kann mir einen Tipp dazu geben.
Danke
Noch einmal zum Verständnis: Der Ausgangscode ist in Lektion5.cs. Die im Eröffnungsthread geposteten Codezeilen sollen die Lösung sein, die ein Tutor nicht beanstandet hat und die Note 1 vergeben haben soll. Dies erschliesst sich mir jedoch nicht.
Da ich selber nicht die kompletten Dateien zur Verfügung gestellt bekommen hatte, die im Lehrbuch angegeben waren und die in der Aufgabenstellung aufgeführt sind, konnte ich noch nicht alle Lektion praktisch auch nachvollziehen. Ich werde mir also erst einmal noch aus anderen Quellen Wissen aneignen zu dem Themengebiet.
Ich hatte gehofft, ein wenig "reverse engineering" betreiben zu können und damit das Thema zu verstehen und mit dem Code etwas herumzuexperimentieren, aber das scheint mit den Codeschnipseln nicht zu funktionieren.
wie bereits schon geschrieben: "Mir ist klar, das der Typ erst in der Klasse Düsenflugzeug deklariert wird, aber der Dateipfad soll ja bereits in der Klasse Flugzeug erzeugt werden so wie im Code... "
Die Frage ist also, wenn der Typ erst hier deklariert wird:
class Düsenflugzeug : Starrflügelflugzeug
{
public Airbus typ;
....
wie kann dann auf typ in Flugzeug zugegriffen werden? Muss ich dort auch einen public Airbus typ; einbauen oder geht dies anders? und wenn ich das einbaue, "blendet" dies ja auch den Düsenflugzeug.typ
Also einfach abändern zu: public new Airbus typ; würde das Problem lösen, ich weiss, aber Dies wurde noch nirgends behandelt in den Lehrbüchern! DSaher meine Frage, ob dies anders geht unter den genannten Vorraussetzungen.
Ich kann halt nur das Wissen anwenden, was mir bereits vermittelt wurde. Klar, suche ich nach dem Fehler und versuche ihn zu beheben, aber wie gesagt, ich erwarte eigentlich, dass ich dies mit dem bisherigen Wissensstoff auch erreichen kann....
Und die Codeschnipsel sollten angeblich die Lösung sein und nicht etwas zum Verfollständigen oder ausfüllen.
Mir ist klar, das der Typ erst in der Klasse Düsenflugzeug deklariert wird, aber der Dateipfad soll ja bereits in der Klasse Flugzeug erzeugt werden so wie im Code...
bei b) habe ich ebenfalls in der Methode Schreiber das BinaryWriter Schreiben; eingefügt, damit es funktioniert, bekomme dann aber noch die Fehlermeldung CS0103 "Der Name "typ" ist im aktuellen Kontext nicht vorhanden. sowie die Warung CS0108 Düsenflugzeug.Schreiber()" blendet den vererbten Member "Flugzeug.Schreiber()" aus. Verwenden Sie das new-Schlüsselwort, wenn das Ausblenden vorgesehen war.
Der aktuelle Stand des Projektes im Anhang.
Die im Beitrag geposteten Codefragmente sollen angeblich die Lösung sein oder zumindest ein Teil davon, aber wie gesagt, schon allein im ersten Beispiel habe ich ja schon selbst herausgefunden, dass dem nicht so sein kann. Ich wollte nun mal jemand anderen drauf schauen lassen, um zu sehen, ob die Codefragmente richtig und hilfreich sind oder alles einfach "Mist" ist und voller Fehler steckt.
Wie gesagt, ich bin gerade erst dabei, dieses Kapitel durchzuarbeiten und hatte dabei schon einige organisatorische Probleme und habe mich in der Zeit mal im Netz nach Hilfe dazu umgeschaut... Naja werde ich mich weiterhin mit falschen Dateien, fehlerhaften Code von der Fern-Uni, fehlerhaften Code vom Tutor und fehlenden Dateien und dem was im Lehrbuch steht herumschlagen müssen. Bisher habe ich ganz gut mit der Analyse von bestehendem Code, deren Abwandlung und "sehen was wenn" gelernt, aber wenn schon der Ausgangscode nicht hinhaut und das Programm nicht lauffähig ist, ist das schwierig.
Hallo,
ich versuche gerade in die C#-Programmierung einzusteigen und soll eine etwas umfangreichere (zumindest für mich jedenfalls) Aufgabe erledigen. Leider bekam ich zu dem Lernheft und der entsprechenden Aufgabe falsche Dateien, fehlende Dateien und feherhafte Code-Dateien, das reinste Wirrwar und ich komme trotz Suche im Netz nicht weiter. Da ich schon Wochenlang auf die richtigen Dateien warte und entweder gar keine Antwort bekomme oder Dateien, die ebenfalls nicht hilfreich sind und ich nicht länger warten möchte, hier mein Hilferuf also:
Ich soll aus dem Code von Lektion5.cs (im Anhang) folgende Aufgaben lösen und habe dazu schon etwas im Netz gefunden, was ich aber anscheinend nicht richtig in den Code implementieren kann:
private void Schreiber()
{
Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
Schreiben.Write(SchreibeHeader());
}
b) An welcher Stelle im Programm bauen Sie den Dateipfad zusammen, erstellen den Writer und schreiben den Header?
In der Klasse Flugzeug
public static string path;
public static string Pfad
{
set { path = value; }
get { return path; }
}
public string Dateipfad()
{
DateTime timer = DateTime.Now;
string path;
string SetTime;
SetTime = "" + timer.Day + "-" + timer.Hour + " -" + timer.Minute + " -" + timer.Second + "";
path = Environment.CurrentDirectory + @"\" + kennung + "_" + SetTime + ".bin";
return path;
}
public string SchreibeHeader()
{
string header = "Flug " + kennung + "(Typ " + typ + ") startet an Position " + this.pos.x + "-" + this.pos.y + "-" + this.pos.h + " mit Zielposition " + zielPos.x + "-" + zielPos.y + "-" + zielPos.h + "." + Environment.NewLine + "";
return header;
}
public void Schreiber()
{
Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
Schreiben.Write(SchreibeHeader());
}
c) An welcher Stelle im Programm schreiben Sie die Daten der x-, y- und h-Werte?
In die Transpond Methode. Nachdem die Parameter in int[] Byte geschrieben wurden, werden sie an die SchreibSchleife(Byte) übergeben welche den eigentlichen schreibvorgang durchführt.
public void Transpond(string kennung, Position pos)
{
double abstand = Math.Sqrt(Math.Pow(this.pos.x - pos.x, 2) + Math.Pow(this.pos.y - pos.y, 2));
//if (kennung.Equals(this.kennung))
//Console.WriteLine("{0} an Position x={1}, y={2}, h={3}", kennung, pos.x, pos.y, pos.h);
DateTime timestamp = DateTime.Now;
int[] Byte = { pos.x, pos.y, pos.h };
if (kennung.Equals(this.kennung))
{
Console.Write("{0}:{1}", timestamp.Minute, timestamp.Second);
Console.Write("\t{0}-Position: {1}-{2}-{3}", this.kennung, base.pos.x, base.pos.y, base.pos.h);
Console.Write("Zieldistanz: {0} m\n", Zieldistanz());
SchreibSchleife(Byte);
}
d) An welcher Stelle im Programm schließen Sie den Writer?
Der Writer wird geschlossen sobald das Flugzeug gelandet ist und sich abgemeldet hat.
// Flieger Deregistrierung, Transponder abschalten, Abschlussmeldung
Program.fliegerRegister -= this.Steuern;
Program.transponder -= this.Transpond;
Console.WriteLine("\n{0} gelandet (Zieldistanz={1}, Höhendistanz={2}", kennung, Zieldistanz(), pos.h - zielPos.h);
Schreiben.Close();
e) Wie stellen Sie jeweils sicher, dass diese Operationen nur dann erfolgen, wenn der „Schalter“ in der Programmklasse auf true gestellt ist?
Dies erreiche ich indem ich die Aufrufobjekte „Schreiber(Byte)“ und Schreiben.Close() in eine if (protokollieren) Bedingung setze. Ist der wert „false“ so werden die Objekte nicht aufgerufen. Der Flugschreiber wird ebenfalls mit Program.transponder += Transpond; initialisiert
Geben Sie jeweils den Programmcode an und erläutern Sie kurz Ihre Programmierung.
Hinweis:
BinaryWriter kennt eine Methode
public virtual void Write ( string value )
… die nicht nur den als Parameter anzugebenden String in die Datei schreibt, sondern davor eine Information über die Länge des Strings speichert (vergleichen Sie die .NET-Dokumentation).
BinaryReader kennt eine spiegelbildliche Methode
public virtual string ReadString ()
… die zunächst die in der Binärdatei gespeicherte Längeninformation auswertet und sodann präzise die Länge des nachfolgenden String liest, sodass der Lesezeiger für weitere Leseoperationen genau auf das nachfolgende Byte gesetzt wird.
Soweit also die Aufgabe.
Die Probleme fangen schon an, dass das Writer-Objekt so anscheinend gar nicht funktioniert, zumindest Sagt mir mein Visual Studio dann als Fehler: Der Name Schreiben ist im aktuellen Kontext nicht vorhanden. Erst wenn ich
BinaryWriter Schreiben;
davor setze oder zumindest die Zeile abändere in BinaryWriter Schreiben = new..... dann ist es fehlerfrei. Und so zieht sich das irgendwie alles durch und ich schaffe es nicht, aus den Bruchstücken einen funktionsfähigen Code zu erzeugen.
Nunja, vielleicht kann mir hier jemand helfen. Die anderen Aufgaben habe ich bisher immer gelöst bekommen, aber mit den oben beschriebenen Hürden wirds diesmal anscheinend nichts.
Achja, damit der Code von Lektion 5 funktioniert, im Anhang noch die beiden init-Dateien für den Debug-Ordner als zip.