Laden...
T
telnet myCSharp.de - Member
Senior Software Engineer Dabei seit 14.05.2006 327 Beiträge
Benutzerbeschreibung

Forenbeiträge von telnet Ingesamt 327 Beiträge

21.07.2010 - 10:02 Uhr

Hallo,

ich habe hier Zahlen vom Typ decimal, die ich auf eine definierte Anzahl gültiger Ziffern runden muss.

Also z.B 123456789 auf 3 GZ -> 123000000 oder 2,12548 auf 2 GZ -> 2,1
Ausgeben kann man das ganze ja über decimal.ToString("GX"), wobei das X die Anzahl der gültigen Ziffern ist.

Soweit ok, nur z.B bei 123456789 bekomme ich als Ergebnis 1,23E+08, was lt. MSDN ja auch korrekt ist, da das kürzeste mögliche Format verwendet wird. Nur kann ich diese wissenschaftliche Notation leider nicht brauchen. Diesen string könnte ich dann ja wieder in einen decimal umwandeln mit .Parse() und NumberStyles.Any als Parameter. Das erscheint mir aber "etwas" ungünstig.

Daher meine Frage: Kennt jemand eine Möglichkeit, ganz einfach eine decimal-Zahl auf eine bestimmte Anzahl gültiger Ziffern zu runden, wobei das Ergebnis wieder ein decimal sein soll ?

13.07.2010 - 07:58 Uhr

Guten Morgen,

ich habe hier folgendes "Problem":
Meine Anwendung läuft im System Tray und hat einen globalen KeyHook registriert. Ich puffere immer die letzten 12 eingegebenen Zeichen und wenn diese 12 Zeichen ein bestimmtes Kriterium erfüllen (RegEx), dann hole ich die Anwendung in den Vordergrund. Soweit funktioniert alles, nur einen Schönheitsfehler habe ich gefunden:
Wenn das 12te Zeichen eingegeben worden ist, reagiert meine Anwendung ja schon, indem Sie den WindowState auf Normal wechselt, also aus dem System Tray hochkommt. Zu diesem Zeitpunkt habe ich aber nur auf das Hook-Ereignis reagiert, der Key wurde aber noch nicht an die aktive Anwendung weitergegeben. Dadurch bekommt meine Anwendung jetzt dann das 12te Zeichen ab, und nicht die Anwendung, die zuvor im Vordergrund war.

Hat jemand eine Idee, wie ich das am elegantesten lösen könnte ? Evtl. eine künstliche Zeitverzögerung einbauen damit das Fenster erst hochkommt wenn der letzte Key von der aktiven Anwendung verarbeitet wurde ? (Kommt mir etwas "unschön" vor...)

Viele Grüße

26.06.2010 - 16:01 Uhr

Was willst du denn damit bezwecken?

Ich würde lieber eine zusätzliche Spalte einfügen und da drinnen dann die Reihenfolge vorgeben (i.d.R. über Integer-Werte). Dann brauchst du einfach nur nach dieser Spalte sortieren...

26.06.2010 - 04:20 Uhr

Wie wäre es mit


foreach(TextBox item in Controls)
{
  textboxes.Add(item.Name, item);
}

Alles was du dann zusätzlich machen musst ist eine Methode zu erstellen die rekursiv die ganzen Controls durchläuft...

12.06.2010 - 03:56 Uhr

Warum willst du denn unbedingt einen string-enum verwenden ?

Nimm doch einfach einen "normalen" auf int basierenden her, den string bekommst du ja dann einfach über das .ToString() der enum-Variable...

03.06.2010 - 00:18 Uhr

Wie wäre es damit, beim ersten Mal alle Werte zu übergeben, und danach immer nur die geänderten Einträge des Dictionaries ?
So könnte man die übertragene Datenmenge möglichst klein halten...

An welche Art von Anwendung willst du die Daten denn weitergeben ?

02.06.2010 - 20:18 Uhr

Wenn man den richtigen englischen Begriff kennt, dann fällt auch das Suchen leichter..

Für alle die was ähnliches Suchen:

http://www.timvw.be/exploring-datagridviewcomboboxcolumn-databinding/

Suchbegriff bei Google: DataGridViewComboBoxColumn + Subset

02.06.2010 - 19:51 Uhr

Hallo,

ich habe hier folgende Situation:

Eine Spalte eines DataGridViews soll vordefinierte Elemente zur Auswahl anbieten.
Je nach selektierter Zeile können die auswählbaren Elemente aber unterschiedlich sein.

Meine bisherige Lösung sieht folgendermaßen aus:

Die auswählbaren Elemente sind in einer DataTable, die über eine BindingSource an die DataGridViewComboBoxColumn gebunden ist.
Im RowEnter Event des Grids verändere ich jetzt den RowFilter der BindingSource so, dass immer nur die Elemente zur Verfügung stehen, die für die akt. Zeile anwählbar sein sollen.

Soweit so gut - funktioniert auch, nur dass ich Exceptions bekomme, sobald ich in eine Zeile wechsle, für die die auswählbaren Elemente anders sind. --> Klar, da in dem Moment alle anderen Zeilen in der Spalte "ungültige" Werte haben, die nicht DBNull oder in der Source der Spalte sind...

Meine Frage wäre jetzt, wie ich es hinbekomme zwei oder mehr Subsets von vordefinierten Elementen in einer ComboBoxColumn verfügbar zu haben, ohne in dieses blöde Problem reinzulaufen ?

05.05.2010 - 04:11 Uhr

Also was ich dir sicher sagen kann ist, dass ich mit der .NET Serial Port Komponente schon mehrfach schlechte Erfahrungen bei der Kommunikation mit Harware (Laborwaagen, Portmultiplexer etc.) gemacht habe.
Im Hyperterminal und Putty lief alles einwandfrei, mit .NET identische Einstellungen aber keine Chance.
Im Endeffekt verwende ich jetzt Komponenten von Drittherstellern - installiert, keine Probleme. Liegt anscheinend in der Implementierung der SerialPort-Klasse.... ist glaube ich auch in der aktuellen DotNetPro ein Artikel drüber drinnen...

05.05.2010 - 04:07 Uhr

Hmm.. kann sein, dass dieser Effekt evtl. nur in Kombination mit der Symantec Endpoint Protection (mit der ich schon öfter Probleme hatte, die ich allerdings auf dem Firmennotebook nicht deinstallieren kann/darf) auftritt... Muss mal meine Kollegen fragen ob die die gleichen Probleme haben...

05.05.2010 - 04:03 Uhr

Sollte eigentlich damit gehen:
DataGridView.ColumnDisplayIndexChanged-Ereignis

Steht übrigens direkt in der MSDN bei den Ereignisses des DataGridViews, also nicht wirklich schwer versteckt...

04.05.2010 - 03:53 Uhr

Ohne jetzt was zu testen:
Console.ReadLine() liest die Zeichen bis zum CarriageReturn / LineFeed (Environment.NewLine). Wenn du jetzt einfach nur Enter drückst, dann gibt Console.ReadLine() nichts zurück, und nichts kann man nicht in einen char umwandeln.

Ich würds mal so versuchen (ungetestet):


char auswahl;
do 
{
   Console.Write(" Neue Berechnung [yes: Return , no: Anychar]-> ");
} while(string.IsNullOrEmpty(Console.ReadLine()));

Gute Nacht 😉

24.04.2010 - 00:20 Uhr

Hier ein kurzer Hinweis für alle, die die gleichen Probleme beim Installieren von VS 2010 haben wie ich sie hatte:

Betroffen (in meinem Fall): VS 2010 Premium englisch aus der MSDN, SHA1 Key geprüft und ok

Hatte heute den ganzen Tag mit einem Fehler zu kämpfen, dass die Setup-MSI nicht verifiziert werden komme o.ä. Die genaue Fehlermeldung hab ich leider nicht mehr im Kopf, auf jeden Fall etwas, wobei einem im MS Forum geraten wurde, die ISO Datei nochmal zu laden, weil angeblich Daten korrupt sind.

Nach langem rumprobieren bin ich drauf gekommen, dass das Problem durch die Verwendung von DaemonTools zum mounten des ISOs hervorgerufen wurde.

Bei Verwendung von Virtual Clone Drive tritt dieser Fehler nicht auf, das Setup läuft mit dem gleichen Image einwandfrei durch!

22.04.2010 - 18:45 Uhr

Hatte auch mal ein ähnliches Problem - damals hats bei mir geklappt einen StringBuilder anstatt des char* bzw. char[] zu verwenden.. War allerdings eine DLL, die in Delphi geschrieben war...

22.04.2010 - 00:58 Uhr

Super Tip - danke... Werde das mit der BindingSource morgen gleich mal ausprobieren. Habe bisher immer nur mit DevExpress Grids gearbeitet, da ist alles anders (und einfacher)...

Musst nicht die Daten neu laden die ich im Grid habe sondern die Daten aktualisieren. Hab einen Dienst der zyklisch ein anderes System auf neue Daten prüft und diese in die DB schreibt. Daher muss ich die angezeigten Daten immer wieder auffrischen...

22.04.2010 - 00:55 Uhr

Was machst du denn auf der Arduino-Seite ?
Auf Anhieb würde ich im Code jetzt keinen Fehler sehen. Wenn du Daten senden und empfangen kannst würde ich eher sagen dass aus der anderen Seite was nicht stimmt...

21.04.2010 - 18:38 Uhr

Wunderbar - danke !

Jetzt setze ich einfach die .Position-Eigenschaft der BindingSource auf den gleichen Wert wie die .Index-Eigenschaft der DataGridViewRow die ich selektiert habe und schon gehts 😉

21.04.2010 - 18:06 Uhr

Stimmt - die BindingSource muss auf einen bestimmten Datensatz zeigen.
Aber wie bekomme ich das denn programmtechnisch hin? Dachte wenn ich den entsprechenden Eintrag im DataGridView selektiere wirkt sich das automatisch auf die BindingSource aus - tuts auch wenn man per Mausklick selektiert, jedoch nicht, wenn die Selektion per Code erfolgt. Was kann denn da so viel anders sein ?
Kann ich evtl. irgendwie manuell einen Refresh erzwingen?

INotifiyProperty changed sollte ich nicht brauchen, da ich ja ein DataSet verwende. Schätze das wird automatisch gefeuert wenn mein DataAdapter das DataSet füllt...

21.04.2010 - 17:54 Uhr

Hallo,

ich habe hier folgendes Problem:

Ich habe ein DataSet über eine BindingSource an ein DataGridView und mehrere TextBoxen gebunden.

Jetzt aktualisiere ich per Code die Daten im DataSet bzw. lade die Daten für das DataSet aus einer Datenbank.

Soweit funktioniert alles. Nach dem Aktualisieren wird die Selektion im DataGridView auf die erste Zeile zurückgesetzt und alle TextBoxen binden schön mit.

Dann stelle ich die Selektion im DataGridView per Code wieder her, indem ich die Felder des Primärschlüssels mit zwischengespeicherten Werten der letzten Selektion abgleiche. Die gefundene DataGridViewRow setzte ich auf Selected = true.

Funktioniert auch im Grid wunderbar, nur die TextBoxen bekommen diese Selektion per Code nicht mit und haben nach wie vor die Werte des ersten Eintrags des DataGridView und nicht die zur Selektion passenden Werte.

Kann sich jemand vorstellen, welches kleine Property ich vergessen habe zu setzen 😉 ?

16.04.2010 - 04:56 Uhr

Warum machst du das denn alles über die Info-Klassen und nicht einfach über die statischen Methoden der entsprechenden Klassen ?


public static void WriteClipBoardTo(string PathToFile)
{
  string directory = Path.GetDirectoryName(PathToFile);
  if(!Directory.Exists(directory)
  {
    Directory.CreateDirectory(directory);
  }

  File.WriteAllText(GetClipBoard());
}

Ich schätze jetzt einfach mal, dass GetClipBoard() einen string zurückgibt...
Hab's jetzt um die Zeit leider nicht mehr getestet, so in der Richtung sollte es aber funktionieren.

16.04.2010 - 03:05 Uhr

Super Tipp! Vielen Dank.. funktioniert übrigens noch immer die Sache mit dem Discount - hab's grad eben gekauft 😉

15.04.2010 - 16:34 Uhr

Such mal bei Google nach "barcode 128" ... Wenns schnell gehen soll nach "barcode 128 font" suchen und einfach mit den kostenlosen Schriftarten den Code generieren...

Alternativ gibt's auch was bei Codeproject... einfach mal nach "Barcode" suchen - ist eine Library die die Grafiken selber "errechnet"...

09.04.2010 - 00:06 Uhr

Naja also wenn ich richtig verstehe dann lädst du Daten aus 2 Tabellen aus dem SAP, verarbeitest die Daten und schreibst sie zurück ins SAP. Für das Zurückschreiben bräuchtest du einen eigenen Baustein..
Ich würde dir raten das ganze gleich komplett in einem Baustein im SAP zu machen.. Wofür unnötig viele Schnittstellen erzeugen wenn man alles in einem System machen kann ?

08.04.2010 - 00:38 Uhr

Hallo,

also den SAP .NET Connector würde ich ehrlich gesagt nie wieder verwenden, da er extrem unflexibel und unhandlich zu bedienen ist. Außerdem läuft er auf .NET 1.1 Basis und ist für .NET 2.0 oder höher nicht verfügbar.
SAP Schnittstellen wickle ich entweder über SAP PI ab, das mir dann einen Webservice bereitstelle, der als Proxy zwischen meiner Anwendung und einem entsprechenden SAP-RFC bereitstellt.
Alternativ verwende ich ERPConnect.NET (Für .NET 2.0 und höher, kostet zwar ein bisschen was, ist das Geld aber auf jeden Fall wert), da auch in den offiziellen SAP Foren hoch gelobt wird und einwandfrei funktioniert. Hier kannst du entweder IDOCs verwenden oder RFCs und BAPIS direkt aufrufen.
In allen Fällen brauchst du aber einen entsprechenden Funktionsbaustein im SAP der die Funktionalität zum schreiben in die Tabellen implementiert. Ob du dann bei jedem Call eine Zeile einfügst oder gleich eine ganze Tabelle übergibst ist dann Geschmackssache. Solltest du mit IDOCs arbeiten wollen musst du deine Anwendung außerdem als Subsystem im SAP anlegen und für die entsprechenden eingehenden IDOCs registrieren.
Weitere Fragen sind willkommen, allerdings wäre es dann nicht schlecht zu wissen was du genau vor hast...

31.03.2010 - 03:12 Uhr

Das Problem ist, dass das Event standardmäßig dann ausgelöst wird, sobald ein einzelnes Zeichen vorhanden ist.
Wenn bekannt ist, wie viele Zeichen als Antwort kommen, gibt es zwei verschiedene Möglichkeiten:
a) ReceivedByteThreshold auf die Anzahl der erwarteten Bytes/Zeichen einstellen. Dann wird das Event erst dann ausgelöst, wenn eine definierte Anzahl an Zeichen da ist.
b) Einen eigenen Puffer z.B. in Form eines StringBuilders anlegen, der immer um die anstehenden Zeichen aus dem SerialPort Read-Buffer erweitert wird. Über Abfragen auf die Länge des StringBuilder kann man dann z.B. Aktionen durchführen, wenn man weis dass alles da ist.

Ich persönlich verwende grundsätzlich immer ReadExisting() und nicht ReadLine() wenn ich nicht 100% sicher bin, dass ich alle Daten habe.

Eine (unschöne) Möglichkeit wäre z.B. auch vor dem ReadLine() ein z.B. Thread.Sleep(200); einzubauen (Sleeptime mit Erfahrungswerten anpassen), dann hätte das Messgerät noch etwas Zeit zum Senden der Daten bevor du versuchst die Daten einzulesen.
BTW: Welches Messgerät steuert ihr denn da ?

21.03.2010 - 03:02 Uhr

Vielen Dank.. BindingSource.EndEdit hat mir gefehlt...

Ja das automatisierte Speichern ist so ne Sache... nur wird mit der Anwendung ein altes Delphi-Programm abgelöst, das genau diese automatische Speicherung durchführt. Da alles beim alten bleiben soll muss ich leider in diesen saueren Apfel beissen...

21.03.2010 - 02:59 Uhr

Also.. Problem "gelöst".
Das Gerät war ein GagePort der Fa. Fowler, der ein bestimmtes Protokoll in ein RS232 kompatibles Protokoll umwandelt. Leider funktioniert die SerialPort Klasse aus .NET nicht so richtig mit diesen uralt (> 10 Jahre) Geräten. Über die Windows-API hätte es funktioniert, aber wer will sich schon selber einen API Wrapper für den SerialPort programmieren? Niemand.
Also, Gerät ausgetauscht, das neue funktioniert jetzt einwandfrei...
Es gibt auch auch andere Implementierungen der SerialPort Klasse von Drittanbietern. Weis jemand vielleicht, wo die Grenzen der Standard-SerialPort Klasse liegen ?

17.03.2010 - 16:23 Uhr

Hallo,

ich versuche hier gerade ein über COM-Port angeschlossenes Gerät zum sprechen zu bewegen 😉
Über Putty funktioniert das ganze auch wunderbar - ich schicke eine Steuerfolge "ArAs" an das Gerät und es antwortet mit einem Wert.
Im Serial Port Monitor sieht das ganze so aus:


Request: 17.03.2010 10:55:01.83064
 41                                                A               
Answer: 17.03.2010 10:55:01.86164 (+0.0312 seconds)
 41 0D                                             A.              
Request: 17.03.2010 10:55:02.23664 (+0.3749 seconds)
 72                                                r               
Answer: 17.03.2010 10:55:02.25264 (+0.0156 seconds)
 72 0D                                             r.              
Request: 17.03.2010 10:55:02.01764 (+0.7498 seconds)
 41                                                A               
Answer: 17.03.2010 10:55:02.03364 (+0.0156 seconds)
 41 0D                                             A.              
Request: 17.03.2010 10:55:03.29864 (+0.2499 seconds)
 73                                                s               
Answer: 17.03.2010 10:55:03.31464 (+0.0156 seconds)
 73 20 20 20 20 2E 33 32 30 36 30 0D               s    .32060.

Versuche ich das gleiche mit meiner C# Anwendung, dann sieht es leider so aus:


Request: 17.03.2010 10:56:05.11164 (+62.7035 seconds)
 41 72 41 73                                       ArAs            
Port geschlossen


Für mich sieht es so aus, als ob Putty jedes Zeichen einzeln senden würde, dann das Zeichen inkl. einem CarriageReturn als Rückgabe erhält und nach dem letzten Zeichen der Steuerfolge dann der Wert kommt.

In meiner Anwendung wird anscheinend alles auf einmal geschrieben...

Wie gehe ich das Problem am besten an, damit jeder character beim Write direkt geschrieben wird ? Einfach den Wert für den Buffer verkleinern ? Oder hängt das Verhalten vielleicht an der Konfiguration des SerialPorts ?

16.03.2010 - 21:57 Uhr

Nach ein bisschen rumprobieren mit div. Events bin ich draufgekommen, dass anscheinend die letzte Row in meinem DataGridView aus irgendeinem Grund nie den RowState "Modified" bekommt.. sehr seltsam...
Weis jemand vielleicht wie das zustandekommen kann ?

16.03.2010 - 21:15 Uhr

Hallo,

ich habe hier ein DataGridView, das an eine DataTable gebunden ist.
Im CellEndEdit-Event führe ich ein paar Berechnungen aus und will dann eigentlich die Änderungen an die DB schreiben über einen TableAdapter.
Bisher bin ich davon ausgegangen, dass beim CellEndEdit der Editor beendet ist und dadurch auch die Änderungen in der DataTable erfolgt sind.

Jetzt habe ich mir das mal näher angesehen und festgestellt, dass selbst bei Änderung an den Daten der RowState der betreffenden Zeilen noch immer auf Unchanged steht.

Habe ich mir das falsche Event für den Zweck ausgesucht ? Für die Berechnungen passt's ja, aber gibts vielleicht ein anderes Event in dem ich den Update ausführen sollte, der immer nach Verändern des Wertes einer Zelle des DGV gefeuert wird ?

10.03.2010 - 23:10 Uhr

Hallo,

ich habe hier ein Dataset, eine Textbox und ein DataGridView.

Was ich gerne möchte ist folgendes:

In dem DGV werden die Daten aus einer Tabelle des DataSet angezeigt. Wenn ich auf eine Zeile klicke, dann wird der Inhalt einer bestimmten Spalte ebenfalls in der TextBox angezeigt.

Was ich gemacht habe:
DataSet mit DataMember an das DataGridView gebunden. Daten werden angezeigt.
TextBox mit


textBox.DataBindings.Add(new Binding("Text", dataSet, "tableName.Spalte"));

an das DataSet gebunden.

Was passiert ist folgendes:

Beim Starten des Programms wird ja automatisch die erste Zeile im DGV selektiert, der entsprechende Wert der Spalte wird auch in der TextBox angezeigt. Selektiere ich jedoch jetzt eine andere Zeile (entweder im DGV oder über


CurrencyManager curMan = (CurrencyManager)BindingContext[dataSet, "tableName"];
curMan.Position++;

dann verändert sich zwar die selektierte Zeile, aber in der TextBox wird nichts aktualisiert..

Kann mit jemand einen Tipp geben, was ich evtl. vergessen habe ? Arbeite leider das erste mal mit DataBinding, da ich normalerweise keine GUIs mache.
Vielen Dank !!!

03.03.2010 - 11:13 Uhr

Ok für alle die mal das gleiche Problem haben sollten:

Wenn auf dem Rechner Symantec Endpoint Protection installiert ist, dann muss die Option "Application and device control" deinstalliert werden. Danach geht wieder alles einwandfrei ...

03.03.2010 - 07:58 Uhr

Hallo,

habe ein neues Notebook bekommen und gleich ein komisches Problem:

Wenn ich ngen.exe oder aspnet_regiis.exe aufrufe, dann erhalte ich immer die Fehlermeldung

Anwendung konnte nicht richtig initialisiert werden (0xc0000005)

Also mal der Reihe nach das Framework 3.5, 3.0 und 2.0 deinstalliert mit dem dotnetfx-cleanup-tool. Dann mit dem großen 3.5er Package alle installiert - geht wieder.
Dann Visual Studio 2008 installiert, SP 1 drauf, gleicher Fehler wieder..

Hat jemand evtl. eine Idee was hier los sein kann ?

09.02.2010 - 21:49 Uhr

Hallo,

also wenn du die Daten in Excel weiterverarbeiten willst, dann würde ich die Daten als CSV-Datei exportieren.
Hat den Vorteil dass die Datei kleiner ist als XML (weniger Overhead), was allerdings bei der Anzahl egal sein sollte, aber vor allem kann die Datei direkt ohne Konvertierung in Excel geöffnet und auch in einem normalen Texteditor angezeigt werden.
Ach ja... Tipp am Rande: Beim Schreiben der Textdatei aufs Encoding achten, sonst kommen die Sonderzeichen falsch rüber ins Excel!

05.02.2010 - 09:16 Uhr

Dann brauchst du entweder die DateTime.Parse-Methode oder die DateTime.ParseExact-Methode.


DateTime dt = DateTime.Parse("...");

25.01.2010 - 12:31 Uhr

Die Frage ist erst einmal was du genau brauchst..

Willst du nur die .de - Domain oder evtl. auch entsprechenden Webspace (wie viel), E-Mail Hosting (Anzahl Accounts, Speicherplatz pro Account) ?
Wenn du auch Webspace willst, was soll der Anbieter unterstützen ? Nehme mal an wenn du in diesem Forum postest du willst eine .NET-Basierte Webseite erstellen und brauchst Windows-Hosting mit IIS ?
Brauchst du eine Datenbank (SQL-Server, mySql), PHP unterstützung o.ä. ?

Mit den Infos wärs leichter dir einen Tipp zu geben 😉

25.01.2010 - 11:24 Uhr

Die .exe.config-Datei wird ja aus der app.config im Project-Root erzeugt.

Hast du evtl. die .exe.config editiert und dann das Projekt neu kompiliert ? Dann wäre sie überschrieben worden und die Änderungen sind weg.

Alternativ im Kontextmenü der Projektmappe mal "Clean Project / Solution" und dann "Rebuild Project / Solution".. dann müsste alles sauber sein.

25.01.2010 - 11:21 Uhr

Kommt drauf an wie du die Files rüberschiebst, aber ich würde um Exceptions zu vermeiden vielleicht alle Dateien erst mal mit einem Präfix im Namen erzeugen, z.B.

Quelldatei "Test.zip" --> Übertragen als "TF_Test.zip" auf Zielrechner

Wenn der Upload abgeschlossen ist benennst du die Datei vom Quellrechner aus einfach wieder so um, dass das "TF_" vorne wegfällt.

In deinem Verarbeitungsprogramm setzt du einfach einen Filter, damit du die Dateien mit dem "TF_" nicht in deine Worklist bekommst. So stellst du sicher, dass du nicht versuchst Dateien zu öffnen, die noch gar nicht fertig übertragen sind.

25.01.2010 - 10:51 Uhr

Hallo,

also wenn du nur die Pfade variabel halten willst dann würde ich das nicht über ein Ressource-File machen sondern folgendermaßen:

Projekteigenschaften aufrufen und in den Tab "Settings" wechseln. Dann einen Namen z.B. "Quellpfad" eingeben und unter Type "string" eingestellt lassen. Als Scope stellst du "Application" ein, da der Parameter nicht Userabhängig sein soll sondern global für die Anwendung definiert wird. Unter Value kommt dann der Pfad rein...
Gespeichert wird das ganze in der app.config in deinem Projektverzeichnis.

Dann kannst du in deinem Projekt über


Properties.Settings.Default.Quellpfad

auf den Pfad zugreifen.

Wenn du das Projekt dann compilierst wird im Ausgabeverzeichnis eine Datei Programmname.exe.config mit erzeugt, in der diese Einstellungen drinnen stehen. Diese kannst du dann dafürlich auch nachträglich noch ändern.

Recht gut beschrieben (mit Bildern 😉) ist das Vorgehen unter Verwenden von Einstellungen in C#

24.01.2010 - 10:37 Uhr

Sollte das sein was du suchst:
MSDN - SqlCeEngine.Shrink Method

Ach ja.. und ich hab mir dazu das als Hinweis vermerkt SQL Server CE 3.5 Datenbank komprimieren... nicht dass du auch in das Problem reinläufst 😉

23.01.2010 - 15:01 Uhr

Der Code wird der Reihe nach abgearbeitet, ausser du verwendest asynchrone Funktionen.

Eine Frage: Wenn du die Datei aus den Ressourcen in den Applikationsordner entpackst, dann hast du die Datei ja trotzdem drin liegen. Löscht du die dann beim Beenden der Anwendung auch wieder? Welchen grundlegenden Vorteil siehst du da drin das so zu machen und nicht einfach die DLL zu kopieren, wenn doch am Schluss doch wieder zwei Dateien existieren?
In deinem Fall brauchst du mehr Speicherplatz (die Interop-DLL liegt einmal in der Anwendung selbst in den Ressourcen und einmal im Anwendungsverzeichnis), dafür musst du nur eine Datei kopieren - ok bei der Größe der Datei sicher vernachlässigbar 😉
Nur was machst du wenn der Anwender, der dein Tool verwendet keine Adminrechte auf dem Rechner hat bzw. keine Schreibrechte auf das Verzeichnis des Programms?
Das wird zwangsläufig zu einer SecurityException führen und zwar so, dass statt dem Programmfenster nur ein Exception-Fenster kommt.
Ich persönlich würde die wirklich empfehlen, deine EXE und die DLL einfach gleich zusammen auszuliefern, sei es als selbstentpackendes Zip-Archiv oder gleich als Setup-Projekt (sieht auch gleich viel professioneller aus).

23.01.2010 - 11:36 Uhr

Erst mal eine kleine Bemerkung vorweg: Wer schon einen Joke zur deutschen Rechtschreibung in der Signatur hat, der sollte sie auch verwenden 😉
Tja, das einfachste wenn es nicht installiert wird ist einfach die beiden Dateien zu kopieren. Und Programme kopiert man sowieso nicht auf den Desktop sondern in das Programmverzeichnis wie z.B. c:\Programme\Anwendung, auf dem Desktop liegt ja nur der Link. Und dem ist es herzlich egal ob da noch ne DLL dabei ist oder nicht, der Anwender merkt auch nix davon.
Wenn du .NET programmierst dann solltest du schon wissen was der GAC ist, oder zumindest mal Google bemühen.
Und evtl. wäre der Link Wie poste ich richtig? Punkt 1.1.1 und 4.c mal interessant für dich.
Wenn du keine Lust hast dich mit der MSDN zu beschäftigen dann gebe ich dir übrigens den Tipp das Entwickeln gleich zu lassen - da wirst du nicht weit kommen 😉

23.01.2010 - 10:53 Uhr

Die Interop.*.dll ist ja nur ein .NET Wrapper für die unmanaged wmp.dll, wobei die wmp.dll auf jedem System vorhanden sein sollte, auf der auch der Mediaplayer installiert ist.
Daher ist es logisch, dass diese Datei "greifbar" für dein Programm sein muss, da du ja keine unmanaged Zugriffe auf die wmp.dll machst (und sicher auch nicht machen willst). Die Reihenfolge der Ordner, die nach dieser DLL durchsucht wird, findest du hier, wobei zu beachten ist, dass im Falle von .NET an der obersten Stelle zusätzlich der GAC steht.
Wenn du diese DLL nicht in deinem Anwendungsverzeichnis haben willst, dann könntest du sie entweder an einen der Orte lt. Link kopieren (Systemverzeichnis, Windowsverzeichnis etc.) oder einen beliebigen Ort, wobei du die DLL dann im GAC registrieren müsstest damit sie auch gefunden und verwendet wird.
Auf jeden Fall ist hier der Aufwand meiner Meinung nach deutlich höher als die DLL einfach mit ins Programmverzeichnis zu kopieren. Wo der Mehrwert liegt, wenn man nur eine EXE im Programmverzeichnis hat und die DLLs im ganzen System verstreut sind weis ich nicht...

23.01.2010 - 10:16 Uhr

Hast du evtl. vergessen eingebundene DLLs mit in den Zielordner zu kopieren?
Wann tritt der Fehler denn auf ? Direkt beim Starten der Anwendung oder erst beim Klicken auf den Button ?

Falls der Fehler beim Starten auftritt ändere mal den Code folgendermaßen:


public partial class  Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
                wplayer.URL = @"C:\Dokumente und Einstellungen\User\Desktop\musik.mid";
                wplayer.controls.play();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

Anhand des Textes in der MessageBox kannst du dann normalweise sehen was Sache ist...

22.01.2010 - 20:01 Uhr

Also ohne konkrete Fehlermeldung oder etwas Code kann man erst mal nur sehr schwer etwas sagen.

Wie funktioniert der Dienst denn intern? Wenn du XML-Dateien verarbeitet dann nehme ich mal an hast du einen Timer oder einen Thread, mit dem du dann zeitgesteuerst die Daten verarbeitest?

Versuch doch z.B. einfach mal entweder den kompletten Inhalt deines Konstruktors mit einem


public Klassenname()
{
  try{ ... }
  catch(Exception ex)
  {
    File.WriteAllLines(@"c:\logdatei.txt", ex.ToString());
  }
}

abzusichern, so dass evtl. auftretende Exceptions weggeschrieben werden.

Alternativ könntest du ja auch per

System.Diagnostics.Debugger.Break();

einen Break auslösen und dein Visual Studio an den Prozess anhängen. Allerdings musst du mit dem Debuggen dann schnell sein, weil es da einen Timeout gibt..

Wenn du mit der ersten Möglichkeit einen Fehler bekommst poste ihn doch mal hier...

P.S.: Auch wenn man denkt man hat nur Pfade angepasst hat man meistens doch noch ganz unbewusst was anderes geändert bzw. "optimiert" 😉

22.01.2010 - 16:56 Uhr

Hallo zusammen,

im Moment bin ich bei der Fehlersuche einer Anwendung, wobei der Fehler offensichtlich mit der Zeitumstellung zu tun hat).
Jetzt bin ich erst mal dabei, alle möglichen Fehlerquellen zu eliminieren.
Meine Eingangsdaten erhalte ich dabei die über die API eines Systems, Zeitstempel werden als UTCSeconds geliefert. Die Konvertierung in ein DateTime Objekt funktioniert problemlos.

  1. Frage: Zur Erstellung des DateTime Objekts wird ein Konstruktor ohne explizite Angabe von DateTimeKind verwendet. Kann das problematisch werden ?

Die eingelesenen Daten werden zur internen Weiterverarbeitung in ein typed DataSet gespeichert.

  1. Frage: Macht es für ein eine DataSet Spalte vom Type DateTime einen Unterschied, welches DateTimeKind ein DateTime-Objekt hat ?
    Edit: Habe grade gesehen, dass ein DataSet einen DateTimeMode hat... Bei mir ist der DefaultWert "UnspecifiedLocal" eingestellt, der zugewiesene Wert "Unspecified".
    Aus der Erklärung in der MSDN werde ich leider auch nicht schlau. Kanns sein, dass mir hier aus irgendeinem Grund ein Offset auftaucht ?

Am Ende werden die Daten aus dem DataSet über ein einfaches SQL-Command als Parameter an einen SQL-Server übertragen. In den Datensätzen liegt also die UTC-Zeit

  1. Frage: Soweit ich weis, weis eine Spalte einer SQL-Server Tabelle nichts über die Zeitzoneninformationen der in ihr abgelegten Daten. Stimmt das so ?

Als Parameter zum Einlesen der Daten wird per SqlCommand aus der DB das MAX(Zeitstempel) ausgelesen (ist ja in UTC), in UTC-Seconds umgerechnet und dann die Abfrage durchgeführt.

Da ich selber keine Ideen mehr habe, wo hier was schief laufen kann, wäre ich dankbar über Ideen, wo hier was schief laufen kann.
Dass die API des Quellsystems fehlerhaft ist will ich ja mal nicht hoffen...

Vielen Dank schon mal !

22.01.2010 - 11:52 Uhr

Hast du schon mal versucht die .Margin Property so zu setzen, dass Left, Right, Top und Bottom auf 0 sind ?

10.01.2010 - 23:15 Uhr

Schwer zu sagen mit den Informationen, die du angegeben hast.. Interessant wäre:

  • Weches Terminal (Hersteller, OS) ?
  • Welcher RFID Leser (Hersteller -> wahrscheinlich Legic , Typ) ?

Evtl. gibts vom Hersteller schon fertige Bibliotheken zur Ansteuerung des Lesers. Alternativ Ansteuerung eben über COM-Port, da brauchst du allerdings auch eine entsprechende Dokumentation, welche Befehle du an den Leser schicken musst und was du zurückbekommst...

09.01.2010 - 13:03 Uhr

Hallo und herzlich willkommen erst mal.

Am besten ist es, du schaust dir folgendes Mal an:

Hier sollte sicher das dabei sein, was du suchst.

Grüße

04.01.2010 - 19:45 Uhr

Normalerweise denke ich solltest du da nichts extra machen müssen...

Kannst man von einem Rechner im Netz der FritzBox1 einen anderen Rechner der FritzBox2 anpingen ?
Denke mal eher dass es da evtl. an den Firewalleinstellungen der jeweiligen Rechnern liegt oder evtl. an den Sicherheitseinstellungen (gleiche Benutzernamen auf beiden Rechnern, aber unterschiedliche Passwörter etc.)...