Laden...

Forenbeiträge von p!lle Ingesamt 1.040 Beiträge

17.01.2017 - 12:42 Uhr

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).

17.01.2017 - 11:28 Uhr

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

17.01.2017 - 09:59 Uhr

Schöner wäre es erst gar nicht so zu machen sondern gleich MVVM anzuwenden.

Passend dazu: [Artikel] MVVM und DataBinding

17.01.2017 - 09:32 Uhr

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;
}
17.01.2017 - 09:18 Uhr

Du hast doch eine Instanz einer Person, die du als DataContext gesetzt hast. Diese Person kannst du ganz einfach zur Liste hinzufügen.

16.01.2017 - 14:24 Uhr

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.

16.01.2017 - 12:28 Uhr

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?

16.01.2017 - 11:40 Uhr

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.

16.01.2017 - 09:06 Uhr

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.

13.01.2017 - 13:42 Uhr

Kann den Fehler nicht nachstellen.

Kannst du das Projekt mal (in abgespeckter Version) zur Verfügung stellen?

13.01.2017 - 11:31 Uhr

Das ist einfach nur der Namespace. =)

13.01.2017 - 11:24 Uhr

Bist du im MainAppFramework mal direkt auf die Colors.xaml gegangen?

12.01.2017 - 13:44 Uhr

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.

12.01.2017 - 13:09 Uhr

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?

12.01.2017 - 12:42 Uhr

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.

12.01.2017 - 11:38 Uhr

Coffeebean meint, ob du den Eventhandler für das Ticken des Timers angemeldet hat.
Timer.Tick-Ereignis

12.01.2017 - 11:23 Uhr

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.

12.01.2017 - 09:00 Uhr

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.

11.01.2017 - 14:39 Uhr

Idealerweise setzt man FullRowSelect direkt im Designer. 🙂

11.01.2017 - 14:03 Uhr

Das ist ja unabhängig von Listen. 😉

11.01.2017 - 13:56 Uhr

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>();
11.01.2017 - 13:42 Uhr

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.

11.01.2017 - 11:10 Uhr

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.

11.01.2017 - 10:22 Uhr

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

11.01.2017 - 10:17 Uhr

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 😉).

10.01.2017 - 17:20 Uhr

Mal davon ab, dass das Ganze ziemlich frickelig wirkt:

  • ob -1 oder -2 für AutoSize stehen ist mir nicht bekannt
  • hat die erste foreach-Schleife keine Auswirkungen, da die Columns ja leer sind zu dem Zeitpunkt

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

10.01.2017 - 17:02 Uhr

Du kannst der Klasse ColumnHeader ja auch eine Breite mitgeben. =)

10.01.2017 - 16:49 Uhr

Ä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?

10.01.2017 - 16:17 Uhr

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.

10.01.2017 - 14:46 Uhr

Zu deiner ersten Frage:
Du brauchst keine tausend Klassen. Einfach ein foreach über die ColumnHeaderCollection und dann neue Einträge zur ListView hinzufügen.

10.01.2017 - 14:21 Uhr

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. =)

10.01.2017 - 13:37 Uhr

ListView.Columns sollte alle gewünschten Informationen enthalten. =)

10.01.2017 - 11:26 Uhr

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. =)

10.01.2017 - 10:14 Uhr

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?

06.01.2017 - 16:23 Uhr

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.

06.01.2017 - 15:34 Uhr

... und in der while-Schleife fügst du die URLs mit Add zur Liste hinzu. =)

06.01.2017 - 12:29 Uhr

Sir Rufo hat prinzipiell recht, auch wenn wir dieses Mal bei WPF und nicht Windows.Forms sind. 😁Übersicht über WPF-Fenster

06.01.2017 - 11:20 Uhr

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

06.01.2017 - 09:13 Uhr

...die Portale
>
,
>
,
>
und
>
.

Also ich persönlich finde solche Portale immer ein wenig dubios, meistens lasse ich deswegen die Finger davon. 😁

05.01.2017 - 16:08 Uhr

@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.

05.01.2017 - 15:46 Uhr

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. =)

05.01.2017 - 09:00 Uhr

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.).

04.01.2017 - 11:55 Uhr

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. =)

04.01.2017 - 08:34 Uhr

~~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. 👍

03.01.2017 - 17:09 Uhr

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

03.01.2017 - 16:18 Uhr

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?

03.01.2017 - 15:55 Uhr

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... 😉

03.01.2017 - 15:23 Uhr

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. 😁