Laden...

Forenbeiträge von S.R. Ingesamt 221 Beiträge

24.05.2008 - 12:19 Uhr

Hi,

die Log-Dateien habe ich schon längst drin, aber die haben mir bisher leider recht wenig geholfen. Habe beim Beenden eines Threads ein Log hingemacht und laut meiner Analsyse wird jeder Thread geschlossen, was eigentlich dazu führen sollte, dass nichts mehr passiert.

Daher habe ich das Gefühl, dass während eines Threads irgendwas passiert, was sich net beendet und weiter luäft, auch nachdem der Thread tot ist.

Ich hab mir mal den "http://dotnet.jku.at/projects/Prof-It/" Profiler runter geladen. Nicht das ich wüsste, wie man damit umgeht, aber was nicht ist, dass kann ja immerhin noch werden 🙂

Ich melde mich, sobald ich neue Erkenntnisse habe. Vielen Dank

Stefan Runkel

24.05.2008 - 10:35 Uhr

Hallo,

ich habe mir hier einen kleinen Service geschrieben, der auf mehreren Ports auf TCP-Verbindungen warten. Kommt n' Connection, wird diese einem Thread zugewiesen, dann baut dieser Thread eine Verbindung zu DB auf und gibt, je nach Inhalt des Streams, Werte aus der DB zurück und beendet sich. Soweit klappt dies auch wunderbar.

Habe den Service jetzt mehrere Stunden und Last auf einem Server laufen lassen und das Problem ist jetzt, dass nach einer gewissen Zeit, die CPU-Last steigt und auch nicht mehr runter geht. Ich habe alle Clients, die die TCP-Verbindung aufbauen, beendet und trotzdem geht die Last nicht mehr runter. Daher gehe ich davon aus, dass der Service irgendwo hängt, ein Thread Mist baut oder es halt was ganz anderes ist.
Daher habe ich den Service in VS gestartet und dann mehrere Clients alle paar Sekunden drauf zugreifen lassen. Nach ein paar Minuten ist auch hier das Phänomen erkennbar und somit reproduzierbar.

Meine Frage ist jetzt: wir kriege ich am leichtesten raus, was der Service gerade macht. An den kritischen Stelle habe ich mal, nachdem die Clients abgeschaltet waren, ein paar Breakpoints gesetzt, aber ich find einfach keine Stelle, an denen das Programm hängt.

Hat jemand n' Idee, wie ich das mal besten Debuggen kann damit ich es dann anschließend fixen kann.

Dankend

Stefan

24.05.2008 - 08:56 Uhr

Hallo,

vielen Dank für die Info. Für alle, die sich vielleicht auch mal mit der Thematik befassen müssen/dürfen/wollen, hier ein interessanter Link von MS:

http://msdn.microsoft.com/de-de/library/bb979195.aspx

Der hat mir zum Verständnis viel geholfen. Werde jetzt mal schauen, ob das auch programmiertechnisch alles so klappt, wie ich mir das vorstelle 🙂

Bis dahin

Stefan

23.05.2008 - 17:59 Uhr

Hi,

jup - das hab ich jetzt auch so verstanden. Hab die wichtigsten Code-Teile durchforstet und überarbeitet. Mal sehen, wie viel Speicher die Anwendung jetzt auf längere Zeit verbraucht. Werde ich jetzt im Auge behalten und dann entscheiden, wo man noch was optimieren kann 🙂

Dankend

Stefan

23.05.2008 - 17:26 Uhr

Hallo,

bei uns gibt es einen Service und einen Client, die über eine TCP-Verbindung miteinander kommunizieren. Dies läuft auf Server-Seite im Groben wie folgt ab:

Listener = new TcpListener(this.IP, this.Port);
TcpClient Connection = this.Listener.AcceptTcpClient();
StreamReader SR = new StreamReader(this.Connection.GetStream());
StreamWriter SW = new StreamWriter(this.Connection.GetStream());

Darüber lassen sich dann Daten ohne weiteres hin und her schieben. Das klappt wunderbar. Jetzt soll diese Anwendung aber so erweitert werden, dass der Client auch über das Internet direkt auf den Server zugreifen kann. Technisch gesehen funktioniert dies bereits. Problem ist nur die Sicherheit, da bisher alles im Klartext verschickt wird. Plan ist jetzt, das ganze (= die gesamte TCP-Verbindung) mit SSL/TLS abzusichern.

Wie dies theoretisch funktioniert, habe ich so weit verstanden:

  1. privaten Key für Server erstellen
  2. signierten Public-Key (= Zertifikat) von W2K3-CA erstellen lassen
    => beide Dateien müssen der Server-Applikation zur Verfügung stehen.
    => der public Key (= Zertifikat) steht dann auch dem Client zur Verfügung. Diesem Zertifikat muss er vertrauen (bzw. seinem Erzeuger oder Vorfahre)

Vom Aufbau soll dies dann so funktionieren:

  • Client baut Verbindung auf
  • Server schlüsselt seine Antwort
  • Server verschickt die Antwort
  • Client erhält verschlüsselte Daten
  • Client entschlüsselt die Daten
  • Server beendet die Verbindung

Kennt jemand ein gutes HowTo, wie ich dies mit C#-Board-Mitteln umgesetzt kriegen. Habe zwar schon einige Code-Schnipsel im NEtz gefunden, aber leider so das Wahre war nicht dabei. Bin für jeden Tipp dankbar.

Bis dahin

Stefan

23.05.2008 - 14:15 Uhr

Hi,

danke - damit hab ich erst Mal genügend Stoff zum Lesen 🙂

Bis dahin und noch Mal n' besten Dank

Stefan

23.05.2008 - 12:09 Uhr

Hallo,

habe mir den Reflector gerade mal runter geladen und darein mein schönes Programm geladen - dieses hatte ich im Release-Modus compiliert.

Ich kann ja alle Funktionen öffnen, mir anschauen, was ich da mache - alles ohne Probleme. Das kann doch nicht der Sinn sein, oder? Damit ist ja jedes Betriebsgeheimnis gelüftet, man kopiert einfach den Code und jeder andere kopiert sich die Sachen da raus. Das kann's doch net sien...

Bin grad echt was verwirrt, dass es so einfach gehen sollte, den Code wieder herzustellen. Das muss man doch verhindern können, oder nicht?

Dankend

Stefan

23.05.2008 - 11:49 Uhr

Hallo,

vielen Dank für deine Antwort. Bis vor rund zwei Stunden kannte ich IDisposable gar nicht, daher haben meine Klassen diesen Konstrukt gar nicht - somit auch keine Dispose-Funktion.

In dem Service werden neben meinen eigenen Klassen ausschließlich die .net Klassen verwenden. Wie kriege ich denn am leichtesten/schnellsten raus, ob diese .net Klassen, die ich verwende IDisposable sind. Wenn ich wüsste: Klasse X benötigt Dispose, dann könnte ich ja dann relativ schnell schaue, wo diese Klasse erzeugt wird und wo ich die dann noch schlauerweise frei geben sollte.

Vielen Dank

Stefan

23.05.2008 - 11:40 Uhr

Hallo,

ich habe hier n' "kleinen" C#-Service, der jetzt noch 4 Tagen Dauerbetrieb sich beendet hat, mit der Meldung "System.outofmemoryexception". Erst war ich was verwundert, weil ich dachte, die von C# eingesetzte GC übernimmt dies für mich. Hier lag ich nach heute durchgeführte Recherche doch was falsch 🙂
Habe mich jetzt etwas mehr mit GC beschäftigt und bin dabei, meinen Code durchzugehen, um Schwachstellen auszubessern. Dazu habe ich aber noch eine Frage:

Wenn ich in einer Funktion ein XML-Objekt (nur so als Beispiel, es gehen natürlich auch andere Klassen) benötige, dann definiere ich dies ja lokal in der Funktion. Muss ich dies dann auch wieder am Ende der Funktion auf null setzen oder rallt die GC, dass dies nicht mehr benötigt wird?

Vielen Dank für eure Hilfen

Stefan

23.05.2008 - 10:51 Uhr

Hallo,

wir haben in unserem Programm eine externe Datei "config.ini". Dies ist eine XML-Struktur, in der wichtige Parameter für die Software stehen. Diese Datei ist mit der vorhandenen .net AES-Verschlüsselung verschlüsselt. Je nachdem, welche config-Datei der Kunde von uns erhält, verändert sich der Funktionsumfang. Dies funktioniert soweit auch ganz gut.

Damit das Programm die config.ini lesen kann, ist im Code die Konstante "public const string AESkey" hinterlegt. Das Programm ist im Release-Modus compiliert. Daher habe ich jetzt folgende zwei Fragen:

  1. Kann man anhand der erzeugten Ext-Datei (bzw. auch dll) auf den Quellcode Rückschlüsse ziehen, bzw. den C# Code wieder herstellen?

  2. Kann man irgendwie auf Konstanten zugreifen und so was Passwort auslesen?

Mir ist schona bewusst, dass irgendwann das Passwort und die Informationen im Klartext im Speicher liegen - ich will's ja auch nicht übertreiben. Mir geht es halt nur darum, wie man "sicher" Passwörter im Code hinterlegen kann.

Vielen Dank für eure Antworten.

Stefan

22.05.2008 - 13:20 Uhr

Hi,

das Wort Elipses hat mir sehr weiter geholfen! Zur Info, wie ich es jetzt ganz leicht gelöst habe:

label1.AutoSize = False;
label1.AutoEllipses = True;

Dann die richtigen Größen-Werte eingetragen, fertig war die Sache. Musste damit nicht mal n' Funktion anwenden sondern konnte die Label-Eigenschaften direkt voll ausnutzen.

Dankend

Stefan

22.05.2008 - 12:40 Uhr

Hallo,

suche eigentlich nach was ganz simplen, aber die Suchmaschinen mögen meine Abfrage nicht, da gewisse Zeichen wohl vernachlässigt werden 🙂

Mein Problem: Mein LAbel ist 50 Pixel maximal lang, manchmal erscheint dort aber Text, der auch 100 Pixel lang ist. Daher möchte ich diesen Text kürzen und am Ende dann ... erscheinen lassen.

Da gibt es doch schon sicherlich fertige Methoden, die so was können, oder?

Vielen Dank für eure Mühen

Stefan

21.05.2008 - 10:14 Uhr

Hallo,

das hört sich doch schon sehr interessant an, dann werde ich mal RegEx in Angriff nehmen und schauen, ob ich damit den Code von habeKA dann genau nachfolziehen kann.

Ich melde mich, sobald ich nicht weiter komme 🙂 Dankend

Stefan

21.05.2008 - 10:01 Uhr

Hallo,

ich soll folgende Funktion schreiben:

public static string IsValidString1(string Input) { }
public static string IsValidString2(string Input) { }

Diese 1. Funktion soll prüfen, ob der Input-String nur Buchstaben (groß- und kleine) hat, Zahlen und maximal einen Punkt. Die Funktion IsValidString2 soll zusätzlich noch drei oder vier Sonderzeichen (wie z.B. * / # ! ) zulassen.

Habt ihr n' Idee, wie man dies performant lösen kann, weil die beiden Funktionen werden doch recht häufig aufgerufen. Bisher würde ich das mit n' Schleifen machen, die dann jeweils jeden Buchstaben prüft. Aber da hoffe ich, dass es das noch in was eleganter gibt 🙂

Vielen dank für eure Hilfen

Stefan

12.05.2008 - 17:54 Uhr

Hallo,

das freut mich ja erst Mal, dass es grundsätzlich möglich ist, "normal" zu debuggen 🙂

Wie gefordert, habe ich die Einstellungen geprüft. Das Projekt steht auf DEBUG, ebenso in der page-Definition ist Debug="true" angegeben.

Dann habe ich noch auf Build / Clean Solution geklickt und anschließend alles neu kompiliert und mit F5 (Debuggen) gestartet.

Beide Tipps halfen nichts. Nach weiteren Recherchen im Internet habe ich noch im IE die Einstellung "Skriptdebugging deaktivieren (Internet Explorer)" unter Erweitert gefunden. Diese Checkbox habe ich deaktiviert, Windows neu gestartet, clean solution durchgeführt und anschließend wieder F5 zum Debuggen gestartet.

Leider hat auch dies nicht geholfen, so dass ich jetzt wieder vor dem Rätsel stehe, wieso das bei mir nicht klappt 🙂

Danke für eure Hilfe

Stefan

11.05.2008 - 17:40 Uhr

Hallo,

bin mittlerweile relativ fitt in C# und Windows-Desktop-Anwendungen. Jetzt habe ich mir zum Ziel gesetzt, mir auch im Web-Bereich ein paar Erkenntnisse anzueignen. Dafür habe ich in VS 2005 ein Web-Projekt angelegt und dann dort eine aspx-Seite. Dann habe ich eine Funktion Page_Load eingebaut und dort dann mit Response.Write("TEST"); getestet, ob diese auch wirklich aufgerufen wird - wird sie.

Soweit so gut. Dann habe ich die Funktion weiter aufgemotzt und jetzt möchte ich da gern durchsteppen (so wie ich das auch unter den Windows-Anwendungen mache). Breakpoint gesetzt, Projekt gestartet und es läuft so durch - ohne dass am Breakpoint pausiert wird.

Daher meine Frage: geht das mit dem Breakpoint bei Webanwendungen nicht? Und wenn es grundsätzlich gehen sollte - wieso klappt es dann bei mir nicht, bzw. welche Einstellungen muss ich prüfen.

Vielen Dank für eure Anregungen

Stefan

29.04.2008 - 10:27 Uhr

Hi,

vielen, vielen Dank - wenn man nach IsNull sucht, dann findet man auch was - aber ohne dieses Stichwort ist man doch recht aufgeschmissen.

Es klappt 1a - respekt!

Dankend

Stefan

29.04.2008 - 10:06 Uhr

Hi,

vielen Dank für deinen Beitrag. Dieses Verschachteln war mir noch gar nicht bekannt - aber damit funktioniert das wunderbar und ich kann somit auf das LockTable komplett verzichten freu

Allerdings habe ich noch ein Problem:
Ich verwende den Befehl jetzt auch zum Loggen. Dafür habe ich folgenden SQL-Request aus deinen Vorgaben gebastelt:

INSERT INTO log (id, timestamp, event_id, subject, description, origin, type) ((SELECT MAX(id) + 1, '20080429095614', '6', 'MeinSubject', 'Und was das ganze beschreibt', 'MeinProgramm1', 'Error' FROM log))

Wenn in der Tabelle schon Zeilen enthalten sind, dann funktioniert das wunderbar, sind allerdings keine Zeile enthalten, dann hat MAX(id) immer den Wert "null" und nicht den Wert "0" den ich mir eigentlich erhofft habe.

Kann man dies auch noch geschickt lösen, sodass bei null-Zeilen der Wert 0 zurückgeliefert wird.

Dankend

Stefan

28.04.2008 - 23:20 Uhr

Hi,

habe soeben nochmal intensiv bei Google gesucht aber leider ohne Erfolg. Bin da jetzt mittlerweile echt was am Verzweifeln dran.

Vielen Dank für eure Hilfen

Stefan

28.04.2008 - 15:21 Uhr

Hi,

dankend - hat mir sehr weiter geholfen

@Khalid: Da hast du vollkommen Recht und so wird's auch gelöst, aber ich wollte halt auch technisch verstehen, wieso es da zu Unterschieden kommt - lieber jetzt verstehen als nachher nach Bugs suchen 🙂

@BhaaL: Respekt - super viele Fachbegriffe aber mit diesen kann ich wenigstens gut in Google weiter suchen. Grundsätzlich habe ich das verstanden, bin aber gewillt, mich damit noch was weiter zu beschäftigen - aber da weiß ich jetzt, wo ich suchen muss.

Nochmals n' ganz herzlichen Dank!

Stefan

28.04.2008 - 15:02 Uhr

verwendetes Datenbanksystem: MsSQL Express 2005

Hallo,

ich habe lokal Windows Vista mit MsSQL Express 2005 installiert. Um auf die Datenbank per C# zuzugreifen, verwende ich folgenden Connection-String:

ConnString = String.Format("Server={0}\\SQLExpress; Initial Catalog={1}; Integrated Security=true", Server, Database);

Dies funktioniert auch sehr zufriedenstellend. Jetzt habe ich auf einem Windows Server 2003 mit SP2 auch MsSQL Express 2005 installiert. Auch hier funktioniert der ConnString ganz gut - ich muss ihn aber ohne \SQLExpress schreiben:

ConnString = String.Format("Server={0}; Initial Catalog={1}; Integrated Security=true", Server, Database);

Auf die Änderung bin ich gekommen, da ich auf beiden Kisten mir die Verbindungseigenschaften im Management Studio angeschaut habe. Dort steht bei dem Vista teil "meinRechner\SQLExpress" und beim dem Server steht "meinServer".

Wieso gibt es da Unterschiede? Das Problem ist nämlich, dass die Software auf mehreren Systemen installiert wird mit unterschiedlichen Datenbanken und daher muss der ConnString immer gleich sein und auf allein Kisten laufen.

Hat jemand n' Idee, wo hier der Fehler liegt? Das muss doch sicherlich irgendwo im SQL-Server umzustellen sein.

Dankend

Stefan

24.04.2008 - 11:47 Uhr

Hi,

sorry, dass ich erst jetzt wieder antworte, aber es waren mal wieder andere Sachen wichtiger 🙂

Habe heute deinen Befehl (TABLOCKX) getestet. Leider klappt dies nicht. Ich habe den Befehl in VS 2005 eingehackt und dann den SQL-Befehl zur DAtenbank geschickt, dahinter habe ich n' Breakpoint gemacht und bin dann zum SQL-Manager gewandert und dort die Tabelle geöffnet. Hier konnte ich Einträge verändern usw. hat alles wunderbar geklappt, obwohl es ja eigentlich so nicht sein sollte.

Dann habe ich den Befehl mit "Select * FROM tasks WITH (TABLOCKX)" aufgerufen - aber auch das hilft nichts. Dies hatte ich über google gefunden.

Zuguter Letzt ab ich noch das gefunden

begin transaction
SELECT * FROM tasks WITH (TABLOCKX)
commit transaction

nach dem Select hab ich auch hier n' Breakpoint gesetzt und konnte trotz alledem per SQL Manager auf die Tabelle zugreifen und die Werte verändern.

Hmm - jemand n' Tipp auf Lager?

Dankend

Stefan

22.04.2008 - 22:21 Uhr

Hallo,

ich habe auf meiner Form ein WebBrowser-Objekt liegen und füllen dieses mit "WebBrowser.DocumentText = myHtmlCode". Das läuft auch super.

Das Problem:
In dem html-Code sind auch Verweise auf Bilder, die extern auf einem Web-Server liegen. Die Tags sehen so aus:

<img src="hp_images/datei.png" />

Dann wird das Bild nicht angezeigt. Wenn ich allerdings

<img src="http://meinDomain.de/hp_imags/datei.png" />

angebe, dann wird das Bild richtig gezeigt. Ich muss dem WebBrowser also "nur" noch sagen, dass die Root-URL nicht auf localhost verweist sondern wo anders hin. Habe das mit

WebBrowser.Document.Damain = "meineDomain.de" versucht, dass schlägt aber immer fehl: "Beim Aufruf einer COM-Komponente wurde ein HRESULT E_FAIL-Fehler zurückgegeben".

Hat jemand von euch n' Idee, wie ich das Problem lösen kann?

Dankend

Stefan

10.04.2008 - 16:12 Uhr

Hallo,

ich "spiele" gerade mit dem Lock-Befehl rum, aber leider klappt des net so, wie ich mir das vorstellen:

private SqlConnection MsSQL_Connection;
...
this.MsSQL_Connection.Open();
                SqlCommand cmd = new SqlCommand(request, this.MsSQL_Connection);
                SqlDataReader dr = cmd.ExecuteReader();

An dieses Code-Stück übergebe ich immer den Request-String. Dieser ist im aktueleln Fall: "LOCK TABLE tasks IN SHARE MODE"

cmd.ExecuteReader() schmeißt eine Exception: "Falsche Syntax in der Nähe des 'TABLE'-Schlüsselwortes." Die gleiche Fehlermeldung erhalte ich auch, wenn ich den SQL-Request im Management-Studio eingebe.

Muss ich da noch irgendwas einstellen, damit Lock unterstützt wird, oder was mache ich falsch. Konnte dazu nix in google finden, wieso der hier streikt 😦

Danke schon jetzt für eure Tipps.

Stefan

10.04.2008 - 11:56 Uhr

Hi,

hab mal ein bisschen gegoogled und das ist wirklich das, was ich brauche. Wenn ich das richtig gesehen habe, dann sollte das ganze auch mit MS SQL und mySQL laufen - habe nix gegenteiliges gefunden. Getestet werden muss das ganze natürlich schon - aber grundsätzlich sollte es klappen - oder net?

Nochmals einen ganz herzlichen Dank

Stefan

10.04.2008 - 11:25 Uhr

Hi,

das mit LockTable hört sich sehr interessant an - danach werde ich jetzt gleich mal googeln...

Stefan

10.04.2008 - 10:55 Uhr

Hi,

die Server sind untereinander gar nicht gekoppelt, stehen nur im gleichen Netz und können sich über dieses unterhalten, heißt

Es gibt einen zentralen Datenbank-Server mit einer festen IP. Es gibt x Applikations-Server die sich die Infos aus der Datenbank holen und dann anfangen was zu tun. Es gibt auch Tage, wo weitere Applikations-Server hinzukommen bzw. wegfallen. Diese sollen dann einfach mit der Server bespielt werden und dann einfach n' Verbindung zur Datenbank aufbauen und anfangen zu schuften.

Daher sind die Applikations-Server untereinander nicht gekoppelt. Hilft dir das weiter?

Stefan

10.04.2008 - 08:28 Uhr

verwendetes Datenbanksystem: MS SQL 2005

Hallo Jungs,

ich habe hier eine zentral MS SQL 2005 Datenbank mit einer Tabelle "Tasks". Hierein werden Daten gespeichert, die von mehreren Servern abgearbeitet werden müssen. Dafür gibt es eine Spalte "status" über die der Server erkennt, was zu tun ist. Dies läuft ungefähr so ab:

  1. Server fragt: SELECT id WHERE status = ToDo
  2. Server sagt: UPDATE status=InProgress where id=ID
  3. Server arbeitet
  4. Server sagt: Update status= Fertig where id=ID

Bisher hatten wir nur einen Server, der diese Anfragen an die Datenbank gestellt hat. Mittlerweile haben wir aber drei weitere Server bekommen und seit dem haben wir (aus meiner Sicht auch völlig zurecht) einige Probleme:

  • Server 1 macht 1) => kriegt id=23
  • Server 2 macht 1) => kriegt id=23
  • Server 1 macht 2) => setzt 23 auf InProgress und arbeitet vor sich hin
  • Server 2 macht 2) => setzt 23 auf InProgress und arbeitet vor sich hin

=> d.h. es wird durch diesen Ablauf (der halt hin und wieder mal auftritt, aber je mehr Server dazu kommen, umso häufiger tritt der Fehler verständlicherweise auf) zwei Mal der gleiche Task abgearbeitet, was zu üblen Folgeproblemen führt.

Hat jemand eine Idee, wie ich diesem Problem aus dem Wege gehe? Im Endeffekt muss ich ja nur sicherstellen, dass 1) und 2) immer hintereinander durchgeführt werden und durch einen anderenProzess beeinflusst werden dürfen.

Dsa ganze soll/muss über normale SQL-Anfragen gehen, da StoredProcedures nicht gewünscht sind (Gründe mal ganz egal). Ebenso ist angedacht, die Datenbank mal auf mySQL umzusetzen (auch hier Gründe egal smile) - daher müsste das ganze beide Datenbanktypen unterstützen. Wäre aber natürlich erst Mal froh, wenn eine klappt 🙂

Dankend

Stefan

05.03.2008 - 09:08 Uhr

Hi,

um die Position zu setzen, kann man nicht X oder Y einzeln setzen sondern muss einen neuen Punkt erzeugen und den dann zuweisen:

this.AutoScrollPosition = new Point(this.AutoScrollPosition.X, this.Controls.Count * this.panelHeight);

Damit klappt das alles wunderbar.

Vielen lieben Dank für eure Tipps

Stefan

05.03.2008 - 09:04 Uhr

Hi,

vielen Dank für den Anreiz mit der Optimierungsidee. Grundsätzlich hast du recht, aber für meine Fall ist des glaub ich was weit her geholt.

Jedes Panel hat ein Label und 3 Buttons. Grundsätzlich kann dieses Control beliebig viele Panels aufnehmen (ich habe da keine Beschränkung eingebaut) aber im normalen Alltag werden dort nie mehr als 5 oder sagen wir 10 Panels drin sein.

Aus diesem Grund wage ich zu behaupten, dass hier an dieser Stelle keine Optimierung vorgenommen werden muss. Sollte hier mal Bedarf bestehe, habe ich deinen Link direkt mal als Kommentar in den Code eingefügt 🙂

Bis dahin

Stefan

05.03.2008 - 08:52 Uhr

Hi,

vielen Dank für eure Beiträge. Der Vorschlag von psy klappt 1a freu; es folgt aber direkt die nächste Frage 🙂

Wenn ich das Panel hinzufüge möchte ich, dass der Scrollbalken direkt nach unten springt - also seine Position verändert. Folgender Plan

this.AutoScrollPosition.Y += panelHeight

funktioniert leider nicht, da dies nur ein Lese-Wert ist. Welche Funktion muss ich ansprechen, um die ScrollBar zum Bewegen zu kriegen.

Vielen Dank

Stefan

PS: Die Idee mit den DockStyle hatte ich am Anfang auch. Damit hatte ich aber nicht die gewünschte Flexibilität, um Controls so anzuordnen, wie ich es benötige.

04.03.2008 - 18:20 Uhr

Hallo Leute,

stehe vor einem erneuten Problem und weiß nicht mehr weiter. Ich möchte mir ein eigenes UserControl basteln, dass untereinander beliebig viele Panels aufnehmen kann; also so eine Art Liste mit Panels.

Das mache ich:
Panel p = GeneratePanel(//mit ein paar Optionen);
this.Controls.Add(p);
p.Top = p.height * (this.Controls.Count - 1);

Die Anordnung funktioniert auch wunderbar. Irgendwann (wenn genügend Panels drin sind, erscheint rechts der Scrollbar - so wie's sein soll. Füge ich jetzt weitere Panels ein, funktioniert das auch noch wunderbar.

ABER:
Wenn ich mit dem Scrollbar ganz nach unten gehe und dann weitere Panels einfüge, dann werden die neue Panels immer viel zu weit unten gezeichnet. Die Berechnung der Höhe ist korrekt, nur zeichnet sich das ganze falsch.

korrekt:
siehe Anhang diesen Beitrag

inkorrekt:
siehe Anhang nächsten Beitrag

Habt ihr n' Idee, woran das liegen könnte - stehe momentan echt was auf dem Schlauch...

Dankend

Stefan

19.02.2008 - 13:31 Uhr

Hi,

vielen Dank für die Nachricht - jetzt hab ich wenigstens die Gewissheit, dass ich den Teil wirklich programmieren muss und nichts programmiere, was es schon gibt 🙂

Dankend

Stefan

18.02.2008 - 13:32 Uhr

Hallo,

mein Programm ist grob folgend aufgebaut:

  • oben ein MenuStrip
  • darunter ein TabControl

Je nachdem, welchen Punkt ich in dem MenuStrip auswähle, ändern sich die einzelnen Seiten im TabControl. Soweit sogut.

Auf einer Seite im TabControl ist jetzt eine TextBox und ein Speicher-Button. Wenn man den Text ändert, wird der Speicher-Button Enabled. Wenn ich jetzt eine Seite welchsel, soll aber eine Meldung kommen: Änderungen speichern? Ja, Nein, Abbrechen.

ja: wird gespeichert und auf neue Seite gelinkt
nein: wird nicht gespeichert und auf neue Seite gelinkt
abbrechen: wird nicht gespeichert und nicht auf neue Seite gelinkt

Diese Meldung muss aber an mehrere Stellen aufkreuzen:

  • schließen der Applikation
  • MenuStrip ändert sich => TabControl ändert sich
  • TabControl andere Seite

Es soll auch noch ein TreeView rein, über den auch noch verschiedene Optionen möglich sein sollen => bei einer Änderung da, muss die Meldung auch kommen.

Ich könnte jetzt zwar an jeder Ecke eine Meldung einbauen, aber das find ich a) sehr uncool und b) bei einer Erweiterung wird sowas später vergessen.

Hat da jemand eine Idee, wie man sowas gut in den Griff bekommt.

Dankend

Stefan

07.02.2008 - 11:01 Uhr

Hi,

vielen Dank für eure Antworten... fang ich mal von forne an:

Padding:
Meines Erachtens hat dies nur eine Auswirkung auf Komponenten, die sich in diesem Panel befinden und dort den Dock-Style gesetzt haben. Damit wird, so meine ich zumindest, der Client-Bereich definiert. Da ich aber direkt auf das Panel zeichne und nicht in de Client-Bereich, sollte das egal sein.

Habe die Werte trotzdem geprüft und egal was ich dort eintrage, es ist egal - hat keine Auswirkung auf die Positionierung meines Textes.

Größe der Buchstaben:
Das würde zumindest den Abstand nach oben erklären. Gebe ich ein Ü ein, dann bleibt der Text in gleicher Höhe und oben wird bei dem Ü der Abstand dann wirklich kürzer. Nach links hin könnte da aber definitiv weniger Platz sein, weil man ja weiß, wie breit der Buchstabe ist.

Tests mit MeasureString:
Ich habe mir mal mit MeasureString die Dimensionen des String berechnen lassen und tatsächlich - auch hier ist der Wert nicht minimalsten Rechteck sondern ein etwas größeres mit etwas Platz drum rum (für z.B. y, Ü oder ähnliches).

Vielen Dank für eure Tipps - jetzt weiß ich wenigstens, was Sache ist.

Bis dahin

Stefan

07.02.2008 - 10:35 Uhr

Hallo,

ich habe ein Panel und dort möchte ich ganz oben links in der Ecke (also bei 0/0) einen Text hin zeichnen. Soweit so gut. Hier der Code:

private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gfx = e.Graphics;
            gfx.DrawString("TEST", new Font("Arial", 23), Brushes.DarkBlue, new PointF(0, 0));
        }

Das komische ist, dass immer ein paar Pixel links und rechts frei sind und ich nicht verstehe, wo die her kommen. Kann man auf folgendem Bild sehr gut erkennen:

siehe Anhang

Vielen Dank für eure Tipps

Stefan

07.02.2008 - 10:18 Uhr

Hi,

vielen Dank - hat 1a geklappt. Hier der Code, falls jemand mal nach dem gleichen Problem sucht:

        private void Painten(Graphics gfx)
        {
            gfx.DrawString("TEST", new Font("Arial", 23), Brushes.DarkBlue, new PointF(0, 0));
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gfx = e.Graphics;
            gfx.Clip = new Region(new Rectangle(10, 10, 50, 50));
            gfx.TranslateTransform(10, 10);
            gfx.FillRegion(Brushes.LightBlue, gfx.Clip);
            Painten(gfx);
            gfx.ResetTransform();
        }

Bis dahin

Stefan

07.02.2008 - 09:29 Uhr

Hi Leute,

ich habe hier eine Form, in die ich was bei Form1_Paint hineinzeichne. Über e.Graphics kriege ich ja die gesamte Zeichenfläche der Form, in die ich Zeichnen kann, also von 0/0 bis Width/Height.

Die Paint-Funktion ruft jetzt auch eine andere Funktion zum Zeichnen auf. Diese bekommt auch e.Graphics übergeben, was aber zur Folge hat, dass auch die neue Funktion in die gesamte ZEichenfläche krakeln darf - und genau das will ich verhinden. So was in die Richtung stelle ich mir vor:

Graphics gfx = e.Graphics
Graphicy Fooo = gfx.Ausschnitt(x,y,width,height);
MeinePaintFunktion(Foooo);

=> MeinePaintFunktion darf nur in diesen Ausschnitt zeichen und sonst nirgends wo hin.

Hat da von euch jemand was auf Lager, wie ich sowas realisieren kann? Komm da grad nämlich echt net weiter.

Dankend

Stefan

06.02.2008 - 19:53 Uhr

Hi,

die Frage ist leicht beantwortet: weil ich bisher immer nach Formular oder Formular-Designer gesucht habe...

Der Link scheint echt brauchbar zu sein - respekt - das wird mir glaub ich schon deutlich weiter helfen. Werde mir das jetzt mal anschauen und dann bewundern, was es so schönes schon alles gibt.

Bis dahin

Stefan

06.02.2008 - 19:35 Uhr

Ich will mir einen Formular-Designer bauen. Dieser soll im Hintergrund ein "weißes Blatt" haben (weil ich das ja ausdrucken möchte) und darauf möchte ich einfach ein paar Bilder, Texte legen. Und dann klicke ich auf n' Button "Drucken" oder "als PDF speichern" und dann gibt der das auf dem jeweiligen Medium aus - und zwar genau so, wie ich's auf dem Monitor zu sehen bekomme...

Hintergrundgedanke: Ich erstelle mir so ein paar Vorlangen und je nach Bedarf werden die Labels anders gefüllt. So könnte ich ein paar Rechnungen usw. leichter generieren - und zwar voll automatisch in meinem persönlich gewünschten Design.

Werde mir gleich mal dein Tutorial anschauen, vielleicht hilft mir das.

06.02.2008 - 18:56 Uhr

Hi Jungs,

ich benötige ungefähr folgendes:

  • weißes Blatt Papier (also n' Canvas, wo ich zeichnen kann)
  • dann an der Seite ein paar Buttons (kein Thema)
  • Bei Klick auf einen Button wird ein "Textfeld" auf dem Canvas gezeichnet
  • Ich kann das Textfeld markieren und verschieben
  • das ganze (das Papier mit seinen Komponente) entweder auf dem Monitor, Drucker, PDF-Dokument ausgeben

Das ist so grob die Anforderung. Habe schon Google nach Formular, Formular-Designer usw. durchsucht - aber in Verbindung mit Csharp absolut nix gefunden, was mich weiter bringt.

Brauche hier keine genaue Beschreibung, wie das funktioniert (ganz ehrlich, hätte ich schon gerne smile), nur so ein paar Infos, nach denen ich googelen könnte. Ich weiß noch nicht, mit welcher Komponente ich mit dem Blatt Papier anfangen soll - das ist mir noch ein Rätsel...

Danke für eure Hilfe

Stefan

PS: wenn jemand n' Howto mit so was in die Richtung kennt, sage ich auch net nein 🙂

05.02.2008 - 22:54 Uhr

Hi Leute,

bin auf der Suche nach n' Komponente, die eine Tabelle handeln kann. Grundsätzlich soll die in etwa das können, was auch die Word-Tabellen können:

  • Zellen verbinden
  • Zeilen verbinden
  • Hoch/Vertikal schreiben
  • Schriftart änderbar pro Zelle
  • Hintergrundfarbe pro Zelle ändern
  • Rahmen anpassen

Gibt es sowas - wenn ja wo - oder hat jemand sowas schon Mal selber programmiert? Bin für jeden Tipp dankbar.

Bis dahin

Stefan

02.01.2008 - 16:41 Uhr

Hi,

@BennyP: ich bin so happy - das klappt - ich würd dir am liesten n' Eis backen, so glücklich bin ich 🙂 🙂

@all: vielen Dank für eure Hilfen. Ihr habt mir echt das Leben gerettet. Es klappt jetzt. Ist zwar n' ganze Menge Zeit drauf gegangen, aber es läuft freu

DANKE

Stefan

02.01.2008 - 16:39 Uhr

Hi,

vielen Dank für den Tipp mit dem Administrator-Tool. Das ist richtig cool!!!

  1. Wenn ich mit C# schreibe und dann mit dem Admin-Tool auslese, dann erscheint anstatt des gewünschten €-Zeichen ein Fragezeichen
    => also genauso wie es phpMyAdmin auch ausgibt

  2. Wenn ich mit C# schreibe, dann in phpMyAdmin das ? in ein € umwandle und dann wieder mit dem Admin-Tool auslese, dann erscheint das gewünschte €-Zeichen

=> es muss wirklich am Anlegen liegen.

> Ansonsten kannste den Zeichensatz beim Erstellen / Ändern der Tabellen mit angeben.

Echt??? Aber wo - ich finde diese Einstellung zum Verrecken nicht. Dachte ich hätte schon alles durch. Magst du mir noch mitteilen, wo man das einstellen kann.

Vielen Dank

Stefan

02.01.2008 - 16:10 Uhr

Um das ganze eventuell verständlicher zu machen, hier der passende Code, wie ich die Daten in die DB schreibe:

private void button1_Click(object sender, EventArgs e)
        {
            string Server = "server";
            string User = "root";
            string Password = "pwd";
            string Database = "test_db";

            string ConnString = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false",
                    Server, User, Password, Database);
            this.MySQL_Connection = new MySqlConnection(ConnString);

            string sql = "INSERT INTO tabelle (id, price_currency) VALUES ('1', '12,32 €')";
            try
            {
                this.MySQL_Connection.Open();
                MySqlCommand cmd = new MySqlCommand(sql, this.MySQL_Connection);
                cmd.ExecuteNonQuery();
            }
            catch
            {
            }
            finally
            {
                this.MySQL_Connection.Close();
            }
        }

Eigentlich finde ich den Code recht gut und net fehleranfällig - wäre da nicht dieses elende €-Zeichen 🙂

Stefan

02.01.2008 - 16:08 Uhr

Hi,

vielen Dank für den wirklich neuen Ansatz. Habe ich direkt mal ausprobiert. Leider stimmt das nicht, was du schreibst.

  1. Wenn ich mit C# schreibe und dann mit C# auslesen, dann erscheint anstatt des gewünschten €-Zeichen ein Fragezeichen

  2. Wenn ich mit C# schreibe, dann in phpMyAdmin das ? in ein € umwandle und dann wieder mit C# auslese, dann erscheint das gewünschte €-Zeichen

Daher folgere ich, dass beim Schreiben der Fehler passiert und das phpMyAdmin keine Fehler macht. Oder sehe ich da etwas falsch?

Vielen Dank für deine Mühen

Stefan

02.01.2008 - 15:54 Uhr

Hi,

ich hab jetzt schon x-Google-Suchen gestartet und noch mehr Artikel gelesen und langsam fühle ich mich so, als wäre ich der erste Mensch, der über C-Sharp in MySQL ein €-Zeichen schreiben möchte 🙂 bzw. der erste Mensch, der damit Probleme hat 🙂

Habe das ganze jetzt sogar auf mehreren Datenbanken (jedesmal eine andere Version) getestet:

  • MySQL 4.1.10a (2x), 5.0.26
    Auf allen drei Servern immer das gleiche Problem. Alle Zeichen laufen, nur das € Zeichen nicht. Daher folgere ich:

  • es liegt nicht an der DB (mehrere Versionen, gleicher Fehler)

  • es liegt nicht an dem SQL-Request (weil über phpMyAdmin läuft er ja)

Daher muss es auf dem Weg von C-Sharp zur DB passieren. Daher muss da irgendwas an dem Decoding nicht richtig sein. Ich finde aber auch keine Möglichkeit, dieses anzupassen.

Ich weiß ehrlich gesagt nicht mehr weiter und bin um jeden noch so kleinen Tipp sehr sehr dankbar. Vielen Dank für eure Mühen

Stefan

02.01.2008 - 14:50 Uhr

Hi,

ja - das vermute ich auch - aber das würde bedeuten, dass ich bei dem Connector über c# ja den Zeichensatz einstellen könnte. Hab aber bis dato keine Möglichkeit gefunden.

Das verwundernde ist: alle Sonderzeichen (äöüß@) laufen wunderbar. Nur das eine € macht Probleme.

Bin weiterhin für jeden Tipp dankbar.

Stefan

02.01.2008 - 14:08 Uhr

verwendetes Datenbanksystem: mySQL

Hallo,

bisher habe ich immer zusammen mit einer MS-SQL Express 2005 Datenbank gearbeitet. Jetzt soll die Software aber so umgestrickt werden, dass sie auch mit mySQL zusammen arbeiten kann.

Daher habe ich mir den .net Connector heruntergeladen und darüber dann (wie auch mit ms-sql) eine Verbindung zur Datenbank aufgebaut. 99,99% der Anwendung läuft jetzt auch mit mySQL wunderbar zu sammen. Habe aber ein Problem mit dem €-Zeichen. Ich führe folgenden SQL-Befehl aus:

UPDATE tabelle SET preis='12,32 €' WHERE id='1'

wenn ich dann über phpMyAdmin mir den Eintrag anschaue, dann steht dort aber 12,32 ? drin => das €-Zeichen wurde durch ein Fragezeichen ersetzt. Die Datenbank hat über all als Kollation utf8_general_ci drin stehen. Wenn ich den Befehl direkt über phpMyAdmin eingebe, dann funktioniert das ganze auch reibungslos.

Hat jemand von euch eine Idee, woran das liegen könnte?

Vielen Dank für eure Hilfen

Stefan