Laden...

Forenbeiträge von Lars83 Ingesamt 38 Beiträge

26.07.2014 - 18:30 Uhr

Hi zusammen.

Ich stehe gerade vor dem Problem, dass ich rauskriegen muss, ob in einer Zelle ein Teil des Textes anders formatiert ist (hoch-/tiefgestellt, fett, etc.). Ich arbeite mit VSTO gegen Excel 2010, greife also mit C# in einem Add-In auf das Workbook zu. Mir ist schleierhaft, wo die Information abgerufen werden kann. Mittlerweile zweifel ich daran, dass es überhaupt geht. Hat irgendwer eine Idee?

Gruß

17.01.2013 - 11:52 Uhr

Hallo.

Für eine spezielle Monitoring-Funktion, welche über Trigger gesteuert werden, muss ich auf System-Views schaun (konkret u.A. sys.dm_exec_connections). Dafür muss der Nutzer aber scheinbar in der sysadmin-Rolle sein. Die will ich logischerweise natürlich nicht jedem geben, der irgendwas in der DB machen soll.

Auf die Views wird nur über Prozeduren zugegriffen, also mein erster Ansatz: Impersonate. Habe also einen neuen Nutzer bzw. Login (sysadmin, wird im Produktivbetrieb die Verbindung zur Instanz von außen verweigert) erstellt und eine Prozedur, die unter diesem Nutzer läuft. Jetzt das Kuriose: melde ich mich mit dem Login an, klappt die Abfrage (einfaches SELECT auf so einen View). Führe ich die Prozedur unter dem normalen Nutzer aus, sagt der mir keine Berechtigung. Laut Ausgabe in der Prozedur läuft die aber unter dem sysadmin-User!

Dieses Vorgehen habe ich schon oft genutzt, nur noch nie bei Systemobjekten. Einfach SELECT-Rechte auf die zu benutzenden Views geben ist ebenfalls schwierig. Das geht nur, wenn man in der Master-DB ist, aber dort gibt’s ja die Nutzer nicht.

Hat jemand eine Idee, wie man das realisieren kann?

16.09.2010 - 12:00 Uhr

Hat keiner eine Idee zu dem Problem? Schade. 😦 Wir haben die ganze Logik mal ins OnLoad gelegt, da erscheint das Fenstericon in der Taskbar. Aber das Geflackere kann man dann auch keinem anbieten.

09.09.2010 - 18:28 Uhr

Prinzipiell nutze ich dieses Vorgehen für meine eingene Layoutengine auf Controls, um das Resize performanter zu machen und das Geflackere zu unterdrücken. Funktioniert auch super soweit bis auf das Taskleistenmanko. Und ich habe jetzt eben mitbekommen, dass scheinbar nicht nur ich das mache, sondern auch Controls-Hersteller, da ich meine Refresh-Sache deaktiviert habe und das Phänomen trotzdem noch auftritt...

09.09.2010 - 16:24 Uhr

Hallo.

Folgendes Problem, häng da schon paar Stunden dran:

Wenn ich eine Form mit folgenden Code ausführe, wird das Fenster danach (zumindest bei Windows Vista/7) nicht sofort in der Taskbar angezeigt. Man muss es erst erneut aktivieren (2x Alt+Tab oder so).

        Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

            Native.User32.SendMessage(Me.Handle, Native.EnumWindowMessages.WM_SETREDRAW, New IntPtr(0), New IntPtr(0))

            Me.MinimumSize = New Size(Me.MinimumSize.Width, 500)
            Me.MaximumSize = New Size(If(Me.MaximumSize.Width > 0, Me.MaximumSize.Width, 19999), 500)

            Native.User32.SendMessage(Me.Handle, Native.EnumWindowMessages.WM_SETREDRAW, New IntPtr(1), New IntPtr(0))

            MyBase.OnLoad(e)
        End Sub

Der Code ist natürlich nur ein abstrahiertes Beispiel. Das Problem ist, das Phänomen tritt auch auf, wenn derartige Sachen auf Controls irgendwo auf dem Form passieren. Scheinbar wird genau dies auch bei von uns eingekauften Steuerelementen gemacht, auf die wir keinen Einfluss haben.

Nun meine Frage:
Bekommt man das Fenster über irgend einen Befehl/WindowMessage in die Taskbar ohne Umweg über das ShowInTaskbar-Property? Damit funktioniert es erstmal, Workaround:

If Not Modal Then
    ShowInTaskbar = False
    ShowInTaskbar = True
End If

Nachteil: durch wieder auf True setzen schließt sich das Formular kurz und erscheint danach erneut. Ok, bisschen mit Opacity rumgespielt (ich weiß, würg ^^) und das Flackern ist weg. Nur hilft das nicht bei modalen Fenstern -> die gehen einfach wieder zu (deshalb das If).

bin echt ratlos, weshalb diese Sache überhaupt auftritt oder wie man das Form besser wieder in die Taskbar zurück bekommt. Hoffe mir kann hier wer helfen.

Danke, Lars.

28.08.2010 - 10:54 Uhr

Hallo.

Tut mir leid, dass ich mich so lange nicht gemeldet habe, war im Urlaub und dann viel Arbeitsstress. ^^

Das Problem hat sich scheinbar von allein gelöst. Wir haben in der Zwischenzeit eine komplett neue Oberfläche eingeführt. Ich nehme an, dass sich bei der alten (über 6 Jahre historisch gewachsenen) Oberfläche einfach ein paar Threads gegenseitig abgeschossen haben, da damals sehr viel aufgrund von Zeitnot in die Oberfläche gelegt wurde. Jetzt haben wir ein komplett neu entwickeltes GUI und teils auch die Mittelschicht - und bisher kein einziges Mal mehr die Meldung. Hoffe das wars wirklich.

Danke für die vielen Hinweise, die werde ich trotzdem alle mal ausprobieren, man kann ja immermal was dazu lernen. 😃

Lars

01.07.2010 - 22:44 Uhr

Interessant, das Statement kannte ich wirklich noch nicht, schau ich mir mal an.

Wie gesagt wir haben auch eine Developer-Edition zum Test im Einsatz, bei der das Problem auch auftritt und die müsste die Priorisierung ja unterstützen. Scheint also nicht am Isolation-Level zu liegen. Wenn du "Standard" schreibst, kann man das wohl auch umstellen auf Rowlocking?

Mit SQL-Tools meinst jetzt nicht das Management-Studio? Ich habe mir über die Systemtabellen bereits eine Abfrage gebastelt, die mir ausgibt, welcher SQL-Benutzer welches Statement >gerade< ausführt wird. Aber wenn der Transaktionsfehler kommt, ist das hängende Statement ja schon gekillt und im Prinzip alles zu spät. Und "dummerweise" tritt das Phänomen ja auch ca. 1-2x am Tag auf und ist auch nicht reproduzierbar - oder ich hab den Zusammenhang einfach noch nicht gefunden.

Hm, involviert in den vermuteten Ablauf, wo der Fehler auftritt, sind etwa 8 Prozeduren, welche wiederum 3 Views und einige Funktionen bedienen. Summa summarum denke ich sind etwa 10-12 Tabellen bei der ganzen Sache betroffen - ist eine relativ große Datenbank mit viel T-SQL und 2 Assembys drin. Entsprechend ists schwierig, alle SQL-Statements hier aufzulisten. 😉
Bei ca. 5-10 Leuten, die gleichzeitig mit dem Programm arbeiten, haben wir etwa 5-15 Transaktionen pro Minute schätze ich. Je nachdem wie oft die Leute eben auf speichern drücken. 😉 Vielleicht sollte ich mich mal mit solchen Profilern auseinander setzen. Ich bräuchte eigentlich nur ein Tool, welches sämtliche Statements der DB-Instanz mitloggt und den jeweiligen usern zuordnet.

01.07.2010 - 20:38 Uhr

Also Editionen haben wir Express und Developer im Einsatz, tritt bei beiden auf. WITH kenn ich in der Tat nicht im Zusammenhang mit Transaktionsüberwachung ... nur bei temporären Tabellen oder Alter user xxx with xxx. 😉 Hast du ein Link zur MSDN? Mehr als http://msdn.microsoft.com/de-de/library/ms175972.aspx habe ich zu dem Wort nicht gefunden.

Transaktionen sind echt kompliziert, hät ich nicht gedacht. ^^

Hm, mehr Details, weiß gar nicht was ich mehr schreiben sollte. grübel Sämtliche speicheroperationen laufen halt über Transaktionen (System.Data.SqlClient.SqlTransaction). Ich vermute, dass irgendwo zwischen dem Schreiben noch gelesen wird, zwischendurch aber dort wiederum vorher von woanders geschrieben wird. Ist ja eigentlich die einzig logische Erklärung. 😉 Aber ich finde eben die Stelle nicht...

01.07.2010 - 14:40 Uhr

Hi.

Ich habe aktuell ein Problem mit Deadlocks in Transaktionen bei einem verteilten System. Das Programm läuft auf mehreren Rechnern, welche Parallel auf eine DB zugreifen. Konkret kommt folgende Meldung:

System.Data.SqlClient.SqlException: Die Transaktion (Prozess-ID 90) befand sich auf Sperre Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus. 

Prinzipiell dauern Transaktionen max. 5 Sekunden und dann ist das schon sehr lange! Auch die Reihenfolge, wie auf Daten zugegriffen wird, ist im Prinzip überall gleich. Wie kriegt man raus, wo der Deadlock passiert? Leider ist das Phänomen viel zu unregelmäßig (1-2x am Tag bei 20 PCs), als dass mans direkt debuggen kann. Ich schreibe schon die SQL-Kommandos mit, aber es tritt immer woanders auf. Außerdem krig ich so ja nicht die Gegenstelle raus, die am Lock beteiligt ist. Der IsolationLevel ist übrigens auf "ReadUncommitted" gesetzt, was die Auftrittswahrscheinlichkeit schon minimiert hat.

Hat vielleicht irgendwer so ein Problem mal gehabt und ein Lösungsansatz?

Lars

14.04.2010 - 11:50 Uhr

Wenn es egal ist, was für Objekte du übergeben kannst, dass kannst du den Typ gleich Object machen. Dazu brauchst du nichts generisches.

Was aber möglich wäre ist die Einschränkung auf einen bestimmten Basistyp oder Interface. Aber zur Laufzeit kannst du den Typ trotzdem nicht ändern. Evtl. kannst du ja ein Interface als Typ nutzen und alle zu übergebenen Objekte müssen dieses Interface implementieren.

14.04.2010 - 11:46 Uhr

Das sieht sehr interessant aus, probier ich mal aus.

Vielen Dank.

13.04.2010 - 18:18 Uhr

Naja damit erstelle ich doch aber einen neuen Thread oder? Ich habe ja schon einen, der läuft bzw. in dem das COM-Objekt initialisiert wurde. In den will ich wieder rein.

13.04.2010 - 17:52 Uhr

Hi.

Gibt es eine Möglichkeit, von einem Thread in einen Anderen zu wechseln, ohne Control.Invoke zu benutzen?

Es geht um ein COM-Interface, über das Daten ausgetaushct werden sollen. Der entsprechende RPC-Server möchte aber immer im Hintergrundthread angesprochen werden. Wenn ich jetzt aus der GUI heraus einen Aufruf starte, bräuchte ich sowas wie Thread.Invoke. 😁

Gibts da irgend eine Möglichkeit?

Gruß, Lars

13.01.2010 - 09:18 Uhr

Hi.

Zum aufklappen klicke auf die Projektmappe und drück die *-Taste auf dem Nummernblock. Zusammen klappen geht so allerdings nicht. 😉
Toll wäre eine Funktion, die alle Tastenkürzel im VS auflistet. Man kann ja ziemlich viel selbst definieren und den Standard ändern. Leider weiß ich auch nicht, wie man so eine benutzerdefinierte Liste raus kriegt...

Lars

12.01.2010 - 17:32 Uhr

Ich glaube ich habe die Antwort grad zufällig gefunden:

Auf allen Rechnern, auf denen im IE die automatische Suche der Proxy-Einstellungen aktiv war (unabhängig von einem eigentlich eingetragenen Proxy) dauerte es fast 30 Sekunden. Nimmt man den Haken raus, gehts fix. Frage ist jetzt nur warum und ob man per Code diese Funktion für das Programm deaktivieren kann. grübel

12.01.2010 - 15:41 Uhr

Hi.

Vielleicht reicht auch ein FileWatcher-Objekt? Damit solltest du die Dateien in Echtzeit kriegen und hast nicht den Aufwand einer Kommunikation zwischen den Programmen.

Lars

12.01.2010 - 12:32 Uhr

Hi.

Ich hab ein Problem, welches scheinbar sehr viele Leute haben, aber ich nirgends eine wirkliche Lösung gefunden habe:

Wenn ich GetRequestStream eines HttpWebRequests aufrufe dauert es auf meinem Rechner beim ersten mal EEEWIG! Auf anderen Rechnern gehts teilweise schneller, teils auch nicht. Ich hab keine Idee, woran das liegen könnte.

Asynchron nützt mir übrigens nichts, da ich das Ergebnis der gesamten Operation brauche, um an der Programmstelle weiterarbeiten zu können...

Vielleicht hat ja jemand einen Tipp, ich horch jetzt erstmal Netzwerkverkehr ab... 😃

Lars

10.01.2010 - 20:48 Uhr

Hi.
Das die ganze LINQ-Sache jetz kein Performance-Schub ist, ist mir klar, aber wies oft so ist - es muss einfach fix funktionieren. Begeistert bin ich da auch nicht von. 😉
Da wir die DB zu Kunden verteilen und dort oft nur den SQL Express zur Verfügung haben (Kosten), kommt der Analysis Server nicht in Frage soweit ich das weiß. Die Links schau ich mir mal an, danke. Zur Zeit laden wir die Pivotspalten nach und basteln die an eine bestehende DataTable dran. Geht eigentlich ganz gut bis zum 5-stelligen Datensatzzahlen-Bereich mehr Daten will bei uns keiner auf einmal sehen, darum klappt das. 😃

10.01.2010 - 18:46 Uhr

@Florian Reischl:
Hab ich auch schon gemerkt, dass das nich so richtig geht. Ich schaue mir grad LinQ to DataSet an, das schaut ganz gut aus, müssen wir halt langsam mal auf .NET 3.5 umsteigen. Hab ich sowieso vor bei uns durch zu drücken, müssen die Kunden halt langsam mal von ihren Win2000-Kisten weg! 😉

Zum Thema "geht nich gibts nicht":
Das ist ja das Problem, es ist keine richtige normalisierte Tabellenstruktur. Wir nutzen sowas wie Pivot-Tabellen, nur dass wir die Pivotfunktion aus bestimmten Gründen selbst umsetzen. Deshalb gibt es viele Spalten der DataTable in der eigentlichen Datenbank schlicht nicht. Ob das jetzt gut oder schlecht ist sei dahin gestellt, kann ich sowieso nicht (so schnell) was dran ändern... Auf dauer werden wir wohl dünn besetzte Tabellen nutzen, nur die 1000-Spalten-Grenze und unser spezielles Berechtigungskonzept macht uns da noch Sorgen. Aber das ist eine ganz andere (ferne) Geschichte.

10.01.2010 - 13:14 Uhr

Nochmal: Das geht nicht! Glaubts mir einfach... Die Datenbank ist dazu viel zu dynamisiert. Ein VIEW krieg ich alleine hin, dazu brauch ich kein Forum. 😉

10.01.2010 - 11:04 Uhr

Wie ich schon gesagt habe, ein einfaches SELECT in der DB geht leider nicht, da die Strukturen der Tabellen in der Art nicht in der DB vorhanden sind! Diese werden auf dem Client erzeugt (frag nicht warum, ist einfach so ^^).

Kannst mir ein gutes LINQ-Tutorial empfehlen, welches diese View-Sache erklärt?

Lars

10.01.2010 - 10:23 Uhr

Hi.

Ich muss eine Datensicht über mehrere Tabellen in einem Dataset erzeugen. Diese Tabellen existieren physisch so nicht in der Datenbank, sodass ich den View auch dort nicht erzeugen kann. Das muss clientseitig geschehen, die Relationen zwischen den Tabellen sind vorhanden. Ich habe keinen Plan wie ich das anstellen soll.
Meine 2 besten Lösungen sind, die Daten in eine lokale Accessdatei zu kopieren und dort den View zu erzeugen oder den LEFT JOIN einfach selbst zu erstellen und per Algorithmus eine neue Tabelle manuell kreiere. Gäbs noch eine andere Variante? Habe mal was von LINQ gehört, dass das sowas könnte, kenne mich dort nur kaum aus, da wir immernoch auf .NET 2.0 angewiesen sind. Für diesen Spezialfall könnte ich es über unseres AddIn-System lösen und ein 3.5-Assembly unterschieben.

Hat wer eine Idee?

Danke.
Lars

11.12.2009 - 19:20 Uhr

@DevHB:
Mit EXISTS sehe ich aber immernoch die Notwendigkeit eines IN-Statements oder? Hatte es mal probiert, aber entweder bin ich zu doof, oder mein Problem scheint komplizierter. ^^

@Florian Reischl:
Der Link ist klasse. Habe gleich mal die Cursor-Variante probiert, naja vielleicht 10-20% schneller. Ist etwas, aber noch nicht die Wcuht. Werde wohl die CLR-Funktion in unser Assembly integrieren, scheint die bessere Variante zu sein. Wenn ichs probiert habe geb ich hier bescheid wies klappt.

Danke für die Antworten.
Lars

11.12.2009 - 18:30 Uhr

Ist schon richtig, aber das Anzeigeformat sollte trotzdem im Frontend eingestellt werden. Wenn die Datenspalte an sich Datumswerte aufnimmt, wirst du keine Chance haben. Außer wie gesagt mit einem Standardwert ... das weiß ich nicht wies in Access ist.

10.12.2009 - 23:14 Uhr

Hallo.

Ich habe ein Performanceproblem: Immer wenn ich in einem Statement einen IN-Ausdruck habe, wird die Abfrage extram langsam.
Beispiel:

SELECT * FROM TABELLE WHERE TABELLE.ID IN (1,2,3,...,20,21,22)

Um so mehr Werte in der IN-Ausdrücken stecken, desto langsamer wird die Abfrage, selbst wenn nur sehr wenig Treffer rauskommen. Gilt ebenfalls für DELETE-Anweisungen, also in allen WHERE-Klauseln. Ich dachte schon es kommt durch ein großes Kreuzprodukt (sind oft mehrere Tabellen beteiligt) und habe den Teil schon bei INNER JOIN ... ON reingenommen - leider keine Wirkung.

Ist das normal? Kann man daran was ändern bzw. gibt es eine Alternative? Die IDs sind leider willkürlich, d.h. BETWEEN oder so klappt hier nicht.

Lars

10.12.2009 - 23:04 Uhr

Es komtm doch auf den Datentyp an. Wenn der auch Datumswerte aufnimmt, steht immer ein Datum drin. Evtl. wird es nur ausgeblendet, wenn es einen bestimmten Wert besitzt. Andernfalls (der Spaltentyp ist nur Zeit) würde kein Datum geschrieben. Komische anforderung finde ich...

08.09.2009 - 13:27 Uhr

Das wäre die logischste Idee, ja, leider nicht machbar:

Der Aufruf der Codezeile erfolgt aus einem View heraus, dort können keine Variablen deklariert werden. Die Tab-Funktion soll kein DB-User direkt aufrufen können. Auch eine normale Tabellenwertfunktion kann keine Variablen nutzen. Nur wenn man eine mit Zwischentabelle deklariert ist dies möglich. Dort allerdings hast du halt den Pflegeaufwand, jede Änderung der Spalten der Tabellenwertfunktion muss auch auch in der jeweiligen 2. Tabellenwertfunktion vorgenommen werden -> viel Wartungsaufwand, genau das möchte ich ja umgehen.
Die Funktion mit Parameter wird intern benötigt, die ohne extern. Der View generiert ja seine Spalten von der zu Grunde liegenden Abfrage selbst, von daher war die die beste Lösung bisher.

08.09.2009 - 11:53 Uhr

verwendetes Datenbanksystem: SQL Server 2005/2008

Hallo.

Ich habe zur Zeit ein mächtiges Performance-Problem:

Wir haben eine Tabellenwertfunktion, welche mehrere Tausend Zeilen Daten ausspuckt. Als Parameter kann ein Zahlenwert übergeben werden. Dieser Wert wird meist durch eine Skalarfunktion berechnet. Also vereinfacht:

SELECT * FROM dbo.TABELLENFUNKTION(dbo.SKALARFUNKTION())

Diese Abfrage braucht eeeeewig! Wenn ich jetzt aber direkt einen Zahlenwert übergebe, ist der Server in einem Bruchteil der Zeit fertig. Jetzt meine Vermutung: Der Parser wertet nicht die Skalarfunktion aus und übergibt das Ergebnis an die Tabellenwertfunktion, sondern pro Zeile in der Tabelle wird die Skalarfunktion neu berechnet!

Ist das normal? Kann man das Verhalten ändern?

Bevor Fragen kommen: An der Struktur kann ich leider nicht viel ändern, das passt schon so im Kontext. Eine Alternative wäre eine 2. Tabellenfunktion, die den Skalarwert auf eine Variable setzt und die 1. Funktion aufruft, das geht genauso fix. Allerdings muss man dann die Tabellenspalten in der 2. Funktion einpflegen. Wir haben mehrere solche Konstellationen -> Wartungsaufwand!

Vielleicht hat ja einer ne Idee.

Lars

Edit: Performancemessung: mit Wert statt Skalarfunktion im Parameter ist der Aufruf ganze 25 Mal schneller!!

14.05.2009 - 18:48 Uhr

Hm, genau das hat mir jemand gesagt kann das SVN ... da muss ich mich wohl nochmal näher damit befassen. TFS ist uns wahrscheinlich zu teuer, wir warten noch auf ein Angebot, war froh dass ich das kostenlose SVN gefunden habe. ^^

14.05.2009 - 17:16 Uhr

Hi.

... und das geht mit unserer versionsverwaltung recht gut. außerdem ist subversion nciht in der lage private branches zu bilden...

2 Fragen:
Was ist ein "privater" Branch?
Und welches Verwaltungstool nutzt ihr? Wir suchen ebenfalls eins, um von SourceSafe 2005 umzusteigen, bin zur Zeit bei SVN hängen geblieben.

04.05.2009 - 17:00 Uhr

Du wirst nicht drum herum kommen, die neuen Daten aus der DB zu lesen, vor allem wenn die DB per Trigger etc. selbstständig Daten verändert. Den autowert bekommst du übrigens mit

SELECT @@IDENTITY

Das funktioniert aber nur bei der Nutzung von Transaktionen zuverlässig, da das Kommando immer die letzte eingefügte ID zurück gibt. Wenn zwischen deinem INSERT und dem SELECT ein anderer ein INSERT gemacht hat, ist deine ID weg.

Lars

30.04.2009 - 10:54 Uhr

Hi.

Hat keiner eine Idee? Würde mich nämlich auch interessieren. Mein jetziger (und einziger) Ansatzpunkt wäre eine WCF-Verbindung zum Dienst. Ist das möglich aus einem DB-Assembly raus? Und vor allem, ist es sinnvoll (Performance etc.)?
SQL-Server ist 2008. Sind zwar noch einige 2005er im Einsatz, die könnte man zur Not aber auf 2008 anheben.

Lars

21.04.2009 - 09:05 Uhr

Danke dir, klingt gut. Kostet zwar was, aber warum das Rad nochmal zu erfinden. 😉

17.04.2009 - 13:08 Uhr

Stimmt statt ListView sollte dann besser das DataGridView verwendet werden. Soll einfach nur eine Liste von Strings angezeigt werden denke ich ist eine ListBox angebrachter. Dann ist das DGV einfach zu ressourcenhungrig. (Wobei ich unter bestimmten Anwendungszwecken sogar beim ListView streiten würde 😉 )

17.04.2009 - 08:50 Uhr

Hast mich erwischt. 😄 Ich progge normalerweise in VB.NET und habe den C#-Syntax mit meinen 4 Jahre zurückliegenden Unikenntnissen zusammen gekratzt. ^^ Schreib einfach override hin und das VS setzt dir den passenden Methodenrumpf darunter...

16.04.2009 - 20:34 Uhr

Da es mir nach dem ListView aussieht, hier mal meine Lösung dazu:

Du definierst eine Datenklasse:


class ListHelper
{
  public string Text;
  public string Daten;

  ListHelper(string pText, string pDaten)
  {
    Text = pText;
    Daten = pDaten;
  }

  public overrides void ToString()
  {
    return Text;
  }
}

Dann kannst du die Datenklasse statt dem String der Listbox hinzufügen:

list.items.add(new ListHelper("Diese Option startet den Weltuntergang", "-optionId-var1-var2"))

Das was die ToString-Methode zurück gibt ist der angezeigte Text der Listbox.
Zugreifen kannst du auf die Optionen dann beispielsweise so:

((ListHelper)list.SelectedItem).Daten

Jetzt steht es dir z.B. frei, auch Interfaces zur Sortierung einzubauen, du bist völlig frei in der Datenanzeige und kannst quasi unendlich viele Daten an die Einträge hängen.

/edit: Natürlich dann nicht wirklich public-Member verwenden, sondern in Eigenschaften kapseln, war jetzt nur zu faul dazu. 😉

16.04.2009 - 20:11 Uhr

Wir haben uns in der Firma auch gewissen Vorgaben geeinigt, die gerade bei größeren und Teamprojekten sehr die Lesbarkeit untereinander fördern. So beginnen alle Member mit "m", Methodenparameter mit "p" usw.
Eine Klasse wird grob gegliedert in Properties, dann die Konstruktoren und dann die Methoden, diese Blöcke jeweils alphabetisch oder funktioniell sortiert, je nach Klassengröße und (subjetivem) Sinn. Dadurch fällt es zumindest unseren Leute viel leichter, fremden Code zu verstehen.

Die 10-Zeilen-Regel finde ich ebenso quatsch. Generell sollte eine Funktion so kompakt wie möglich sein, umd die Übersicht zu wahren und den Ansatz der Objektorientierung sowie Wiederverwendbarkeit zu wahren. Aber auf Teufel komm raus zu splitten macht die Sache womöglich unübersichtlicher als notwendig.

Der Tab-Kommentar lässt mich an die Unizeiten zurück denken, wo jeder mit einer anderen Entwicklungsumgebung gearbeitet hat - vi, emacs, Eclipse, VS, ... 😄 Heutzutage kann jede vernünftige Umgebung einen "Tab" als 2, 4, 8 oder wieviel Leerzeichen auch immer umwandeln und die Einrückungen entsprechend behandeln. Ja, Leerzeichen sind in dem Sinne sinnvoll, allerdings sollte das die Entwicklungsumgebung unterstützen. Kein großes Projekt wird heutzutage noch in einem Texteditor programmiert. ^^

Das wollte ich nur mal loswerden. 😃

16.04.2009 - 19:52 Uhr

Hallo.

Ich habe demnächst die Aufgabe, einen Dienst für einen automatischen Abgleich von Buchungsdaten zwischen einer Software und einem (oder mehreren?) Girokonto (Girokonten) zu schreiben. Dummerweise habe ich noch 0 Plan, wie ich das anstellen soll. Also nochmal konkret: ich muss nachschaun, ob auf dem Konto eine Buchung mit einem bestimmten Verwendungszweck eingegangen ist und der Betrag stimmt. Im Prinzip würde mir also ein Kontoauszug "reichen". ^^

Mir fällt da als Erstes das Schlagwort HBCI ein. Ist die Schnittstelle dafür brauchbar? Gibt es irgendwo eine Anleitung, wie man diese implementieren kann? Eine kostengünstige Bibliothek würde auch in Frage kommen.

Gibt es Alternativen? Dies selbst zu programmieren wäre mir (aus diversen Gründen) lieber als auf Fremdkomponenten zugreifen zu müssen. Bin mir nur nicht sicher, wie einfach/schwer das geht.

Bin über jede Erfahrung dankbar!
Gruß, Lars.