Auf dem System, wo ich das Tool schreibe wird ja keine Exception geworfen.
...
Auch mit Breakpoints funktioniert es wunderbar und ich kann nichts falsches feststellen.
Die Fehlermeldung besagt ja ganz einfach, dass eine Datei nicht gefunden wird.
Auf deinem System wird sie vorhanden sein, daher gibt es keinen Fehler.
Also musst du die Exception loggen, dann wirst du sehen was fehlt (was nur auf dem anderen Rechner geht).
Fehlermeldung loggen oder ausgeben und dann nachschauen, welche Datei genau fehlt. =)
Vermutlich irgendwas von MySQL.
Zudem schon mal folgender Artikel (hat mit der Exception nichts zu tun):
[Artikelserie] SQL: Parameter von Befehlen
Schöner wäre es erst gar nicht so zu machen sondern gleich MVVM anzuwenden.
Passend dazu: [Artikel] MVVM und DataBinding
Naja, du weißt dann ja, dass der DataContext prinzipiell vom Typ Person ist, also könntest du casten.
[FAQ] Casten aber richtig: () / is / as
Ändert sich der DataContext auf einen anderen Typ, funktioniert die Variante natürlich nicht mehr.
Schöner ist es, wenn du dir die erstellte Person in einem Feld merkst, dann kannst du später damit arbeiten.
private Person _currentPerson;
Konstruktor()
{
_currentPerson = new Person();
DataContext = _currentPerson;
}
Du hast doch eine Instanz einer Person, die du als DataContext gesetzt hast. Diese Person kannst du ganz einfach zur Liste hinzufügen.
Ich hab eine Projektmappe bestehend aus 2 Projekte (die DLLs sind). DLL-A beinhaltet alle Klassen inkl. der Form. DLL-B enthält nur den Aufruf der Form aus DLL-A. In DLL-A binde ich DLL-B ein damit ich die Form aufrufen kann. DLL-B bindet wiederum DLL-A ein damit sie die Form aufrufen kann.
Das ist in der Tat ziemlich kurios.
Wenn die einzige Aufgabe von DLL-B das Öffnen der Form (die allerdings in DLL-A liegt) ist, dann ist mMn das Projekt überflüssig.
Und du baust dir eben einen Ring auf, da A -> B kennen muss und B -> A.
Also entweder du entfernst DLL-B.
Oder du schiebst das Fenster auch in DLL-B. Dann braucht DLL-B keinen Verweis auf DLL-A.
Jetzt bekomm ich nen lustigen Zirkelbezug
Deutet eher auf ein anderes Problem hin.
Bindet denn die andere DLL das Projekt ein, in dem du die DLL wiederum referenzieren willst?
Damit keine falschen Rückschlüsse gezogen werden:
Das "Problem" ist nicht die Form an sich, sondern das ActiveX-Steuerelement:
Single-threaded apartment - cannot instantiate ActiveX control
Why an ActiveX Control on a Managed Window Form Must Be STA-based.
Die Lösung hast du mit der Hilfe von Coffeebean ja schon gefunden.
Die DLL solltest du auf jeden Fall als Referenz hinzufügen, dann brauchst du nicht mit Assembly.Load und Co. arbeiten.
Da ich ReSharper benutze, ist es denkbar, dass dieser zu doof ist die Colors.xaml (SolidColorBrush) richtig zu linken..
Eher unwahrscheinlich.
Schaue mal unter den Properties der Styles.xaml bzw. Colors.xaml nach, was als Build Action eingestellt ist. Page ist hier die richtige Wahl. Manchmal verstellt sich das, z.B. wenn man Resourcen-Dateien kopiert/in andere Projekte zieht.
Kann den Fehler nicht nachstellen.
Kannst du das Projekt mal (in abgespeckter Version) zur Verfügung stellen?
Das ist einfach nur der Namespace. =)
Bist du im MainAppFramework mal direkt auf die Colors.xaml gegangen?
Das findest du am Schnellsten über den [Artikel] Debugger: Wie verwende ich den von Visual Studio? raus.
Beachte außerdem: [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
=)
this.timerAsteroid.Enabled = true;
Auch wenn es wahrscheinlich nicht das Problem löst:
Wenn ein Timer manuell (per Start-Methode) gestartet werden soll, dann muss Enabled
auf jeden Fall erstmal auf false
stehen - ist der Wert true
, startet der Timer sofort.
Du kommst mit den Grundlagen in Zukunft - auch schon in naher Zukunft - definitiv schneller voran, als wenn du für jedes Problem ein neues Thema eröffnest.
Auch sollst du nicht 4 Monate nur Theorie büffeln.
Weiterhin bin ich der Meinung, dass dein Chef von der ganzen Frickelei am Ende wenig bis gar nichts hat und eher die Hände über dem Kopf zusammenschlägt. Stell dir mal vor, ein anderer Kollege muss das Programm mal warten bzw. erweitern.
Was hat dein Chef davon, wenn du auch in Zukunft gar nicht weißt, wie man richtig programmiert?
Mit Copy+Paste wirst du nicht ewig vorankommen.
Warum sprichst du nicht einfach mit deinem Chef und erklärst ihm die Situation?
Ohne die Grundlagen stolperst du allerdings immer nur von einer Frage zur nächsten, ohne tlw. die Antworten überhaupt richtig zu verstehen. Und du ziehst teilweise falsche Rückschlüsse.
Bsp. in diesem Beitrag:
Du wunderst dich, dass im FlowLayoutPanel nur ein Label angezeigt wird - warum das so ist, springt einem allerdings förmlich ins Auge (spätestens mit dem [Artikel] Debugger: Wie verwende ich den von Visual Studio?)
Zudem der falsche Rückschluss mit den Controls.
Es hilft dir, wenn du erstmal die Grundlagen erlernst und festigst.
Auch wenn es am Anfang evtl. eher reine Theorie ist.
Coffeebean meint, ob du den Eventhandler für das Ticken des Timers angemeldet hat.
Timer.Tick-Ereignis
Das war definitiv nicht der Fehler.
Man muss die Controls nicht zur den Controls des Fenster (this!) hinzufügen - evtl. darf man es sogar gar nicht.
Muss meine Aussage revidieren:
Es ist sogar totaler Blödsinn, es zu machen.
Ein Control kann immer nur in einer Controls-Collection sein.
//this == Window
Panel myPanel = new Panel();
TextBox myTextBox = new TextBox();
this.Controls.Add(myTextBox);
//this.Controls.Count 1
//myPanel.Controls.Count 0
myPanel.Controls.Add(myTextBox);
//this.Controls.Count 0
//myPanel.Controls.Count 1
Der Code den du 5 Beiträge vorher gepostet hast, funktioniert so, wie er da steht. Alles wird im FlowLayoutPanel angezeigt.
Najo, du kreierst die controls ja auch nicht 😉
Ja ist mir nach 5 mal Dokumentation durchlesen dann auch aufgefallen ^^
Ähm, was genau meint ihr? 🤔
Der Code aus dem Beitrag funktioniert einwandfrei, sieht lediglich bissel "schief" aus.
Idealerweise setzt man FullRowSelect
direkt im Designer. 🙂
Das ist ja unabhängig von Listen. 😉
Bitte schaue dir an was du kopierst!
Das Codebeispiel (!) von mir ist unvollständig - es fehlt u.a. der Bezeichner und dahinter die Klammern ().
Das sind einfache Grundlagen.
IList<string> columns = new List<string>();
Vor der for-Schleife legst du dir eine leere Liste an.
IList<string> = new List<string>;
In der for-Schleife fügst du die einzelnen Werte mit Add
zur Liste hinzu.
Nach der for-Schleife rufst du auf die Liste ein ToArray()
auf, dann hast du ein string[].
Schaue dir dann auch mal an, was da passiert: [Artikel] Debugger: Wie verwende ich den von Visual Studio?
EDIT:
In deinem Codeschnipsel legst du jedes Mal ein neues Array an, das willst du doch gar nicht.
Außerdem meckert er, weil das Array null sein kann, wenn es keine Spalten gibt.
xKushGene, noch ein kleiner Tipp:
Versuche Dinge, die du kopierst, auch zu verstehen. Ich weiß, dass das am Anfang manchmal schwer fällt (bin selbst ausgebildeter Fachinformatiker), aber nur so kommst du weiter und lernst dazu. =)
Im Fall der AutoResizeColumns
-Methode ist es einfach unsinnig sie 2x direkt hintereinander mit den unterschiedlichen Enum-Werten aufzurufen, da eben einmal das AutoSize anhand des Inhaltes und einmal anhand des Spaltennamen bestimmt wird - der erste Aufruf hat somit keinerlei Auswirkungen.
Bei mir wird übrigens die letzte Spalte auf die restliche verfügbare Breite aufgeteilt, wenn ich die Methode mit ColumnHeaderAutoResizeStyle.HeaderSize
aufrufe, bei ColumnHeaderAutoResizeStyle.ColumnContent
gibt es hinten eine "leere" Spalte.
Grundsätzlich hat das ListViewControl selbst auch eine AutoSize-Methode für sowas - dann brauchst du dafür keine foreach-Schleife.
Da konnte ich leider nichts zu finden, jedenfalls ist im Eigenschaftsfenster nichts zu finden, was mit AutoSize zutun hat.
Methoden findest du auch nicht im EIGENSCHAFTSfenster. 😉
ListView, Stichwort: AutoResize
Wenn du das Objekt - auf welchem Wege auch immer - von außen mit in die Klasse reichst, dann muss sich in meiner Welt die äußere Klasse um das Dispose kümmern, da nur sie weiß, wann das Objekt nicht mehr benötigt wird.
Beispiel:
public class MeineTolleSuperKlasse
{
public MeineTolleSuperKlasse()
{
using (var stream = new FileStream(@"C:\test.txt", FileMode.Open))
{
stream.ReadByte();
//Mache irgendwas
var streamHelper = new StreamHelper(stream);
streamHelper.Reset();
stream.ReadByte();
//Mache irgendwas
}
}
}
public class StreamHelper
{
private readonly FileStream _stream;
public StreamHelper(FileStream stream)
{
_stream = stream;
}
public void Reset()
{
_stream.Position = 0;
}
}
Würde man jetzt hier erwarten, dass sich der StreamHelper um das Dispose kümmern soll?
MeineTolleSuperKlasse ist in deinem Fall der IoC-Container/Castle. =)
EDIT sagt noch, dass es auch Fälle gibt, in denen Objekte in IoC-Containern als SingleInstance erzeugt werden, er wäre katastrophal, wenn die zwischendurch einer abräumt (falls jemand nachfragt: mir ist aktuell kein praktischer Fall bekannt 😉).
Mal davon ab, dass das Ganze ziemlich frickelig wirkt:
Du kannst der Klasse ColumnHeader
ja auch eine Breite mitgeben. =)
Ähm, aus meiner Sicht bringst du gerade eine Menge durcheinander.
Die Kunden sind in der Datenbank Einträge einer Tabelle.
Die Spalten/Columns sind in der Datenbank - wie der Name schon sagt - die Spalten einer Tabelle.
Das Löschen eines Kunden und das Löschen einer Spalte sind doch 2 vollkommen unterschiedliche Dinge.
Willst du also nun wirklich ganze Spalte (INKL. DER DATEN IN DATENBANK!) löschen oder in der Ansicht einfach nur ausblenden?
Du hast doch aber in der ersten ListView auch schon Einträge hinzugefügt, oder nicht? 🤔
Wenn du jetzt also ungefähr sowas hast:
foreach(ColumnHeader header in listView1.Columns)
{
listView2.Items.Add(header.Text);
}
dann werden alle Spaltennamen in der zweiten ListView angezeigt. Bearbeiten etc. dann je nach Geschmack.
Zu deiner ersten Frage:
Du brauchst keine tausend Klassen. Einfach ein foreach über die ColumnHeaderCollection und dann neue Einträge zur ListView hinzufügen.
Naja, das ist ja auch logisch. 😉
Ein ListViewItem ist ein Eintrag der ListView, ein ColumnHeader (die stecken in der ColumnHeaderCollection) eine Spalte der ListView.
Wenn du nun die Spalten in einer anderen ListView als Eintrräge anzeigen willst, musst du sie entsprechend konvertieren. =)
ListView.Columns sollte alle gewünschten Informationen enthalten. =)
Microsoft InfoPath konnte das wohl, was du suchst. Allerdings ist auch die Entwicklung eingestellt worden. Du könntest allerdings mal nach Alternativen zu dem Programm suchen. =)
Damit keine Missverständnisse auftreten:
Du möchtest einfach - so wie z.B. bei Microsoft Access - einfach ein Formular zusammenklicken das mit einer bestimmten Entität arbeitet?
Dimadon0711, wenn du kannst, dann mache erstmal Wochenende. 😉
Du vermischt leider gerade alles.
Der Rückgabewert deiner GetDocumentsAsync-Methode ist Task<IList<string>>
. Mit dem await vor dem Methodenaufruf wird das Ergebnis des Task, also die IList<string>
zurückgegeben. Dein documentValue muss dann natürlich diesen Datentyp haben.
Deine GetDocument-Methode sollte weiterhin einen string
zurückliefern. Hier kannst du mit Count prüfen, ob Einträge gefunden wurden. Wenn ja, kannst du die Einträge der Liste z.B. mit der string.Join-Methode zu einem string zusammensetzen und dann für die Meldung nutzen.
... und in der while-Schleife fügst du die URLs mit Add
zur Liste hinzu. =)
Sir Rufo hat prinzipiell recht, auch wenn wir dieses Mal bei WPF und nicht Windows.Forms sind. 😁Übersicht über WPF-Fenster
und man alle drei Punkte berücksichtigen muss 😄
...und mit this.Focus() und txtb.Focus() nur die ersten beiden Punkte berücksichtigt werden. =)
Befrage Google mal nach "c# focus another application". 🙂
Oder einfach hier: Switch focus to another Application
@Sir Rufo:
Dann wäre doch aber aufgefallen, dass das Schreiben fix geht. 👅
Natürlich gibt es Codeteile, die man direkt "in Verdacht" hat, die kann man auch gerne zuerst messen, allerdings stellt sich dann ja sofort raus, ob sie es sind oder nicht.
In solchen Fällen sollte man immer genau eingrenzen, wo die Zeit tatsächlich verloren geht, um nicht auf die falsche Fährte (hier Schreiben der Datei) gelockt zu werden. 😉
Wenn die Funktion "SammleDatenUndSpeicherSie" eine Minute benötigt und darin vor dem Speichern der Datei erst noch die benötigten Daten gesammelt werden, packt man erst um das Sammeln der Daten seine Stoppuhr (oder was auch immer) und schaut wie schnell das ist - ist es schnell, prüft man den zweiten Block etc.
Hat man einen Block als Zeitfresser identifiziert arbeitet man sich innerhalb des Blocks weiter vor usw. =)
Die Frage ist nicht so einfach zu beantworten.
Was für ein Programm erstellst du denn?
Benötigst du überhaupt die ganzen Kategorien oder gibt es sie nur, weil es sie in anderen Programmen gibt?
Was bietest du für Funktionen an, die "einsortiert" werden müssen?
View und Window gibt es ja auch im Visual Studio, View bezieht sich dabei grob auf die ganzen Views/Fenster die man im VS einblenden kann, Window wiederum enthält dann Funktionen für eine geöffnete View (wie Dock, Hide etc.).
dass die Funktion reader.Read() die letzte Zeile ausließt, aber dann schon ein false zurück gibt.
Read() gibt auch bei der letzten Zeile ein true zurück, ein false gibt es erst, wenn es nichts mehr zu lesen gibt. =)
~~Sorry Taipi88, aber ich finde deine Antwort vollkommen kontraproduktiv.
Wenn er C# haben möchte, dann muss er auch C# schreiben.
Ich schiebe ja auch nicht ein Baguette in den Backofen und wundere mich dann am Ende, dass es keine Pizza wurde.
Denn wie von allen schon richtig festgestellt, es ist ja kein einfaches "läuft nicht", es kompiliert erst gar nicht - und diese ganzen Fehler hätte er alleine beheben können. Die Logik ist ja sogar korrekt gewesen.
Die ganzen Punkte unter "Warum?" hätte er beim Bauen selber herausgefunden.
Aus meiner Sicht ist es ein Schnipsel aus dem Netz, der jetzt von dir für ihn übersetzt wurde.
Ich bin raus. 🙄~~
EDIT²:
Nach den ganzen Hinweisen auf die allgemein falsche Syntax, hat Taipi88 nun auch konkret auf die falschen Stellen hingewiesen. Damit sollte Henri den Code wohl zum Laufen kriegen. 👍
Nein, weil der Lerneffekt dann gleich 0 ist. =)
Mir ist auch nicht ganz klar, warum du Java schreibst [1], wenn du C# möchtest, unabhängig davon, dass du dich mit Java besser auskennst. Andersrum würde man ja auch kein C# schreiben, wenn man Java machen will.
Man sucht sich stattdessen die entsprechenden Befehle der anderen Programmiersprache heraus um seinen Code zu schreiben und vor allem zu lernen.
Spätestens wenn es nicht kompiliert, schaut man doch nach, was falsch ist.
Der Code ist ja prinzipiell sogar richtig, nur eben mit falscher Syntax. 😉
[1] Als Ausgangsbasis macht es evtl. Sinn, um es danach Stück für Stück zu übersetzen
Es lag daran, dass ich im Style den Hintergrund mit einer Farbe gefüllt habe, welche die UserControls überdeckt hat.
Ähm, hä? 🤔
Kannst du das mal kurz zeigen?
Der Code funktioniert ohne Probleme - wenn man ihn auf C# umschreibt und kompilierbar macht. 😉
diese strings zusammenführen (funktioniert mit dem + - Operator)
Besser: String.Concat
Nur die startNnr (wieso nicht "startNr"?) ist int
Dadurch, dass auf der linken Seite vom "+" ein string steht, nutzt der Compiler den entsprechenden Operator der String-Klasse (+(string left, object right)
), dadurch funktioniert es einwandfrei.
EDIT sagt noch: also unter C# funktioniert es so. Der oben stehende Code ist Java, evtl. ist das Verhalten da anders... 😉
Leider ohne Antwort, aber vllt. noch ein Ansatz:
MySQL Forums :: Connector/NET and C#, Mono, .Net :: MySqlConnection.GetSchema for Columns
Bei deiner ersten Variante wurde das "ausgewählte" Control nie im TabControl angezeigt, dadurch kann es sein, dass es ging. Der Style des TabControls hat vermutlich nur die Header angezeigt.
Nun möchtest du die Controls (logischerweise) direkt im Tab anzeigen, aber siehst nichts.
Vermutung: nimm mal den gesetzten Style raus. =)
Tipp:
Bei solchen Problemen immer Minimalanwendungen bauen, um das Problem zu verstehen. Hier wäre es eine dumme Anwendung mit einem TabControl und einem Tab + TextBox oder so gewesen, dann hättest du gesehen, dass es auf jeden Fall geht. 😁