Z.B. nach dem InitializeComponent();
Den Rest bekommst du sicherlich alleine hin...
Das mit der Erweiterungsmethode kannst du erstmal vergessen, wenn dir das nichts sagt. Nicht schlimm.
Du rufst irgendwo in deinem Programm SetWebbrowserVersion(deineWebBrowserControlInstanz)
auf, oder?
Das this ist drin, da das bei mir eine Erweiterungsmethode ist. Wenn du die Methode in eine statische Klasse packst, funktioniert es mit this und du kannst direkt webBrowserControl1.SetWebbrowserVersion()
aufrufen.
Du musst irgendwann noch SetWebbrowserVersion
aufrufen (und dein WebBrowserControl übergeben). Hast du das gemacht?
Das Ergebnis ist dann z.B. (übrigens: Nachdem du einmal SetWebbrowserVersion aufgerufen, kannst du den Effekt nur rückgängig machen, indem du den angelegten Registry-Wert wieder manuell löscht oder den Namen deiner EXE-Datei änderst)
Die Control.Dock-Eigenschaft (oder ein TableLayoutPanel) kennst du, oder?
Pixelgenau selbst solltest du die Steuerelemente nicht selbst platzieren - da gibt es viel zu viele Sachen, die das später blöd aussehen lassen können (Schriftarten, DPI-Skalierung, ...)
Wenn ich dein Problem richtig verstehe, sollte folgender Code weiterhelfen (einfach einmal für ein WebBroserControl aufrufen, gilt dann für den ganzen Prozess):
/// <summary>
/// Aktiviert die aktuellen InternetExplorer-Features für das WebBrowser-Control
/// </summary>
public static void SetWebbrowserVersion(this WebBrowser webBrowser)
{
int registryValue = (webBrowser.Version.Major>=11) ? 11001 : (webBrowser.Version.Major==10) ? 10001 : (webBrowser.Version.Major==9) ? 9999 : (webBrowser.Version.Major==8) ? 8888 : 7000;
string registryKeyPath = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(registryKeyPath,true) ?? Registry.CurrentUser.CreateSubKey(registryKeyPath))
registryKey.SetValue(Process.GetCurrentProcess().ProcessName + ".exe",registryValue,RegistryValueKind.DWord);
}
In diesem Zusammenhang vll. auch noch interessant:
/// <summary>
/// Beschränkt die Persistenz von Cookies im WebBrowser-Control auf den aktuellen Prozess
/// </summary>
public static unsafe void SuppressWininetBehavior(this WebBrowser webBrowser)
{
int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
int* optionPtr = &option;
if (!InternetSetOption(0,81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/,new IntPtr(optionPtr),sizeof(int)))
throw new Exception("Something went wrong !>?");
}
[DllImport("wininet.dll",CharSet = CharSet.Auto,SetLastError = true)]
private static extern bool InternetSetOption(int hInternet,int dwOption,IntPtr lpBuffer,int dwBufferLength);
Das nächste Treffen findet am Donnerstag, den 11.12.2014, ab 18.30 Uhr statt.
[B]PostSharp[/B]
Im Entwickleralltag kommen zu den spezifischen Kundenanforderungen immer noch allgemeine Vorgaben z.B. Überwachung hinzu. Aspektorientierte Programmierung ist ein Ansatz um diese Vorgaben strukturiert und einfach zu erfüllen. Mit PostSharp steht dem .Net Entwickler ein Framework zur Implementierung von AOP zu Verfügung.
In diesem Vortrag werden die allgemeinen Grundlagen beleuchtet und die Wirkungsweise bzw. die Einsatzzwecke von PostSharp 3 vorgestellt. In praktischen Beispielen werden neben klassischen Anwendungsfällen wie Logging auch weitergehende Verwendungen wie UI-Manipulationen und sicheres Multithreading gezeigt. Hinzu kommt die Nutzung von PostSharp zur Überwachung von Architekturrichtlinien. Ein Ausblick auf die neue Version 4 rundet das Thema ab.
Referent: [i]Frank Pommerening[/i]
Eine Anmeldung ist unbedingt erforderlich. Die Anzahl der Teilnehmer ist auf 25 Personen begrenzt. Auf der Anmeldeseite wird auch angezeigt, wie viele Plätze noch frei sind.
Die Kosten des Abends werden wir mit voraussichtlich 3,- EUR wie gewöhnlich auf die Teilnehmer umlegen (Achtung: Außer Getränken gibt es keine Verpflegung).
Veranstaltungsort:
BBT Group GmbH, Bernburger Str. 30/31, 10963 Berlin
Das nächste Treffen findet am Donnerstag, den 13.11.2014, ab 18.30 Uhr statt.
[B]Xamarin[/B]
Xamarin ermöglicht die Entwicklung von iOS, Android, Mac und Windows Apps mit .NET.
Xamarin bietet ein einheitliches Tooling für alle Platformen und man kann mit C# in jeden AppStore der Welt verteten sein.
Jede Platform ist 100% in C# abgedeckt und ermöglicht so den Zugriff auf alle platformspezifischen Features.
Dadurch sind .NET Apps nicht von native Apps zu unterscheiden.
Es wird einen Überblick über die Xamarin Tools geben und eine Demonstration in App-Entwicklung.
Referent: [i]Mike Krüger[/i]
Eine Anmeldung ist unbedingt erforderlich. Die Anzahl der Teilnehmer ist auf 25 Personen begrenzt. Auf der Anmeldeseite wird auch angezeigt, wie viele Plätze noch frei sind.
Die Kosten des Abends werden wir mit voraussichtlich 3,- EUR wie gewöhnlich auf die Teilnehmer umlegen (Achtung: Außer Getränken gibt es keine Verpflegung).
Veranstaltungsort:
BBT Group GmbH, Bernburger Str. 30/31, 10963 Berlin
Es sollte auch nicht als Gegenargument herhalten. Ist viel mehr ein "nett gedacht aber total blöd umgesetzt".
Hier mal ein konkretes Beispiel für das Weglassen von MessageBoxen: Es gibt einen "Speichern (unter)"-Dialog für Datenquellen-Abfragen. Sobald man auf "Speichern" klickt und es eine Abfrage mit gleichem Namen schon gibt, kam die modale Nachfrage, ob man denn die existierende Abfrage überschreiben möchte (Ja, Nein, Abbrechen). Das ist allerdings ziemlich nervig, wenn man immer wieder speichert - denn die Antwort ist stets "Ja".
Ich habe den Dialog dann so umgebaut, dass einfach ein farblich auffälliger hinterlegter Hinweistext eingeblendet wird. Beim Klick auf "Speichern" wird die bestehende Abfrage einfach überschrieben. Da die alten Versionen eh erhalten bleiben (es gibt Versionierung) ist das im Endeffekt auch nicht so schlimm. Wieder unnötige Klicks gespart 😉
Ein sehr schlechtes Beispiel für den Einsatz nicht modaler Dialoge habe ich neulich bei einer Präsentation gesehen. Es ging gerade darum, wie man das Format von URLs anpassen kann. Das Resultat einer Codeänderung war ähnlich dem Screenshot von unten - Es sollte eine bestimmte Adresse aufgerufen werden, aber - obwohl eigentlich alles korrekt umgesetzt worden war - hat man nur ein "Not Found" gesehen. Auch nach mehrmaligem Aufrufen sah man kein Ergebnis.
Das Problem dabei war, dass schon alles einwandfrei funktioniert hat. Allerdings zeigt der Internet Explorer bestimmte Inhaltstypen nicht an, sondern blendet den "Speichern oder Öffnen"-Dialog ein - in dem Fall nicht modal ganz am unteren Rand. Die "Not Found"-Seite ist das Resultat irgendeiner Aktion davor. Alle haben nur auf die Adresszeile geguckt und (vermeintlich) einen 404 als Ergebnis gesehen. Dabei hätte man auf den Hinweis ganz unten gucken müssen.
Wenn du die Klassen eh schon generiert hast, wozu verwendest du dann noch die VS-Dienstverweise? Die brauchst du dann ja eigentlich nicht mehr.
Für die Verbindung zu Webservices erstelle ich mir immer manuell mit dem svcutil die entsprechenden Klassen und Konfigurationen und verzichte auf die VS-Dienstverweise. Da kannst du dann auch flexibel den generierten Code anpassen, ohne der Gefahr zu unterlaufen, dass der Code wieder überschrieben wird.
Das "Ahnung hab ich keine aber eine Idee" ist genau das Problem, was ich habe 😃
Die beiden Möglichkeiten, die gern genutzt werden, sind:*HTTP-Redirect. Die Umleitung an sich ist trivial, wie allerdings komme ich an die Stelle, an der man alle HTTP-Requests - egal an welche IP - manipulieren kann? *DNS-Redirect. Man macht quasi ein DNS-Poisoning (mit TTL=0, damit die Auswirkungen nicht so groß sind). Aber auch hier wieder - wie bekomme ich denn die Hotspot-User davon überzeugt, dass ich der zu verwendende DNS-Server bin? Und wie implementiere ich den am besten?
Wie gesagt, Ideen habe ich auch, aber wie würde eine konkrete Implementierung aussehen? Kann ich einfach so alle HTTP-Requests abfangen? Kann ich einfach einen eigenen DNS-Server implementieren? Wie mache ich möglichst wenig "kaputt" (wie kann ich das Server-System einfach in den Ursprungszustand versetzen und funktionieren die Clients nach einem Disconnect vom Netzwerk wieder normal)?
Hallo zusammen,
es gibt da ein Szenario, für dessen Lösung ich mir schon seit einigen Tagen den Kopf zerbreche (und irgendwie keinen richtigen Ansatz finde): Es soll ein (unverschlüsselter) WLAN-Hotspot bereit gestellt werden. Wenn man sich in dieses WLAN eingewählt hat, kann man darüber nur eine einzige Webseite erreichen.
Ein Use-Case wäre z.B., dass man in eine Kantine kommt, sich mit seinem Smartphone in das Kantinen-WLAN einwählt und das komplette Menüangebot für die aktuelle Woche angezeigt bekommt.
Das Erstellen eines WLAN-Netzwerkes mit Windows 7/8-Boardmitteln ist kein Problem. Ebensowenig das Bereitstellen der Webseite. Was mir das Kopfzerbrechen macht, sind die folgenden beiden Wünsche:*Es soll - egal welche Web-Adresse im Browser eingegeben wird(!) - immer auf die eine Portal-Webseite umgeleitet werden (läuft oft unter dem Begriff "captive portal"). *Nach dem Verbinden zum WLAN soll die Portal-Webseite sofort geöffnet werden.
Diese beiden Funktionen kenne ich z.B. von Hotel-WLANs. Man kann sich ins WLAN einwählen, wird aber (zunächst) immer auf die WiFi-Login-Seite umgeleitet; oder man muss zunächst die AGBs für die freie Internetbenutzung bestätigen (wie es z.B. oft bei populären Restaurants/Cafés angeboten wird). Ebenso kenne ich es vom Smartphone, dass gleich nach dem Verbinden zum WLAN die entsprechende Login/AGB/...-Seite geöffnet wird.
Kann ich diese Funktionen irgendwie unkompliziert und mit Boardmitteln umsetzen? Zielsystem ist Windows 7/8; der Webserver (IIS) läuft auf dem gleichen Rechner, der den Hotspot bereit stellen soll; eine Freigabe der Internetverbindung ist nicht notwendig (und auch nicht gewünscht).
Es wäre schön, wenn mir jemand einen Stups in die richtige Richtung geben könnte 😃
dN!3L
Wenn es ein MS SQL Server ist: Man kann auch CLR-Sachen direkt in den SQL Server laden. Siehe z.B. Erstellen von Datenbankobjekten mit CLR-Integration (Common Language Runtime). Die Logik kannst du dann "ganz normal" mit .NET/C#-Mitteln implementieren und die markierten Methoden dann direkt in einem SQL-Statement aufrufen.
Das spart dann das Abfragen und Übertragen von Daten aus dem SQL-Server in die .NET-Anwendung (und ggf. wieder zurück). Zudem kann der SQL-Server noch diverse Optimierungen anwenden.
[SqlFunction(IsDeterministic=true,IsPrecise=true)]
public static int EditDistance(string first,string second,int limit)
{
...
}
[SqlFunction(IsDeterministic=true)]
public static string Normalize(string value)
{
if (String.IsNullOrEmpty(value))
return value;
else
{
// alles klein schreiben
string result = value.ToLower();
result = Regex.Replace(result,@"\s+"," ");
// verschiedene Arten "straße"/"strasse"/"str" vereinheitlichen
result = Regex.Replace(result,"stra(ß|ss)e","str");
// verschiedene Artten deutscher Sonderzeichen vereinheitlichen
result = Regex.Replace(result,"ä|ae","a");
result = Regex.Replace(result,"ö|oe","o");
result = Regex.Replace(result,"ü|ue","u");
result = Regex.Replace(result,"é|è","e");
result = Regex.Replace(result,"ß","ss");
return result;
}
}
Das nächste Treffen findet am Donnerstag, den 04.09.2014, ab 18.30 Uhr statt.
[B]WebAPI & SignalR[/B]
Client-Server-Architekturen sind seit geraumer Zeit bekannt und heutzutage in fast jedem Projekt anzutreffen. Seit der Mobilisierung des Webs ist eine Vielzahl an Geräten entstanden, die ständig online sind und Daten miteinander austauschen. Dabei ist nicht nur die Rede von Smartphones oder Ultrabooks, sondern auch von Fahrzeugen, Haushaltsgeräten etc. In solch einer vernetzten Welt, in welcher der Begriff "Internet of Things" geprägt wurde, sind leichtgewichtige Nachrichtenformate und Kommunikationsprotokolle daher so abkömmlicher.
Vor einiger Zeit war man im Microsoft .Net-Umfeld dabei auf die WCF angewiesen. besondere auf die schwergewichtigen SOAP-Services. Für die oben eschriebenen Szenarien sind diese aber recht ungeeignet. In meinem Vortrag möchte ich daher gerne die Asp.Net WebAPI vorstellen und zeigen, wie leicht REST-basierte Services mit Microsoft Visual Studio 2013 gebaut werden können. Ich möchte ebenfalls SignalR, als ein Framework für die Iplementierung von Echtzeit-Webfunktionalitäten, vorstellen. SignalR gleidert sich dabei sehr gut in den Microsoft Web Stack ein.
Referent: [i]Robin Sedlazcek[/i]
Eine Anmeldung ist unbedingt erforderlich. Die Anzahl der Teilnehmer ist auf 25 Personen begrenzt. Auf der Anmeldeseite wird auch angezeigt, wie viele Plätze noch frei sind.
Die Kosten des Abends werden wir mit voraussichtlich 3,- EUR wie gewöhnlich auf die Teilnehmer umlegen (Achtung: Außer Getränken gibt es keine Verpflegung).
Veranstaltungsort:
BBT Group GmbH, Bernburger Str. 30/31, 10963 Berlin
Das nächste Treffen findet am Donnerstag, den 20.03.2014, ab 18.30 Uhr statt.
[b]Erfolgreich im Scrum-Team mit Visual Studio Team Foundation Server (TFS) [/b]
Nur weil man bei einem Projekt mit der Scrum-Prozessvorlage startet, macht man als Team noch lange kein Scrum. Doch auch, wenn man den Scrum-Regeln folgt, stellt sich nicht automatisch der gewünschte Erfolg ein. Der richtige Mix aus einem gut harmonierendem Team, abgestimmten Vorgehensweisen und den passenden Werkzeugen wird gesucht. Dieser Vortrag zeigt Tipps und Empfehlungen zu allen drei Bereichen auf.
Referent: [i]Neno Loje[/i]
Eine Anmeldung ist unbedingt erforderlich. Die Anzahl der Teilnehmer ist auf 25 Personen begrenzt. Auf der Anmeldeseite wird auch angezeigt, wie viele Plätze noch frei sind.
Die Kosten des Abends werden wir mit voraussichtlich 3,- EUR wie gewöhnlich auf die Teilnehmer umlegen (Achtung: Außer Getränken gibt es keine Verpflegung).
Veranstaltungsort:
BBT Group GmbH, Bernburger Str. 30/31, 10963 Berlin
Wie groß dürfen diese Informationen sein, damit Diese danach wieder aus dem Code gelesen werden können?
Für QR-Codes gibt es ja verschiedene Größen (min 21×21, max 177×177) und außerdem verschieden starke Fehlerkorrektur-Levels (7% bis 30%).
Zitat von: QR-Code – Wikipedia
Der maximale Informationsgehalt eines QR-Codes (177×177 Elemente, Fehlerkorrektur-Level "L") beträgt 23.648 Bit (2.953 Byte). Damit lassen sich laut Hersteller 7.089 Dezimalziffern, 4.296 alphanumerische Zeichen oder 1.817 Kanji-/Kana-Zeichen kodieren
Da eine GUID 16 Bytes groß ist, könntest du im größtmöglichen QR-Format mit kleinstmöglichem Fehlerkorrekturcode also eine Liste von 184 GUIDs unterbringen.
Diese Emails bekommen teilweise einen relativ hohen Spam-Score. Ich habe die entsprechenden Gründe (unser Filter z.B. meldet BAD_ENC_HEADER=2.87, HTML_MESSAGE=0.001, MIME_HTML_ONLY=1.672, MIME_QP_LONG_LINE=1.819) schon mehrfach den Organisatoren gemeldet, bis jetzt hat sich aber nie was getan. 😕
Das nächste Treffen findet am Donnerstag, den 09.01.2014, ab 18.30 Uhr statt.
[b]Das X in DOC - Abbildung von Schriftprozessen mit Office der nächsten Generation[/b]
Während es früher beim Schriftgut im Wesentlichen auf Form und Inhalt ankam, erwartet man von heutigen Dokumenten zusätzliche die Einbindung von Daten und die Automatisierungen der Kommunikationsprozessen. Dokumente werden teilweise individuell vom Benutzer auf dem Client erstellt oder aber auch vollautomatisch auf Serversystemen mit heterogenen Datenquellen generiert. Oft erfolgt eine Weiterverarbeitung der Dokumente auf heterogenen Systemen, die einen automatischen Transfer der Dokumente in verschiedene Datei-Formate voraussetzt.
Referent: [i]Thomas Gross[/i]
Eine Anmeldung ist unbedingt erforderlich. Die Anzahl der Teilnehmer ist auf 25 Personen begrenzt. Auf der Anmeldeseite wird auch angezeigt, wie viele Plätze noch frei sind.
Die Kosten des Abends werden wir mit voraussichtlich 3,- EUR wie gewöhnlich auf die Teilnehmer umlegen (Achtung: Außer Getränken gibt es keine Verpflegung).
Veranstaltungsort:
BBT Group GmbH, Bernburger Str. 30/31, 10963 Berlin
Hilft aber irgendwie nicht. Es wird mir nach wie vor angezeigt.
Das EditorBrowsable-Attribut hat keine Wirkung, wenn sich das Element in der gleichen Assembly befindent, innerhalb der du IntelliSense aufrufst.
Klar kannst du das mit LINQ machen. Üblicherweise wäre das Code wie
string[] articleNumbers = new [] { "ABC","DEF","GHI" };
var query = dataContext.Articles.Where(a => articleNumbers.Contains(a.ID));
Allerdings habe ich festgestellt, dass es da sehr große Unterschiede je nach QueryProvider (LINQ2SQL, Entity Framework, OpenAccess ORM, ...) gibt.
Es kann sein, dass entweder so ein Konstrukt gar nicht unterstützt wird (der QueryProvider weiß halt nicht, was er da für ein SQL draus basteln soll). Manchmal muss man auch bestimmte Dinge einhalten - z.B. gehen nur Arrays als Datentyp für die Liste, aber keine Listen oder IEnumerable allgemein. Manche QueryProvider mögen auch keine äußeren Variablen - wodurch man das Konstrukt überhaupt nicht so verwenden kann, wie man das will.
Die einzige Lösung, die für alle QueryProvider funktioniert, ist eine Transformation des Expression-Trees vor der Übergabe an den Provider. Wo dann der list.Contains(a.ID)-Ausdruck vollständig ausgerollt und durch ein entsprechendes (a.ID=="ABC" || a.ID=="DEF" || a.ID=="GHI") ersetzt wird.
I present... class var 😄
Genau! Der Trick ist, dass var
eine Klasse ist. Die Möglichkeit, verschiedene Typen zuweisen zu können, bekommt man dann durch implizite Operatoren. Und das Verhalten bei Console.WriteLine ebenso (plus Hilfe von der Overload Resolution).
Siehe auch Jon Skeet: Abusing C# on Vimeo. zommi ist dran 👍
Hallo zusammen,
der Code der Main-Methode von oben (ich habe noch die Methoden- und Klassendefinition hinzugefügt) soll nicht geändert werden. Code außerhalb der Main-Methode hinzuzufügen ist erlaubt.
So für sich allein kompiliert der Code auch nicht - was ist also nötig, damit der Code erstens kompiliert und zweitens die gewünschte Ausgabe liefert?
Ist das auch Absicht
Das ist alles Absicht. 😃
Kompiliert auch mit dem ganz normalen C#-Compiler.
Dann die neue Aufgabe:
Der folgende Code (sic!)...
[csharp]
using System;
static class Program
{
static void Main()
{
var limit = 10;
limit = "five";
for (var x=0;x<limit;x++)
{
Console.WriteLine(x);
Console.WriteLine("The current value of x is {0}",x);
}
}
}
[/csharp]
...soll folgende Ausgabe erzeugen:
[frame]
[FONT]0
The current value of x is zero
1
The current value of x is one
2
The current value of x is two
3
The current value of x is three
4
The current value of x is four[/FONT]
Wie geht das?[/frame]
Im Anhang befindet sich eine geheime Nachricht. Wie lautet sie?
"HELLO WORLD". Sieht man aber quasi schon 😃 Und validiert mit der Pipette aus Paint.NET und der ASCII-Tabelle.
Was willst du als Lösung? Nur die Nachricht? Code, der die Nachricht dekodiert? Oder den Ursprungscode, der das Bild erzeugt?
Das nächste Treffen findet am Donnerstag, den 07.11.2013, ab 18.30 Uhr statt.
[B]DataAnnotations - die Kraft der Attribute [/B]
Alles, aber auch wirklich alles über die Attribute aus (unter anderem) dem Namensraum System.ComponentModel.DataAnnotations. Im Kontext praktischer Beispiele wird gezeigt, wie elegant deklarative und modellgetriebene Programmierung ist. Die Session zeigt die Anwendung, die Effekte in Webapplikationen und den Umgang im Zusammenhang mit Entity Framework Code First.
Ein echtes Aha-Erlebnis ist hier garantiert!
Referent: [i]Jörg Krause[/i]
Eine Anmeldung ist unbedingt erforderlich. Die Anzahl der Teilnehmer ist auf 25 Personen begrenzt. Auf der Anmeldeseite wird auch angezeigt, wie viele Plätze noch frei sind.
Die Kosten des Abends werden wir mit voraussichtlich 3,- EUR wie gewöhnlich auf die Teilnehmer umlegen (Achtung: Außer Getränken gibt es keine Verpflegung).
Veranstaltungsort:
BBT Group GmbH, Bernburger Str. 30/31, 10963 Berlin
Der Fehler ist dann im Return der data, da kommt dann nicht 0 sondern 255 (sagt mir leider nix da kein negativ Value)
Mach ein sbyte
draus, dann wird's auch negativ 😉 Wenn du mal in CtReturnCode.cs guckst, sollte das auf einen HTSi error hindeuten - was immer das für deinen Fall bedeuten mag...
Mit "scheinbar" und "meiner Meinung nach" können wir aber nur in die Glaskugel gucken, was denn der Fehler sein könnte. Zeig doch mal etwas Code für das Anfordern der Daten.
Hast du die KVK- & eGK-API (via CTAPI) mal ausprobiert?
Kann ich davon ausgehen, dass das auch so unperformant ist, wie Reflection[...]
Es gibt übrigens einen Unterschied zwischen langsam und nicht schnell genug.
Die schlechte Performance von Reflection wird erst für den Benutzer bemerkbar, wenn du eine Aktion wirklich oft durchführst (Vergleichszahlen siehe z.B. in DynamicFieldAccessor statt Reflection - schneller dynamischer Zugriff auf Felder/Properties - ab ca. 500.000 Wiederholungen dauert es länger als eine Sekunde). Und bei deinem Anwendungsfall dürfte die Ausführung des SQL-Befehls um Größenordnungen länger dauern, als das Zusammenbasteln des SQL-Befehls.
Habe ich das richtig verstanden, dass die from-Klausel mit dem in dahinter nur eine rein deklarative Bedeutung haben, also nur zum deklarieren der Variable dienen und selber auf Code-Seite (Also die Erweiterungsmethoden) keine Bedeutung haben?
Jein. Ja, es dient nur der Deklaration der Variablen; aber für die Erweiterungsmethoden wird halt genau dieser Name für den Lambda-Parameter benutzt - von daher ist das schon irgendwie von Bedeutung (wobei ein Variablenname aber in der Regel für die Programmausführung nicht von Belang ist).
Naja, ob das schön ist, weiß ich nicht, aber: Man deklariert vor dem from einen Variablennamen. Wenn du in den Select/Where/OrderBy...-Methoden Expressions verwendest, kannst du diesen Namen auch auslesen. Der Wert ist dann aber wirklich (nur) der Name - dort irgendwas als Parameter übergeben geht nicht.
Das würde dann so aussehen:
IDbConnection connection = new SqlConnection(connectionString);
Foo foo = from Persons in connection.AsFoo()
where "Age > 18"
select "Name, Age";
string sql = foo.ToString(); // ergibt "SELECT Name, Age FROM Persons WHERE Age > 18"
Code dahinter:
public static class DbCommandExtensions
{
public static Foo AsFoo(this IDbConnection dbConnection) { return new Foo(); }
}
public class Foo
{
private string from;
private string where;
private string select;
public Foo Where(Expression<Func<Foo,string>> expression)
{
this.where = this.Handle(expression);
return this;
}
public Foo Select(Expression<Func<Foo,string>> expression)
{
this.select = this.Handle(expression);
return this;
}
private string Handle(Expression<Func<Foo,string>> expression)
{
this.from = ((LambdaExpression)expression).Parameters[0].Name;
return expression.Compile()(this);
}
public override string ToString()
{
return "SELECT "+this.select+" FROM "+this.from+" WHERE "+this.where;
}
}
Hätte nicht gedacht, dass das so einfach ist, aber das ist ja fast schon kinder leicht 😄
Naja, das ist ein Minimalbeispiel - hier wird ja nur naiv Text verkettet. Aber gerade bei SQL musst du dir deine Konstrukte gut durchdenken, sobald es um Parameter geht (und das wird es schnell).
Vielleicht ist das Thema "Micro-ORM" (z.B. Dapper, PetaPoco, SqlFu, ...) für dich interessant. Das ist nicht ganz so abstrakt wie z.B. LINQ2SQL oder das EF, kann aber auch helfen, leichter Code zu schreiben.
Das geht nicht so einfach, denn diese Linq-Syntax wird vom Compiler in die entsprechenden Erweiterungs-Methoden übersetzt. Z.B. select -> Enumerable.Select.
So ganz ist das nicht korrekt. Der Compiler setzt nicht die entsprechenden Erweiterungsmethoden ein. Stattdessen wird einfach ganz stupide eine Texttransformation durchgeführt. Dem Compiler ist dort herzlich egal, ob die Quelle ein IEnumerable, IQueryable oder sonstwas ist; ebensowenig müssen Where/Select/... Erweiterungsmethoden sein.
Beispiel:
var res = from p in src
where p.Price > 100m
group p by p.Category;
wird einfach zu
var res = src
.Where(p => p.Price > 100m)
.GroupBy(p => p.Category);
Dem Compiler ist hierbei egal, was src
für einen Datentypen hat. Ebenso können Where
und/oder GroupBy
auch Instanzmethoden sein. Die einzige Anforderung ist, dass sich der transformierte Code kompilieren lässt.
Am besten mal nach "Bart de Smet, LINQ to Everything" googlen.
Dadurch kann man z.B. folgende Sachen machen:
Foo foo = from a in new Foo("Articles")
where "ArticleNo = 5000"
orderby "ArticleNo"
select "ArticleId,ArticleNo";
string sql = foo.ToString(); // ergibt "SELECT ArticleId,ArticleNo FROM Articles WHERE ArticleNo = 5000 ORDER BY ArticleNo"
Das ganze wird folgendermaßen umgesetzt:
public class Foo
{
private string from;
private string where;
private string orderBy;
private string select;
public Foo(string tableName)
{
this.from = tableName;
}
public Foo Where(Func<Foo,string> bar)
{
this.where = bar(this);
return this;
}
public Foo OrderBy(Func<Foo,string> bar)
{
this.orderBy = bar(this);
return this;
}
public Foo Select(Func<Foo,string> bar)
{
this.select = bar(this);
return this;
}
public override string ToString()
{
return "SELECT "+this.select+" FROM "+this.from+" WHERE "+this.where+" ORDER BY "+this.orderBy;
}
}
Wie man sieht, basiert das weder auf IEnumerable/IQueryable/etc. noch müssen Where/Select/etc. Erweiterungsmethoden sein.
Da gibt's schon mehrere Threads zu...
Informatik-Studium sinnvoll/nützlich? Welche Alternativen zum Studium sind sinnvoll/nützlich?
Was haltet ihr vom Informatik-Studium?
Welche Weiterbildung? Studium (Bachelor), Staatlich geprüfter Techniker, IHK Weiterbildung
Abschluss: Berufskolleg mit einem "richtigen" Studium an einer Uni/FH vergleichbar?
Mit dem NTFS bzw. USN-Journal kann man aber (sehr performancegünstig) zumindest die Events für das Dateisystem (Anlegen, Ändern, Löschen) erhalten.
Es könnte natürlich jetzt an der Kombination mit TopMost liegen[...]
Also bei mir nicht. Auch mit TopMost=true
kann ich da einfach hindurch klicken.
Häng doch mal dein Testprojekt an...
Was genau suchst du? In Web Services Description Language Tool (Wsdl.exe) ist ja die Benutzung erklärt.
Ansonsten ist die Funktionalität dieser ganzen kleinen Tools (wsdl.exe, xsd.exe, ...) auch direkt im .NET-Framework enthalten.
Um aus einer WSDL C#-Code zu generieren, kannst du folgenden Codeschnipsel verwenden (hab ich aus einem älteren Projekt rauskopiert):
string wsdlFile = webClient.Download...
// initialize a service description importer.
ServiceDescriptionImporter serviceDescriptionImporter = new ServiceDescriptionImporter();
serviceDescriptionImporter.ProtocolName = "Soap";
serviceDescriptionImporter.Style = ServiceDescriptionImportStyle.Client;
// discover the WSDL
ServiceDescription serviceDescription = ServiceDescription.Read(wsdlFile);
DiscoveryClientProtocol discoveryClientProtocol = new DiscoveryClientProtocol();
discoveryClientProtocol.DiscoverAny(wsdlFile);
foreach (DictionaryEntry discoveryClientDocument in discoveryClientProtocol.Documents)
{
if (discoveryClientDocument.Value is ServiceDescription)
serviceDescriptionImporter.AddServiceDescription((ServiceDescription)discoveryClientDocument.Value, null, null);
if (discoveryClientDocument.Value is XmlSchema)
serviceDescriptionImporter.Schemas.Add((XmlSchema)discoveryClientDocument.Value);
}
// initialize a Code-DOM tree into which we will import the service
CodeNamespace codeNamespace = new CodeNamespace("SampleApp.Generated");
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
codeCompileUnit.Namespaces.Add(codeNamespace);
// import the service into the Code-DOM tree
serviceDescriptionImporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;
serviceDescriptionImporter.Import(codeNamespace, codeCompileUnit);
// we use WSE 3.0
foreach (CodeTypeDeclaration codeTypeDeclaration in codeNamespace.Types)
if (codeTypeDeclaration.BaseTypes.Count != 0 && codeTypeDeclaration.BaseTypes[0].BaseType == typeof(SoapHttpClientProtocol).FullName)
{
for (int i = 0; i < codeTypeDeclaration.Members.Count; i++)
if (codeTypeDeclaration.Members[i] is CodeConstructor)
codeTypeDeclaration.Members.RemoveAt(i--);
// change the base class
codeTypeDeclaration.BaseTypes[0] = new CodeTypeReference("Microsoft.Web.Services3.WebServicesClientProtocol");
// add a constructor that takes an EndpointReference and assigns it to the Microsoft.Web.Services3.WebServicesClientProtocol.Destination
CodeConstructor codeConstructor = new CodeConstructor();
codeConstructor.Attributes = MemberAttributes.Public;
codeConstructor.Parameters.Add(new CodeParameterDeclarationExpression("Microsoft.Web.Services3.Addressing.EndpointReference", "endpointReference"));
codeConstructor.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Destination"), new CodeArgumentReferenceExpression("endpointReference")));
codeTypeDeclaration.Members.Add(codeConstructor);
// add a constructor that takes string and assigns it to the Microsoft.Web.Services3.Url
codeConstructor = new CodeConstructor();
codeConstructor.Attributes = MemberAttributes.Public;
codeConstructor.Parameters.Add(new CodeParameterDeclarationExpression("System.String", "url"));
codeConstructor.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "Url"), new CodeArgumentReferenceExpression("url")));
codeTypeDeclaration.Members.Add(codeConstructor);
}
// generate source code
CSharpCodeProvider cSharpCodeProvider = new CSharpCodeProvider();
StringWriter stringWriter = new StringWriter();
cSharpCodeProvider.GenerateCodeFromNamespace(codeNamespace, stringWriter, null);
return stringWriter.ToString();
Hm, also ich kann bei meinem Windows 8 durch ein simples Fenster mit TransparencyKey = BackColor durchklicken.
Bist du sicher, dass es nicht noch an etwas anderem liegt (eigene Verarbeitung von Window-Messages oder so)? Vll. mal [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden probieren.
Ja, möglich ist das. Aber was sonst erwartest du für eine Antwort?
Suchst du Technologien dafür (WCF, Remoting, ...)? Was hast du überhaupt für eine "App" (Desktop, Web, ...)?
Bitte beachte [Hinweis] Wie poste ich richtig?
Naja, die Semantik vom Prä-/Postinkrement ist schon ein wenig anders, als du dir das vorstellst. Siehe auch Operator ++ (C#-Referenz).
Der Unterschied zwischen Prä und Post kommt nur zum Tragen, wenn du die Variable gleichzeitig auch ausliest. Das tust du in deinem Beispiel aber nicht. Wo es einen Unterschied macht:
int i = 0;
Console.WriteLine(i++);
vs.
int i = 0;
Console.WriteLine(++i);
P.S.: Ebenfalls vielen Dank für die Seite mit der Auflistung der Propertys, die werd ich bestimmt noch mal brauchen 😉
Ich durfte und konnte unseren Code für die einfache Verwendung von WIA (zum Scannen) jetzt aus den Tiefen der Firmeninterna befreien und veröffentlichen:
ScanWIA - CodePlex
Da findest du dann auch alle restlichen Properties. 😉
Den konkreten Code zum Dekodieren darf ich nicht posten.
Ich durfte und konnte unseren Code zum Auslesen der KVK & eGK jetzt aus den Tiefen der Firmeninterna befreien und veröffentlichen:
KVK- & eGK-API (via CTAPI) - CodePlex
Für den zugehörigen Dokumentationsbereich habe ich mir mal einige meiner vielen Textstellen hier aus dem Thread genommen und zusätzlich zu den dort schon verwiesenen Spezifikationen das ganze mit entsprechendem C#-Code untermalt.
die 4 [ist] soweit ich weiß für [...]
Apropos: Such auf deinem System (oder im Web) nach der wiadef.h. Da stehen alle benötigten Werte drin. In deinem Fall z.B.:
#define WIA_DPS_DOCUMENT_HANDLING_SELECT 3088 // 0xc10
#define WIA_DPS_DOCUMENT_HANDLING_SELECT_STR L"Document Handling Select"
Weiter unten dazu dann die zugehörigen Flags:
//
// WIA_DPS_DOCUMENT_HANDLING_SELECT flags
//
#define FEEDER 0x001
#define FLATBED 0x002
#define DUPLEX 0x004
#define FRONT_FIRST 0x008
#define BACK_FIRST 0x010
#define FRONT_ONLY 0x020
#define BACK_ONLY 0x040
#define NEXT_PAGE 0x080
#define PREFEED 0x100
#define AUTO_ADVANCE 0x200
#if (_WIN32_WINNT >= 0x0600)
//
// New WIA_IPS_DOCUMENT_HANDLING_SELECT flag
//
#define ADVANCED_DUPLEX 0x400
#endif //#if (_WIN32_WINNT >= 0x0600)
Wenn man etwas Zeit hat, kann man die Datei sogar (halb)automatisch durchparsen und die Infos aus WIA Application Programming Interface raussuchen lassen, sodass man dann dann am Ende z.B. folgendes rauskommt:
/// <summary>
/// Document Handling Select
/// </summary>
[Flags]
[WiaPropertyId(3088)]
public enum DocumentHandlingSelect /*WIA_DPS_DOCUMENT_HANDLING_SELECT*/
{
/// <summary>Scan by using the document feeder.</summary>
Feeder=0x001,
/// <summary>Scan by using the flatbed.</summary>
Flatbed=0x002,
/// <summary>Scan by using duplexer operations.</summary>
Duplex=0x004,
/// <summary>Scan the front of the document first. This value is valid only when DUPLEX is set.</summary>
FrontFirst=0x008,
/// <summary>Scan the back of the document first. This value is valid only when DUPLEX is set.</summary>
BackFirst=0x010,
/// <summary>Scan the front only.</summary>
FrontOnly=0x020,
/// <summary>Scan the back only. This value is valid only when DUPLEX is set.</summary>
BackOnly=0x040,
/// <summary>Scan the next page of the document.</summary>
NextPage=0x080,
/// <summary>Enable pre-feed mode. Preposition the next document while scanning.</summary>
Prefeed=0x100,
/// <summary>Enable automatic feeding of the next document after a scan.</summary>
AutoAdvance=0x200,
/// <summary>Scan by using individual configuration settings for each child feeder item (WIA_CATEGORY_FEEDER_FRONT and WIA_CATEGORY_FEEDER_BACK). This flag cannot be set together with DUPLEX. A device that supports different scan settings for the front and back items should implement the optional ADF front and back items and it should support both DUPLEX and ADVANCED_DUPLEX.</summary>
AdvancedDuplex=0x400
}
Und man nur noch schreiben muss:
scannerDeviceSettings.DocumentHandlingSelect = DocumentHandlingSelect.Duplex;
scannerDeviceSettings.Pages = 2;
Ja, 4 ist korrekt für Duplex-Scan. Als Source ist auch der Feeder angegeben?
In der WIA-Anwendung, die ich hier habe, wird bei Duplex-Scan die Seitenzahl auf 2 gestellt.
Ansonsten: Wir haben hier auch einen Scanner, der duplex kann und dessen DocumentHandlingCapabilities dies auch angeben, aber bei dem auch besagte Fehlermeldung kommt. Bei diesem Scanner lag/liegt es am Treiber. Nach dem Umstellen auf einen anderen Treiber konnte auch ordentlich ein Duplex-Scan durchgeführt werden.
Ich habe das schon umgesetzt, allerdings ziehe ich mir alle Termine und überprüfe jeden einzelnen auf Anfang- und Enddatum
Wie genau holst du dir denn alle Termine? Denn an dieser Stelle könntest du ja noch einen Filter setzten, der dir nur die Termine des gewünschten Tages raussucht.
Verliere mal bitte noch ein paar Worte über "Arztsoftware".
Eine Versionskontrolle ist nicht zur VS installiert. Gibt es da eine (oder mehrere) Empfehlung(en)?
Naja, kommt ganz auf deine Vorerfahrungen und Vorlieben drauf an. VisualSVN finde ich persönlich sehr gut - integriert sich ordentlich ins VS (in Verbindung mit TortoiseSVN).
Aber da gibt es schon ein paar Beiträge zu hier im Forum.
Gern geschehen. 😃
Aber interessant, dass jemand mal zu viel in LINQ/C# denkt, als in SQL. Das habe ich bisher immer nur andersrum erlebt.