Laden...
Avatar #avatar-2140.png
tom-essen myCSharp.de - Experte
Entwickler & Consultant NRW Dabei seit 15.05.2005 1.820 Beiträge
Benutzerbeschreibung
Interessen: CAPI, TAPI, TWAIN, Win32, Client/Server, Komponenten-Entwicklung, SharePoint, Azure, Cloud-Dienste. Hardware: Ständig wechselnd 😉

Forenbeiträge von tom-essen Ingesamt 1.820 Beiträge

23.10.2012 - 11:54 Uhr

Hallo!

Über welche Datenmengen sprechen wir den?
Musst du hinerher auch genau wissen, welche Änderungen angefallen sind, oder einfach nur das neue Ergebnis anzeigen?

Un was für Änderungen sollen "erkannt" werden: INSERT, UPDATE, DELETE?

Bei den neueren MS-SQL-DB's kann man sich benachrichtigen lassen, falls sich ein Abfrageergebnis ändert. Allerdings kann ich nicht sagen, ob dabei auch die Änderungen übertragen werden (vermute allerdings eher nicht).

02.10.2012 - 13:08 Uhr

Hallo!

Mit SharePoint-Boradmitteln ist dies nicht möglich.
Entweder findest du eine passende Erweiterung dafür, oder du musst dir selbst was schreiben.

Bzgl. 2 Variante:
Wenn es nur fix für diese eine Liste ist, und nicht an Kunden bzw. andere installationen gebunden werden soll:
Event-Receiver für New und Changed-Events registrieren, dort das Bild laden, skalieren und wieder speichern.

Um Event-Receiver zu registrieren, gibt's zum einen Erweiterungen, oder man schreibt ein kleines backup.

Die erweiterte Variante ist ein Feature, welches die Assembly im GAC deployt und die Event-Receiver registriert.

SharePoint ist so schon verdammt mächtig, und über Erweiterungen nahezu beliebig ausbaubar. Allerdings muss man sich schon einigermaßen mit der Struktur auskennen und (wie beim .NET-Framework) mit den entsprechenden SharePoint-.NET-Klassen.

Die Struktur einer SharePoint-installation kann man sich mit dem SharePoint-Manager (suche nach SPM auf CodePlex) anschauen. Dort gibt es spezielle Versionen für 2007, 2010 und sogar schon für 2013. Das Programm muss direkt auf dem SharePoint-Server gestartet werden.

02.10.2012 - 10:56 Uhr

Hallo,

habe aktuell dasselbe Problem, scheint aber rechner-abhängig zu sein. Auf dem Rechner, wo es fehlerhaft dargestellt wird, kann ich auch die Seiteneinstellungen nicht dauerhaft ändern. Bin auch noch am googeln, aber bis jetzt keine Lösung gefunden.

Wenn jemand sowas schonmal lösen könnte, wäre ich dankbar für Hinweise (umgekehrt werde ich eigene Erkenntnisse hier natürlich auch posten).

11.09.2012 - 09:12 Uhr

Hallo,

Zum einen gibts im dem Beispiel bei Codeproject tatsächlich ein Handle

In Windows hat JEDES Element auf dem Bildschirm ein Handle.

Hier bräuchte der TE das Handle vom Desktop, das ist schlecht

Warum? Auch der Desktop hat ein Handle.
Gibt viele Beispiele dazu hier im Forum.

Da laufen die Benachrichtigungen über COM

Auch beim Ziehen über einem Element gibt es die WindowMessages, nur keine Drag/Drop-spezifischen. In diesem Fall ist es MouseMove (oder MoveMouse?) und man muss dann prüfen, ob Maus-Button gedrückt ist, was aber über einen Hook rel. einfach ist.

22.08.2012 - 07:46 Uhr

Hallo,

als Kompromiss könnte man in den Einstellungen des Programms bzw. über die Kommandozeile das Polling-Interval vorgeben.

Oder ob er andersherum nicht viel zu viele Änderungen meldet, wenn die Datei nach jeder geschriebenen Zeile geschlossen wird.

Hierzu könnte man die Änderungs-Events zwar vermerken, aber nur im Zeitinterval die Änderungen seit dem letzten Lese-Vorgang ausgeben.

21.08.2012 - 07:26 Uhr

Hallo!

Sieht interessant aus. Schön wäre noch eine Option, Programme erst zu starten, wenn z.B. die CPU nur noch zu (z.B.) 20% beschäftigt ist, und bei Multi-Core-Systemen dann auf freie Kerne verteilt wird.

14.08.2012 - 15:47 Uhr

Hallo!

Besser wäre die Prüfung auf eine bestimmte Fensterklasse (sobald ein Fenster in diesem Prozess sichtbar ist). Dann könnte man im Idealfall sogar den fehlertext auslesen und den entsprechenden Button drücken (bzw. selbiges simulieren).

13.08.2012 - 07:41 Uhr

Hallo!

@Hobby Programmierer:
Das hätte aber den Nachteil, dass, wenn die Netzwerkverbindung abbr8icht oder die Anwendung abstürzt, dieser Eintrag nicht wieder entfernt werden kann.

06.07.2012 - 13:44 Uhr

Hallo!

Es könnte auch bzw. zusätzlich an den Rechten liegen. Evtl. hat das Konto, unter welchem der Dienst läuft, keinen Zugriff auf das Skript.

04.07.2012 - 14:48 Uhr

Hallo!

Aber genau dafür ist es gedacht: Ein Programm soll die Möglichkeit erhalten, vor einem Shutdown Daten zu sichern, ...

02.07.2012 - 09:10 Uhr

Hallo Pixel,

funktioniert den die Demo-Anwendung korrekt?

Bei mir liefert die korrekte Ergebnisse, evtl. müssen die Werte ja noch umgerechnet werden.

12.06.2012 - 09:38 Uhr

Hallo!

@BerndFfm:
Auch Oracle geht ohne Installation, allerdings muss man da zum einen einiges mehr an DLL's mit beitun (wobei sich hier dann die Frage stellt, ob dass so erlaubt ist) und zum anderen ist die Eingabe des Servers etwas umständlicher (da man dann die Einträge der tnsnames.ora direkt angeben muss).

11.06.2012 - 13:35 Uhr

Hallo!

Die von dN!3L genannten Methoden im StackFrame geben allerdings nur im Debug-Mode bzw. wenn die passende dbg-Datei vorhanden ist, die genauen Informationen zurück.

11.06.2012 - 11:17 Uhr

Hallo!

.NEt leifert dafür doch bereits alle Klassen, u.a. MailMessage (System.Net.Mail).

Dazu gibt's auch zahlreiche Beispiele.

09.05.2012 - 07:26 Uhr

Hallo!

Kann OpenOffice denn mittlerweile docx-Dateien öffnen? Denn diese kann man auch ohne installiertes Office erstellen.

09.05.2012 - 07:24 Uhr

Hallo!

In der aktuellen WindowsDeveloper (ehemals dotnet-Magazin) ist ein Artikel zu dem Thema (dokumentbasierte Anwendungssysteme). Dabei werden u.a. Ribbons und Tabs (wie in Visual Sutudio) als Mittel der Wahl beschrieben.

Der Quasistandard

Oberfläche und Bedienlogik für dokumentenbasierte Anwendungen
Bei modernen Konzepten für dokumentenbasierte Anwendungen hat sich einiges an der Gestaltung der Benutzeroberflächen geändert. Zum Beispiel die Integration der Ribbon Bar (Multifunktionsleiste), die die klassische Kombination aus Menü- und Symbolleiste ersetzt hat. Für dokumentenbasierte Programme lässt sich ebenfalls die Ablaufsteuerung (Bedienlogik) in gewissen Bereichen standardisieren. Diese und andere praktische Lösungsansätze sind Gegenstand des Artikels.
von Veikko Kryczyk

04.05.2012 - 09:22 Uhr

Hallo!

Das MouseClick-Event enthält die Mauskoordinaten. Diese musst du dann nur noch auswerten.

Wenn es WinForms-Elemente sind, haben diese jeweils ein eigenes MouseClick-Event, es reicht aus, dafür einen Handler zu schreiben, welcher dann anhand des sender-Objekts das Ziel bestimmen kann.

03.05.2012 - 15:03 Uhr

Hallo!

Es gibt den CDATA-Abschnitt in XML, darin kann man binäre Daten enkodiert verpacken.

03.05.2012 - 13:34 Uhr

Hallo!

Bei dem von herbivore genannten Link geht es um den Aufruf einer Systemfunktion.
Bei dem von dir gewünschten Ergebnis wirst du da nicht umher kommen, entsprechend sollte dir dieses Thema geläufig sein (Stichworte DllImport, P/Invoke).

03.05.2012 - 07:04 Uhr

Hallo,

also List<T> scheint vielleicht erstmal etwas komplex zu sein, aber man kommt eigentlich sehr schnell damit zurecht.

Dass man für jede zu schreibende Zelle in Excel eine Zeile Quellcode benötigt, ist falsch. Man kann das mit Schleifen machen (entweder for oder foreach).

Und zum Schreiben in Excel (oder MS-Office-Dokumente allgemein) gibt es eine sehr schöne Komponente: NetOffice - MS Office in .NET.

27.04.2012 - 09:38 Uhr

Hallo!

Beim Verwenden von Datumswerten in Datenbanken sollte man immer auch zuerst die Sprache der Datenbank in Erfahrung bringen, weil man nie sicher sein sollte, dass immer eine bestimmte Sprache verwendet wird (auch dann, wenn man die Anwendung nur für sich selber plant).

Einmal

SELECT @@LANGUAGE

als ExecuteScalar ausführen und behalten.


var dateStr = date.ToString("dd.MM.yyyy");
if (GetDbLanguage(dataSource) == "US_ENGLISH")
    dateStr = date.ToString("yyyy-MM-dd");

19.04.2012 - 14:08 Uhr

Hallo!

Wenn auch der Vorschlag von FZelle nicht hilft, kommst du evtl. mit dem Database-Explorer weiter, die Komponenten daraus kann man auch in eigene Programme einbinden (sind auch Beispiele dazu im Thread).

19.04.2012 - 14:03 Uhr

Hallo!

Für die System.Messaging-Queues gibt es doch die Completed-Events. Da wird in den Argumenten auch auf die Message verwiesen. Hilft das?

17.04.2012 - 10:24 Uhr

Hallo!

Die Tabelle muss in der Tat "händisch" erstellt werden.
Der Database-Explorer z.B. macht dies mit Hilfe der folgenden Klasse:


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace TD.Additional.Data.MSSql
{
    /// <summary>
    /// SQL table creation helper class.
    /// </summary>
    /// <example>
    ///var createTableCommand = Helpers.SqlTableCreator.GetCreateFromDataTableSQL(tableName, table, "Latin1_General_CI_AS");
    ///using (SqlCommand createTable = new SqlCommand(createTableCommand, connection))
    ///try
    ///{
    ///    var sqlResult = createTable.ExecuteNonQuery();
    ///    if (sqlResult != 0) { }
    ///}
    ///catch
    ///{
    ///    log.Error("Error creating sql table, command {0}", createTableCommand);
    ///    throw;
    ///}
    /// </example>
    public class SqlTableCreator
    {
        #region Instance Variables

        private SqlConnection _connection;
        public SqlConnection Connection
        {
            get { return _connection; }
            set { _connection = value; }
        }

        private SqlTransaction _transaction;
        public SqlTransaction Transaction
        {
            get { return _transaction; }
            set { _transaction = value; }
        }

        private string _tableName;
        public string DestinationTableName
        {
            get { return _tableName; }
            set { _tableName = value; }
        }

        #endregion

        #region Constructor

        public SqlTableCreator() { }

        public SqlTableCreator(SqlConnection connection) : this(connection, null) { }

        public SqlTableCreator(SqlConnection connection, SqlTransaction transaction)
        {
            _connection = connection;
            _transaction = transaction;
        }

        #endregion

        #region Instance Methods

        public object Create(DataTable schema)
        {
            return Create(schema, null);
        }

        public object Create(DataTable schema, int numKeys)
        {
            int[] primaryKeys = new int[numKeys];
            for (int i = 0; i < numKeys; i++)
                primaryKeys[i] = i;
            return Create(schema, primaryKeys);
        }

        public object Create(DataTable schema, int[] primaryKeys)
        {
            string sql = GetCreateSQL(_tableName, schema, primaryKeys);
            using (SqlCommand cmd = new SqlCommand(sql, _connection))
            {
                if (_transaction != null && _transaction.Connection != null)
                    cmd.Transaction = _transaction;
                return cmd.ExecuteNonQuery();
            }
        }

        public object CreateFromDataTable(DataTable table)
        {
            string sql = GetCreateFromDataTableSQL(_tableName, table);
            SqlCommand cmd;
            if (_transaction != null && _transaction.Connection != null)
                cmd = new SqlCommand(sql, _connection, _transaction);
            else
                cmd = new SqlCommand(sql, _connection);
            return cmd.ExecuteNonQuery();
        }

        #endregion

        #region Static Methods

        public static string GetCreateSQL(string tableName, DataTable schema, int[] primaryKeys)
        {
            string sql = "CREATE TABLE " + tableName + " (\n";

            // columns
            foreach (DataRow column in schema.Rows)
                if (!(schema.Columns.Contains("IsHidden") && (bool)column["IsHidden"]))
                    sql += column["ColumnName"].ToString() + " " + SQLGetType(column) + ",\n";
            sql = sql.TrimEnd(new char[] { ',', '\n' }) + "\n";

            // primary keys
            string pk = "CONSTRAINT PK_" + tableName + " PRIMARY KEY CLUSTERED (";
            bool hasKeys = (primaryKeys != null && primaryKeys.Length > 0);
            if (hasKeys)
            {
                // user defined keys
                foreach (int key in primaryKeys)
                    pk += schema.Rows[key]["ColumnName"].ToString() + ", ";
            }
            else
            {
                // check schema for keys
                string keys = string.Join(", ", GetPrimaryKeys(schema));
                pk += keys;
                hasKeys = keys.Length > 0;
            }
            pk = pk.TrimEnd(new char[] { ',', ' ', '\n' }) + ")\n";
            if (hasKeys) sql += pk;
            sql += ")";
            return sql;
        }

        public static string GetCreateFromDataTableSQL(string tableName, DataTable table, String collation)
        {
            string sql = "CREATE TABLE " + tableName + " (\n";

            // columns
            foreach (DataColumn column in table.Columns)
                sql +=
                    "[" + column.ColumnName + "] " +
                    SQLGetType(column) +
                    (String.IsNullOrEmpty(collation) || column.DataType != typeof(String) ? "" : " COLLATE " + collation) +
                    ",\n";
            sql = sql.TrimEnd(new char[] { ',', '\n' }) + "\n";

            // primary keys
            if (table.PrimaryKey.Length > 0)
            {
                sql += "CONSTRAINT [PK_" + tableName + "] PRIMARY KEY CLUSTERED (";
                foreach (DataColumn column in table.PrimaryKey)
                    sql += "[" + column.ColumnName + "],";
                sql = sql.TrimEnd(new char[] { ',' }) + "))\n";
            }
            else
                sql += ")\n";
            return sql;
        }

        public static string GetCreateFromDataTableSQL(string tableName, DataTable table)
        {
            return GetCreateFromDataTableSQL(tableName, table, null);
        }

        public static string[] GetPrimaryKeys(DataTable schema)
        {
            List<string> keys = new List<string>();
            foreach (DataRow column in schema.Rows)
                if (schema.Columns.Contains("IsKey") && (bool)column["IsKey"])
                    keys.Add(column["ColumnName"].ToString());
            return keys.ToArray();
        }

        // Return T-SQL data type definition, based on schema definition for a column
        public static string SQLGetType(object type, int columnSize, int numericPrecision, int numericScale)
        {
            switch (type.ToString())
            {
                case "System.Boolean":
                    return "BOOLEAN";
                case "System.String":
                    return "VARCHAR(" + ((columnSize == -1) ? 255 : columnSize) + ")";
                case "System.Decimal":
                    if (numericScale > 0)
                        return "REAL";
                    else if (numericPrecision > 10)
                        return "BIGINT";
                    else
                        return "INT";
                case "System.Double":
                case "System.Single":
                    return "REAL";
                case "System.Int64":
                    return "BIGINT";
                case "System.Int16":
                case "System.Int32":
                    return "INT";
                case "System.DateTime":
                    return "DATETIME";
                default:
                    throw new Exception(type.ToString() + " not implemented.");
            }
        }

        // Overload based on row from schema table
        public static string SQLGetType(DataRow schemaRow)
        {
            return SQLGetType(
                schemaRow["DataType"],
                int.Parse(schemaRow["ColumnSize"].ToString()),
                int.Parse(schemaRow["NumericPrecision"].ToString()),
                int.Parse(schemaRow["NumericScale"].ToString()));
        }

        // Overload based on DataColumn from DataTable type
        public static string SQLGetType(DataColumn column)
        {
            return SQLGetType(column.DataType, column.MaxLength, 10, 2);
        }

        #endregion
    }
}

Ist bestimmt noch anpassungsbedürftig, aber als Einstieg sollte es helfen.

11.04.2012 - 14:01 Uhr

Hallo!

Wieder ist eine aktualisierte Version über den Link im 1. Beitrag verfügbar.

Geändert wurde diesmal folgendes:*Übersichtlicherer Einstellungsdialog durch Verwendung von Registerkarten *Verbesserter SQL-Parser *Ausdruck der Struktur einer Datenquelle (über Kontextmenü) als TreeView *Im- und Export der Daten und der Struktur einer Datenquelle (über Kontextmenü) *Kontextmenü Spalte im Ergebnis: Ändern des Datentyps *Kontextmenü Zeile: Ausdruck von markierten Zeilen (als Tabelle, als Schlüssel-Wert-Paarung, ...)

01.04.2012 - 11:51 Uhr

Hallo!

Warum setzt Du nicht VOR dem lesen der DataTable die richtigen Typen?

Nurmal als Nachtrag zum möglichen Sinn eines solchen Vorgehens:
Ich habe aktuell ebenfalls dieses "Problem" in meinem Database-Explorer. Ich lese Daten einer CSV ein, die Spalten-Typen sind dann natürlich erstmal alle auf string. Will ich diese nun in eine andere Datenbank übertragen (z.B. MS SQL), möchte ich ggf. vorher einige Spaltentypen ändern.

juetho's beschriebene Vorgehensweise wird dafür am besten sein.

31.03.2012 - 22:37 Uhr

Hallo!

Idealerweise liegen dir die Exceldaten als DataTable vor, welche du dann als Datenquelle einem DataGridView übergeben kannst. Alles weitere ist spekulativ, da dein Beitrag nicht allzu ausführlich ist.

31.03.2012 - 22:35 Uhr

Hallo!

Allgemein betrachtet ist ein Excel-AddIn für einen C#-Neuling meiner Meinung nach etwas zu hoch gegriffen, evtl. sollte man erstmal mit einer kleinen StandAlone-Anwendung beginnen.

Die Excel-Datei kann man entweder mit OLE auslesen (Dazu gibt's hier im Forum einen großen Beitrag von Rainbord) oder man verwendet NetOffice - Ein versionsunabhängiger Wrapper für MS-Office (Dazu gibt's auf der CodePlex-Homepage auch zahlreiche Beispiele).

29.03.2012 - 10:07 Uhr

Hallo!

Ist jetzt schon abgeschaltet, man kommt nur noch ins Forum.

EDIT: Was passiert eigentlich mit den bereits vorhandenen Daten?

16.03.2012 - 07:02 Uhr

Hallo!

Er meint tatsächlich das das Speichern der Settings im Programmverzeichnis vernünftig ist.

Habe mir den Beitrag jetzt nicht komplett durchgelesen, aber alleine aufgrund des Namens denke ich mal, dass das empfohlene Einsatzgebiets auf Anwendungen liegt, welche nicht voll installiert wurden, sondern sich z.B. auf einem USB-Stick befinden, und dann halte ich diese Vorgehensweise durchaus für sinnvoll.

15.03.2012 - 16:11 Uhr

Hallo!

Über den Link im ersten Beitrag gibt’s wieder eine neue Version, u.a. mit den folgenden Änderungen:*Verbesserter SQL-Parser *Verbesserter Ausdruck des SQL-Baums *Beseitgung einiger kleinerer Fehler

13.03.2012 - 10:55 Uhr

Hallo!

Auf den ersten Blick sieht es so aus, dass zuerst die einfachen Elemente und dann die komplexen aufgeführt werden. Mach' doch mal testweise aus ORDER_PARTIES einen einfachen Typ ohne Unterelemente und lass nochmal eine XSD erstellen.

07.03.2012 - 08:16 Uhr

Hallo!

@Tortellini:

Was noch interressant wäre: ist es möglich, dass, wenn ich z.B. den Buchstaben "a" in einem Textdokument tippe, dieser sofort gespeichert und damit hochgeladen wird, sodass die Funktion "Speichern" entfällt?

Klar wäre das möglich. Aber je nach Größe der Datei wird die Anwendung dann auch träge. Zudem musst du bedenken, dass evtl. zwischen den Tastendrücken zuwenig Zeit bleibt, um die Datei zu übertragen. Du solltest in diesem Fall also eher eine Variante wählen, wo erst nach x Sekunden automatisch gespeichert wird, und diesen Auftrag in eine threadsichere Queue legen, welche in einem anderen Thread abgearbeitet wird.

Eine andere Möglichkeit wäre eine lokale Zwischenspeicherung und Übertragung erst bei Beendigung des Programms.

Bzgl. der Übertragungsmöglichkeit gibt es neben FTP auch noch WebDAV und bestimmt noch ein paar weitere. Für deine Anwendung solltest du dann evtl. auch eine Zwischenschicht für die Übertragung einrichten, um ohne große Umwege später umrüsten zu können

06.03.2012 - 14:34 Uhr

Hallo!

Insgesamt ein sehr komplexes Vorhaben.

Eine Möglichkeit, die mir spontan einfallen würde, wäre ein eigenes Programm, welches als Netzwerkdrucker fungiert. Dann lässt du die Datei über die Kommandozeile auf diesen Drucker drucken.

Dabei sehe ich aber folgende Hindernisse:*Evtl. ist es ohne Treiberentwicklung gar nicht möglich, einen Netzwerkdrucker einzurichten (oder reicht es im Idealfall, wenn am richtigen Port eine Anwendung auf Daten wartet?) *Wie sortiert man die Seiten, wenn ein solches Dokument 2 Seiten breit und 3 Seiten hoch ist? *In welchem Format werden die Daten übergeben?

Oder man versucht, GhostView möglichst automatisiert einzubinden.

05.03.2012 - 11:39 Uhr

Hallo!

zuweit weg um sie darüber anzuschließen

??? zwar hast du durch b bereits die Möglichkeit ausgeschlossen, ein ISDN-Kabel am PC anzuschließen, aber prinzipiell kann so ein Kabel locker 50m überbrücken.

Geht Capi nicht auch über Lan?

Ich weiss nicht, ob die FritzBox auch CAPI über LAN anbietet, aber selbst dann muss man am PC erstmal CAPI einrichten. Ansonsten ginge es noch über USB.

05.03.2012 - 08:18 Uhr

Hallo!

@bootscreen:
Hast du denn ISDN über die Box und die CAPI-Treiber auf deinem PC installiert?
Dann könntest du dir mal den CAPI-Wrapper anschauen.

Fragen dazu kannst du dann auch dort stellen.

01.03.2012 - 11:34 Uhr

Hallo MarC611,

Die Frage fällt eigentlich unter [Hinweis] Wie poste ich richtig?, 1.1 und 1.1.1.
Zumal es die Socket-Klasse (System.Net.Sockets) im Framework gibt, zu welchem die MSDN auch beispiele enthält.

Schau mal in [Tutorial] Client-/Server-Komponente über TCP-Sockets, da solltest du einige Anhaltspunkte finden.

23.02.2012 - 17:22 Uhr

Hallo!

Abgesehen davon, dass du mit keinem Wort erwähnt hat, ob bzw. was du bereits probiert hast, fällt das schon unter [Hinweis] Wie poste ich richtig? 1.1, 1.1.1, 4a, 5.

Das Stichwort hier wäre CSV (komma-separierte Textdateien).

Weiterhin möchte ich aber davon abraten, 2 Tabellen in einer Textdatei unterzubringen, da dies absolut unüblich ist, und anschließend nur wieder mit eigenen Methoden auslesbar ist (anstatt z.B. über ADO.NET). Nimm entweder 2 separate Dateien oder besser eine richtige Datenbank (z.B. SQLite, MS SQL Compact, ...).

23.02.2012 - 08:55 Uhr

Hallo!

Aus dem ersten Beitrag geht für mich nicht ganz deutlich hervor, ob es sich dabei nur um lokale Server handelt oder auch um bei Kunden betreute Server.

23.02.2012 - 08:52 Uhr

Hallo!

In einer DataTable werden null-Werte einer Abfrage nicht direkt als null zurückgegeben, sondern als DBNull.Value, d.h. du must darauf prüfen.

22.02.2012 - 13:46 Uhr

Hallo!

Warum verwendest du keine GraphicsPath, damit kannst du sowohl zeichnen als auch Berührungen prüfen (Hit-Test).

22.02.2012 - 11:02 Uhr

Hallo!

Hab' zwar auf der Seite nicht finden können, wie alt diese "Bedingungen" sind, aber ich stelle mal die folgende Vermutung auf:

Diese Seite ist evtl. schon etwas älter. Ursprünglich war es vielleicht wirklich mal von MS gewünscht, das .NET und Microsoft.NET nicht in Programm-Namen verwendet werden (bei zweiterem kann ich es sogar noch besser verstehen). Ab er mittlerweile ist ein .NET im Namen ja schon eher als Werbung für die Plattform zu sehen. Wenn man sich alleine mal anschaut, was auf CodePlex an Projekten liegt, welche ein .NET im Namen haben, glaube ich eher, dass MS das bei derzeitigem Gebrauch (dankend) billigt.

EDIT: Spellcheck

20.02.2012 - 09:56 Uhr

Hallo!

Im ersten Beitrag befindet sich eine neue Version des DBE zum Download.

Folgende Änderungen wurden vorgenommen:*Tabellen- und Spaltennamen lassen sich über das Kontextmenü in die Zwischenablage kopieren *Die Spaltenliste lässt sich über das Kontextmenü von "Columns" als text in die zwischenablage kopieren *Über "Tables" lassen sich alle leeren Tabellen ausblenden *Bei den Spalten wird nun (wenn möglich) angeziegt, ob diese zu einem Primärschlüssel gehören (vorangestelltes "(PK) ") *Invertierung des Ergebnisses über das neue Symbol in der Toolleiste ganz rechts (der rechtsgedrehte grüne Pfeil): Dadurch werden Zeilen und Spalten vertauscht *Kontextmenü in der ersten Zelle zwischen Zeilen- und Spaltenkopf *Erweitertes Kontextmenü der Ergebniszellen (s.u.) *Kein "Procedures"-Zweig mehr in der Baumansicht. Dieser wird erst wieder angezeigt, wenn ich die entsprechende Unterstützung implementiert habe, solange muss man den Umweg z.B. über Snippets nehmen. *Anzeige, welche Zelle "null" ist, also nicht einfach nur leer, sondern nicht gesetzt (durch ein kursiv dargestelltes "null") *Byte-Arrays werden nun in Hex-Schreibweise angezeigt (0x....) *In allen Datenquellen wird mittlerweile auch die Rückgabe zusätzlicher Informationen protokolliert (also z.B. Warnungen oder zusätzliche Fehlerinformationen, welche vom ADO.NET-Adapter kommen).

Hauptsächlich erweitert wurde das Kontextmenü der Ergebniszellen:*Zu referenzierten Spalten (also wo durch die geparste Anfrage eine eindeutige Rückverfolgung zur ursprünglichen Tabelle und Spalte möglich ist) ist nun eine Referenzierung zu anderen Tabellen möglich, ebenso wie eine Verwaltung der möglichen Werte zu Dokumentationszwecken *Textfeldinhalte können nun in einem Extra-Fenster (z.Zt. noch modal) als text, XML oder HTML angezeigt werden, wobei Text- und XML-Ansicht noch gleich sind (an einem ganz einfachen XML-Viewer arbeite ich gerade).

TODOs:
Da der Funktionsumfang mittlerweile doch recht groß geworden ist, bin ich aktuell auch dabei, eine Dokumentation zu schreiben.

17.02.2012 - 16:55 Uhr

Hallo!

@MrSparkle:

Wie soll daurch ein Performance-Gewinn entstehen? Wenn die Daten schon zeilenweise in der Datei stehen, kann man die Daten auch zeilenweise aus der Datei lesen und dann gleich verarbeiten.

Um die Datei zeilenweise einzulesen, müsste man byte für byte einlesen, anstatt immer ganze Blöcke einzulesen, was definitiv mehr Zeit kostet.
Die Daten im Speicher byte für byte durchzuarbeiten ist auf jeden Fall schneller.

15.02.2012 - 15:27 Uhr

Hallo!

Der Klassiker:
Die Methode wird nach Beendigung vom Framework erneut aufgerufen, wenn e.HasMorePages = true ist.

Also nicht die Liste innerhalb der Methode durchlaufen, sondern einen externen Index definieren (z.B. private int i = 0;) und am Ende um 1 hochzählen, die Schleife fällt weg.

15.02.2012 - 10:32 Uhr

Hallo!

Ich habe zuerst einmal ein Hauptverzeichnis für alles in C#.
Darunter habe ich dann Unterverzeichnisse für Grafiken, allgemeine Dokumente, Bibliotheken (libs), Projekte und externe Programme (sowohl Tools als auch externe Bibliotheken, könnte man evtl. auch noch trennen).
Unter Projete und Libs jeweils Unterverzeichnisse für die einzelnen Solutions, darunter dann Zweiger für trunk, branches und tags für SVN, darunter die Versionen (bzw. bei trunk heisst es current, um die Verzeichnistiefe gleich zu halten für rel. Verweise auf libs) und darunter wiederum Unterverzeichnisse für den Quellcode (src), Dokumentation (doc) und was evtl. sonst noch Projekt-spezifisch ist.

hab' mal ein Bild angehängt

10.02.2012 - 08:16 Uhr

Hallo!

Als Alternativangebot wäre evtl. noch http://www.posterxxl.de zu nennen, die machen aus einem Foto sogar Tapeten. Hab's allerdings bisher auch noch nicht getestet (u.a. der Preis hat mich erstmal abgehalten ...).

24.01.2012 - 10:16 Uhr

Hallo!

es gibt dafür bereits fertige Software, allerdings kostenpflichtig (ob kostenfrei für privaten Einsatz, kann ich jetzt nicht sagen).

Dafür einen eigenen Treiber schreiben zu wollen, halte ich für gewagt. Da sollte der Nutzen daraus schon enorm sein.

Evtl. als Alternative:
Man kann ja die Windows-Meldungen abfangen. Wenn nun einer der zu sperrenden USB-Sticks eingesteckt wurde, wirft man diesen gleich wieder aus. Ist zwar nicht die sicherste Lösung, aber zumindest sehr viel einfacher umzusetzen.