Laden...

Forenbeiträge von Morpheus Ingesamt 104 Beiträge

10.03.2007 - 12:31 Uhr

Original von falangkinjau
was ist dir da nicht gelungen?

Hallo falangkinjau,

das anlegen von Namespace-Summaries ist mir in VS nicht gelungen. Die Erstellung der Doku mit Sandcastle funktioniert.

War wohl etwas ungenau formuliert....

Grüße
Morpheus

09.03.2007 - 15:33 Uhr

Original von gollum9
Hat jemand von euch da eine Lösung?

Hallo gollum9,

bei der Sandcastle-GUI hast Du rechts oben einen Button über den Du die entsprechenden namespace-Dokumentationen vornehmen kannst.

Direkt aus VS heraus ist es mich auch noch nicht gelungen.

Grüße
Morpheus

26.02.2007 - 16:28 Uhr

Hallo flippi,

das mit den Variablen hat ja schon BerndFfm geschrieben.

Die Methode CheckCredentials ist, wie der Name schon sagt eine Methode....

...
if (CheckCredential(str_username, str_Kennwort))
{
  MessageBox.Show("OK");
}
else
{
   MessageBox.Show("Falsches Kennwort oder Benutzername");
}
...

Gruß
Morpheus

26.02.2007 - 16:14 Uhr

Original von flippi
Dann wird der Benutzer Maier gelöscht, aber so weit will ich noch nicht denken. ... (egal ob mit Sicherheitsrisiko oder ohne). Wenns funzt, schau ich am Ende nach der Perfektion...

Hallo flippi,

das von mir genannte Problem löscht Dir nicht den Benutzer "Meier" sondern die gesamte Benutzertabelle! Das hat nichts mit Perfektion zu tun, sondern ist einfach nur fahrlässig.

aber zurück zum Thema:

Das gehashte Passwort befindet sich in der dritten Spalte. Das vom Benutzer eingegebene PW wird dieser Methode übergeben.


public bool CheckCredential(string username, string hashedPassphrase) {
using (DbCommand selectUser = factory.CreateCommand()) {
	selectUser.CommandText = "SELECT * FROM USERDATA WHERE USERNAME=@username";
	selectUser.Connection = connection;
	DbParameter param = selectUser.CreateParameter();
	param.DbType = DbType.String;
	param.ParameterName = "@username";
	param.Value = username;
	selectUser.Parameters.Add(param);
	connection.Open();
	DbDataReader reader = selectUser.ExecuteReader();
	if (reader.HasRows) {
		if (reader.Read()) {
			if (hashedPassphrase == reader.GetString(2)) {
				return true;
			}
		}
	}
	return false;
}

Gruß
Morpheus

26.02.2007 - 15:58 Uhr

Hallo flippi,

cmd.CommandText = "SELECT benutzername AS Benutzername, benutzerpasswort AS Benutzerpasswort FROM benutzer where benutzername = " + this.tbBN.Text +"";

Was passiert eigentlich, wenn ich als Benutzer folgendes (oder schlimmeres) in die tbBN eintrage:

 'Meier'; delete from benutzer;

Wenn Du schon Parameter zuweist, solltest Du diese auch benutzen....

while(reader.Read())....

Zuerst würde ich prüfen, ob überhaupt ein Datensatz gefunden wurde (

reader.HasRows()

Ich hoffe, dass in der Db die Tabelle benutzer einen unique-Constraint auf den benutzernamen hat; wenn nicht kann es passieren. dass Du zwei oder mehr Datensätze zurück bekommst -> welcher Benutzer soll denn angemeldet werden....

Grüße
Morpheus

08.02.2007 - 19:20 Uhr

Hallo,

die DbConcurrencyException hat mich heute fast den ganzen Tag beschäftigt. Zzt. arbeite ich an einer Anwendung, die mit verschiedenen DB-Servern kommunizieren können muss (Firebird, Oracle und MS SQL).

Beim Firebird läuft alles ohne Probleme. Nur die beiden "großen" DB-Server kommen mir mit einer DbConcurrencyException daher, wenn ich einen Datensatz das zweite mal speichern wollte.

Nach mehreren Stunden Suchen, Probieren und Fluchen, habe ich die DBs bei Oracle und SQL Server neu aufgesetzt. Allerdings hatte ich zu spät gemerkt, dass ich dabei ein älteres Script verwendet habe. Die Anwendung habe ich dann trotzdem einmal gestartet - und oh Wunder - keine Parallelitätsverletzung mehr.....

Über dem intensiven Verglich des alten und des neue SQL-Scriptes ist mir aufgefallen, dass einige Spaltennamen im neueren einen "_" (Unterstrich) enthalten, im alten aber nicht. Also: Neues Script geändert, eingespielt......... und es geht........

Kann es sein, dass der DbCommandBuilder keine "Sonderzeichen" in der DB (und dem zugehörigen DataSet) verträgt? Vielleicht kann ja jemand dieses Verhalten erklären.

Gruß
Morpheus

17.12.2006 - 23:58 Uhr

Original von Xqgene... ich suche wirklich eine SQL-Anweisung Für den Anfang:

use northwind;

select Customers.CustomerID, ContactName, CompanyName, Orders.CustomerID, OrderDate
from Customers, Orders
where Customers.CustomerID = Orders.CustomerID
and (Customers.CustomerID = N'ALFKI' or Customers.CustomerID = N'XYZAA')
order by Customers.CustomerID
for xml auto, elements;

Jetzt bleibt nur noch das Speichern.....

17.12.2006 - 21:24 Uhr

Das funktioniert 100%-ig:

ProcessStartInfo startInfo = new ProcessStartInfo(@"c:\temp\tuwas.cmd");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(startInfo);
Process.Start(startInfo);

Inhalt der tuwas.cmd:

xcopy c:\temp\dummy.txt C:\temp\dummy01.txt

Falls das Command-Fenster nicht "angezeigt" wird, könnte das an "Minimized" liegen....

17.12.2006 - 20:18 Uhr

Hallo,

ein kleiner Auszug aus der MSDN:

ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
            
Process.Start(startInfo);
            
startInfo.Arguments = "www.northwindtraders.com";
            
Process.Start(startInfo);

Damit kann man auch die cmd.exe starten....

Gruß
Morpheus

16.12.2006 - 22:36 Uhr

Hallo Boz,

KeyPreview des Forms auf True und dann....

private void Form1_KeyDown(object sender, KeyEventArgs e) {
   if (e.Control && e.KeyCode == Keys.S) {
      MessageBox.Show(this, "Jetzt passiert was...");
   }
}

Gruß
Morpheus

16.12.2006 - 22:18 Uhr

Original von Hias
Gibt es eine Möglichkeit diese Daten obwohl der SerialPort schon geöffnet ist, trotzdem zu empfangen? Ich kann keine Änderungen an dem bestehenden Programm durchführen.

Hallo Hias,

wenn der COM-Port bereits von einem anderen Programm benutzt wird, hast Du keine Möglichkeit an die Daten zu kommen.

Du kannst aber den Spieß umdrehen: Dein Programm schaltet sich auf den COM-Port und empfängt die Daten. Danach sendest Du diese an einen virtuellen Port weiter. Auf diesem lauscht das andere Programm.

Gruß
Morpheus

16.12.2006 - 21:38 Uhr

Hallo Boz,

nachträglich kannst Du den Kopf so ändern:

dataGridView1.Columns[0].HeaderCell.Value = "Erste Spalte";

Gruß
Morpheus

16.12.2006 - 20:17 Uhr

Original von Rainbird
Du brauchst überhaupt keine Zusatzsoftware. Das .NET Framework 2.0 enthält bereits eine vollständige Unterstützung für den Zugriff mit ADO.NET auf Oracle Datenbanken. Schau Dir mal den Namensraum System.Data.OracleClient an.
...
Laut Oracle müssen bei Einsatz von ODP.NET auf der Client-Maschine folgende Anforderungen erfüllt sein:
Windows 2000, Windows XP Professional, Windows Server 2003, or Windows Server 2003 R2

Microsoft .NET Framework 1.0 or higher

Oracle9i Client Release 2 (9.2) or higher

Oracle Net Services (included with the client)

Oracle Services for Microsoft Transaction Server, Release 2 (9.2)

Hallo Rainbird,

die Anforderungen, um den System.Data.OracleClient-Namespace verwenden zu können, sind auch nicht geringer:

The .NET Framework Data Provider for Oracle requires Microsoft Data Access Components (MDAC) version 2.6 or later. MDAC 2.8 SP1 is recommended.

You must also have Oracle 8i Release 3 (8.1.7) Client or later installed.

Oracle Client software prior to version Oracle 9i cannot access UTF16 databases because UTF16 is a new feature in Oracle 9i. To use this feature, you must upgrade your client software to Oracle 9i or later.

Da nehme ich doch gleich die zur DB passende Software. Da gibt es am wenigsten Schwierigkeiten und ich muss nicht befürchten, dass da intern irgendetwas getrickst wurde, nur um kompatibel zu sein.

Außerdem sind die Transaction-Services keinesfalls notwendig - die werden von mir bei der ODP Installation standardmäßig abgewählt - und die Software läuft trotzdem.

Original von Dani_C#
Ich habe nun das auf einem TestClient versucht und musste feststellen, dass ich nicht nur die Oracle*.dll's kopieren muss sondern irgendwas scheint noch zu fehlen...
...
Die ODP.net Installation von 209 MB will ich nicht auf 500 clients installieren.

Auf allen Clients muss der Oracle-Client installiert sein. Ab der Version 10.2.0.1 ist da automatisch die .NET-Unterstützung mit drin. Wir fahren bei uns eine 9i-DB zusammen mit dem 10er Client. Bisher sind keine Probleme aufgetreten (ca. 200 User).

In Deine Projekte musst Du aber die passende DLL einbinden. Ich habe einmal den "Fehler" gemacht, dass ich mit einer neueren Version der Orcale.Data-DLL entwickelt habe, mit dem Ergebnis, dass die Software nicht lief. Hier hast Du zwei Möglichkeiten, entweder die "alte" DLL ins Projekt einbinden oder die neue auf allen betroffen Clients in den GAC verfrachten. Dann klappts auch mit der DB 😉

Bei der Installation Deines Programms musst Du also die Oracle.*.dll nicht einbinden, sondern nur Dein Programm - vorausgesetzt die Clients sind entsprechend versorgt.

Auch muss auf allen Clients der notwendige Eintrag in der tnsnames.ora vorhanden sein.

Gruß
Morpheus

27.08.2006 - 15:37 Uhr

Original von bierstuebl
Warum funktionert der Commit beim Wechsel zu einer Combobox, nicht aber beim Wechsel zu einem Menüpunkt und wie bekomme ich das so hin, dass das Verhalten bei einem Menüpunkt eben gleich ist wie bei der ComboBox.

Hallo bierstuebl,

dieses Problem hat mir auch einiges an Kopfschmerzen bereitet. Mit folgendem Workaround habe ich dies bei mir gelöst:

Wenn auf das Menü bzw. den BindingNavigator geklickt wird, prüfe ich, ob ein anderes Control den Focus hat, verschiebe den Focus ein Control nach vorn und dann setze ich ihn wieder auf das ursprüngliche Control. Dadurch erreiche ich, dass auch das Control, welches aktuell den Focus hat, validiert wird.

Das ist zwar nicht der Weisheit letzter Schluss, aber ich habe mir nicht anders helfen können. Auch eine Internetrecherche hat keine akzeptablere Lösung gebracht. Sind wir eigentlich die Einzigen, die ein solches Problem haben?

private void OnBindingNavigatorClick(object sender, EventArgs e) {
   ChangeFocus();
}

private void OnMainMenuStripClick(object sender, EventArgs e) {
   ChangeFocus();
}

private void ChangeFocus() {
   if (detailsTabControl.ContainsFocus || commonDataGroupBox.ContainsFocus) {
      foreach (Control control in detailsTabControl.Controls) {
         if (control.HasChildren) {
            foreach (Control cntrl in SpecialFormFunctions.GetControls(control)) {
               if (cntrl.Focused) {
                  // Control, das aktuell den Focus hat merken
                  Control focusedControl = cntrl;
                  // Focus auf das nächste Control setzen -> focusedControl wird validiert
                  SelectNextControl(cntrl, true, true, true, true);
                  // Focus zurück auf das ursprüngliche Control setzen.
                  focusedControl.Focus();
               }
            }
         }
      }
   }
}

Evtl. kann ja jemand aus der Community helfen, eine bessere Lösung zu finden.

Gruß
Morpheus

17.08.2006 - 16:18 Uhr

Original von Schimki86
Das Steuerelement wird immer am Punkt 0,0 gezeichnet, auch wenn ich eine Location Hallo Schimki86,

TextBox textbox1 = new Textbox();

textBox1.Location = Point(0, 144);
textBox1.Multiline = true;
textBox1.Name = "textBox1";
textBox1.Size = Size(360, 120);
textBox1.TabIndex = 3;
textBox1.Text = "";

Controls Add(textBox1);

Gruß
Morpheus

[EDIT]Wenn man länger als 10 Minuten zum Antworten braucht ist herbi immer schneller ....[/EDIT]

17.08.2006 - 16:03 Uhr

Original von herbivore
Weiteres Stichwort: MVC.

Hallo herbivore,

in den letzten 1,5 Stunden habe ich das MVC-Pattern einmal überflogen. Ich musste zu meinem Erschrecken feststellen, dass ich das bereits so umgesetzt hatte - ohne den Fachbegriff dafür zu kennen.

Dummerweise habe ich direkt auf die Controls zugreifen wollen, statt die zu Grunde liegende Daten zu verändern. Nun schreibe ich die Daten und den Controls erhalten "ihre" Daten dann aus der DB. Problem ohne Workaround gelöst.

Vielen Dank für den Hinweis.

Gruß
Morpheus

17.08.2006 - 14:36 Uhr

Hallo,
mir leider kein passenderer Betreff eingefallen 🤔

Folgende Konstellation liegt vor:*Haupfenster mit einem TabControl, *verschiedene UserControls auf den einzelnen TabPages, *UserControls via DataBinding an Datenquelle gebunden.

Die Inhalte der einzelnen TabPages haben mitunter Abhängigkeiten untereinander, z.B. wenn auf Page1 ein bestimmte Auswahl getroffen wird, brauchen auf Page3 nicht mehr alle Controls ausgefüllt werden.

Nun zu meinem Problem, das nur beim Starten der Anwendung auftritt: Die UserControls auf den TabPages2+ sind noch nicht geladen und nehmen daher auch keine Befehle an. Erst wenn ich alle TabPages einmal angeklickt habe und die UserControls damit geladen sind, funktioniert das Programm wie gewollt.

Ich habe schon mit CreateControl und CreateHandle experimentiert, aber leider ohne Erfolg. Gibt es einen besseren Weg, als dem Benutzer zu sagen: "Nach dem Start der Anwendung musst Du erst einmal alle Tabs anklicken, damit das Programm so funktioniert wie es soll."?

Gruß
Morpheus

03.08.2006 - 07:03 Uhr

Original von Zocker
Beim zurück Kopieren (schließlich möchte man das Backup wieder zurückkopieren können) gibts Probleme wegen den Zugriffen auf die Datenbank. Gibt es eine Möglichkeit diese Zugriffe zu beenden und dann das kopieren durchführen oder kann ich die Datenbank dann wieder nur zurückschreiben wenn ich die Software beendet hab (wäre aus meiner Sicht ziemlich umständlich).

Hallo zocker,

bei Verwendung des embedded FB gibt es nur einen einzigen Zugriff (Connection) auf die DB, mehr lässt der Kleine nicht zu.

Da Du ja im Programm selbst die Connection öffnest, kannst Du auch dafür sorgen, dass vor dem Einspielen eines Backups die Verbindung zur DB getrennt wird. Damit sollte ein Beenden der Application nicht notwendig sein.

Gruß
Morpheus

01.08.2006 - 15:59 Uhr

Original von Zocker
Da fänd ich es aber an dieser Stelle besser wenn da verschiedene .net Provider bereitgestellt würden. Ist schon ein bisschen verwirrend wenn beim Embedded dann alles da ist aber nicht erkenntlich ist was kann der jetzt wirklich und was kann er nicht.

Hallo zocker,

das Backup für den SuperServer vom Firebird kannst Du ohne Probleme aus Deinem Code heraus anstoßen. Beim kleinen sind die notwendigen Tools schlicht und ergreifend nicht dabei.

Wobei ich persönlich kein Datenbank-Backup aus einer Anwendung heraus anstoßen würde. Solche tiefgreifenden Eingriffe sollte der Server selbst erledigen. Wenn beim Backup was schief läuft kann der Server meist mehr retten als eine externe Anwendung.

Gruß
Morpheus

01.08.2006 - 15:54 Uhr

Hallo Fabian,

vielen Dank für den Tipp.

Und wieder einmal wurde die Kausalität zwischen dem Erkennen des Waldes und dem Sehen von Bäumen empisch nachgewiesen.... 🤔

Gruß
Morpheus

01.08.2006 - 15:49 Uhr

Original von Zocker
Aber ich denke sowas wie ein Backup sollte auch eine embedded Version können. Backup gibts sicher nicht ohne Grund, ansonsten würde man die "großen, richtigen" DB's ja auch einfach nur kopieren.

Das Backup beim kleinen Firebird besteht tatsächlich nur aus einem Kopiervorgang der Datenbankdatei. Beim erwachsenen Firebird ist das GBAK-Tool ja dabei, mit dem man richtige Backups fahren kann.

01.08.2006 - 15:36 Uhr

Hallo,

ich grabe mal diesen Thread aus, weil ich gerade völlig auf dem Schlauch stehe.

Zzt. schreibe ich ein Anwendung, die mit verschiedenen Datenbankservern zusammen arbeiten soll (MySQL, Oracle, Firebird und MS SQL 2005). Deshalb muss ich für diese Server auch die DB-Erstellungsscripts bauen. Für Oracle und Firebird habe ich die Teile fertig.

Für Oracle und Firebird nutze ich BEFORE UPDATE-Trigger um das "Geändert"-Datum des Datensatzes zu schreiben:

Oracle:

CREATE OR REPLACE TRIGGER TRIG_USERDATA_UPDATE
BEFORE UPDATE ON USERDATA FOR EACH ROW
BEGIN
   :new.DATE_CHANGED := SYSDATE;
END;

Firebird:

CREATE TRIGGER TRIG_USERDATA_UPDATE FOR USERDATA
ACTIVE BEFORE UPDATE POSITION 0
as
begin
   new.DATE_CHANGED = 'NOW';
end

Aber beim MS SQL Server 2005 vermisse ich diese Trigger. Nun zum Zitat:

Original von Chäsi
Noch einfacher als bei jedem UPDATE/INSERT Statment Datum & Zeit mit zugeben wäre es einen Trigger auf dem SQL Server zu erstellen. Dieser kann z.B. Datum & Zeit automatisch bei jeder Änderung setzen. Diesem Zitat nach, sollte mein Wunsch auch mit dem SQL Server zu erfüllen sein. Der Trigger sieht monentan so aus (gibt aber Mecker vom Server - inserted kann nicht aktualisiert werden)

CREATE TRIGGER TRIG_USERDATA_UPDATE
ON USERDATA FOR UPDATE
AS
   UPDATE inserted SET DATE_CHANGED = GETDATE();

Wie muss ich den Trigger gestalten, damit ich mein "Geändert"-Datum bekomme?

Gruß
Morpheus

25.07.2006 - 07:37 Uhr

Hallo Starfight,

wie lädst Du die Daten in die AccessDataSource? Via DataAdapter oder manuell? Wenn Du das manuell erledigst, musst Du Dich auch selbst darum kümmern, dass geänderte Daten zurück in die Db geschrieben werden.

Gruß
Morpheus

25.07.2006 - 07:20 Uhr

Original von impact
Die DataTable erzeugt neue Einträge wenn Sie bestimmte Events empfängt. Leider werden eben diese Events in vielen unterschiedlichen Threads gefeuert, die an Stellen erzeugt werden für die kein Code existiert....

Hallo impact,

mit diesen Infos lässt sich das Problem nun erheblich verkleinern. Wenn die DataTable "nur" auf Events reagiert und neue Datensätze erzeugt, dann ist das ja imho erstmal kein Multithreading-Problem, da es egal wer die Events feuert.

Du hast ja diese DataTable als DataSource für ein DataGrid (ziemlich viel Data 😉 ) eingetragen. Hier kannst Du auf die entsprechenden Events der DataTable reagieren (RowChanged, RowDeleted, etc.)

Falls Du allerdings mit "DataTable" eine Tabelle in einer Datenbank meinst, die auch von anderen Programmen geändert werden kann, und Du diese Änderungen in der DB immer aktuell in Deiner Anwendung anzeigen möchtest, kannst Du Dich ja noch einmal melden.

Gruß
Morpheus

24.07.2006 - 15:49 Uhr

Original von impact
Kann ja gut sein das die DataTable in einem anderen Thread geändert wird. Dann knallts....

Der andere Thread wird ja nicht aus dem Nichts erstellt. Dies wirst Du ja hoffentlich selbst machen. Dann kannst/musst Du ja auch für die notwendige Synchronisierung sorgen.

Gruß
Morpheus

24.07.2006 - 15:41 Uhr

Original von 7.e.Q
Der will irgendwie auch immer 'nen Username haben.

Aufgrund von früheren Erfahrungen - meist negativer Art - benutzt man in solchen Fällen entweder "Admin" oder "root" als User.

Gruß
Morpheus

23.07.2006 - 14:27 Uhr

Grundsätzlich stören - im wörtlichen Sinn - mich die Links nicht. Allerdings hatte ich mit dem Auftauchen der Links Bauchschmerzen.

Golo hat natürlich ein Recht sich zu präsentieren. Im entsprechenden Thread sind ja auch ein paar nützliche Vorschläge eingegangen. Zwischen "ganz oder gar nicht" gibt es ja auch noch viele Abstufungen (z.B. eine "Über ..." -Seite)

21.07.2006 - 23:34 Uhr

Lass mal von Deinem Filestreamer das "er" weg und Du hast den entsprechenden Suchbegriff 😉

Wenn Du Aktionen mit größern Dateien durchführst, solltest Du das unbedingt in einem anderen Thread erledigen. Damit bleibt Dein Programm weiter bedienbar, während der Rechner im Hintergrund werkelt.

21.07.2006 - 23:28 Uhr

Die MSDN ist des Entwicklers Liebling

21.07.2006 - 23:20 Uhr

Hallo polofreak,

habe ich das richtig verstanden? Du brauchst Excel nur, um die Daten als *.xls zu speichern. Wenn Du hier einen anderen Weg gehen könntest, sollte das Problem aus der Welt sein:

Erzeuge aus Deinem Programm heraus eine csv-Datei (Separator ist das ; oder TAB). Diese kannst Du in Excel oder vielen anderen halbwegs moderen (nach 1980 entwickelten) Programmen einlesen.

Gruß
Morpheus

21.07.2006 - 23:09 Uhr

Hallo nic4x4,

Original von nic4x4
Danke für jede Antwort.

Der Ansatz ist schon mal ganz gut. Jetzt musst Du nur noch in die Doku schauen. Vllt. noch ein kleiner Hinweis: Seek, Read, Position

Gruß
Morpheus

21.07.2006 - 23:01 Uhr

Halo Martakus,

Original von Martakus
Sie brauch nicht Netzwerkfähig sein. Obowhl ich mir da noch nicht sicher bin...

Eine Lösung, die sowohl im Netz als auch Lokal funktioniert, ist eine Benutzerverwaltung über eine Datenbank.

Zzt. arbeite ich an genau so einem Problem. Ein Anwendung soll auf Notebooks laufen, aber auch auf Clients, die im Netz hängen. Wenn dann ein Notebook ins Netz gehängt wird, soll eine Datensynchronistation laufen.

Mein Lösungsansatz:*Identische Datenbanken für lokale User und DB-Server *Drei Tabellen (Users, Roles, UserRoles) *Login-Anwendung *Erzeugung eines GenericPrincipal *Zuweisen des Prinzen an den Thread

Ab hier gehts dann mit den Standards der Rolebased Security weiter.

Gruß
Morpheus

21.07.2006 - 22:51 Uhr

Hallo Golo,

das neue, helle Design finde ich sehr gut. Sieht modern aus, lässt sich leicht lesen. Wenn Du nicht wieder Blau machst 😉 , passt das so.

Gruß
Morpheus

21.07.2006 - 22:45 Uhr

Hallo sharp.new,

Steuerusercontrol ?( , Trägerusercontrol ?( , Komponentenklasse ?(

Vielleicht kannst Du ja die "gängigen Fachbegriffe" verwenden. Ansonsten verstehe ich nur Bahnhof. Evtl. kannst Du ja ein kleines Projekt anfügen, in dem diese Problematik auftritt.

Gruß Morpheus

21.07.2006 - 22:42 Uhr

Hallo webstarg,

verändern ja, deaktivieren im angedachten Sinn nicht.

Du kannst die nicht benötigten Einträge entweder löschen oder programmatisch abfragen, ob der User einen "deaktivierten" Eintrag angeklickt hat und die entsprechende Auswahl unterbinden.

Gruß
Morpheus

21.07.2006 - 22:38 Uhr

Hallo MEt45,

als schnelle, aber vllt. nicht beste Lösung:

Datei zeilenweise einlesen, wenn das Signalwort "class" auftaucht einen neuen Streamreader o.ä. erzeugen, solange lesen bis das Signalwort "class_end" erkannt wird, das Zeug wegspeichern und die Schleife von vorn beginnen.

Gruß
Morpheus

21.07.2006 - 22:30 Uhr

Hallo northdrive,

wie so oft, hilft hier ein Blick in die Doku:

public virtual string Filter { get; set; }
...
// Filter the items to show contacts who are owners.
BindingSource1.Filter = "ContactTitle='Owner'";

Dementsprechend muss Dein Filter so aussehen:

wkzbindingsource.Filter = "wkz_wert1 ='" + comboBox1.Text + "'";

Gruß
Morpheus

17.07.2006 - 16:53 Uhr

Hallo,

für den "kleinen Verschlüsselungshunger" zwischendurch habe ich mir folgenden provider gebastelt.

using System;
using System.Security.Cryptography;
using System.IO;
using System.Xml.Serialization;

namespace CryptoTools
{
	#region Zusammenfassung für CryptoProviderDES
	/// <summary>
	/// Zusammenfassung für CryptoProviderDES hier eintragen.
	/// </summary>
	#endregion
	public class CryptoProviderDES
	{
		/* Stellt die Basisklasse für TripleDES-Algorithmen (Triple Data Encryption Standard)
		 * dar, von der alle TripleDES-Implementirungen abgeleitet werden müssen.
		 * TripleDES verwendet drei aufeinander folgende Iterationen des DES-Algorithmus.
		 * Es können entweder zwei oder drei 56-Bit-Schlüssel verwendet werden. */
		private TripleDES cryptoManager;
		
		/// <summary>
		/// Konstruktor der CryptoProviderDES-Klasse: Hier wird ein TripleDES-Objekt erzeugt.
		/// </summary>
		public CryptoProviderDES(){
			cryptoManager = TripleDES.Create();
		}
		
		/// <summary>
		/// Ruft den Initialisierungsvektor (IV) für den symmetrischen Algorithmus ab oder
		/// legt diesen fest.
		/// </summary>
		public byte[] IV{
			get{return cryptoManager.IV;}
			set{cryptoManager.IV = value;}
		}
		
		/// <summary>
		/// Ruft den geheimen Schlüssel für den symmetrischen Algorithmus ab oder legt
		/// diesen fest. Der geheime Schlüssel wird sowohl zur Verschlüsselung als auch
		/// zur Entschlüsselung verwendet. Damit ein symmetrischer Algorithmus sicher ist,
		/// darf der geheime Schlüssel nur dem Sender und dem Empfänger bekannt sein.
		/// </summary>
		public byte[] Key{
			get{return cryptoManager.Key;}
			set{cryptoManager.Key = value;}
		}
		
		/// <summary>
		/// Sichert aktuelle Schlüsseldaten in einer XML-Datei.
		/// </summary>
		/// <param name="path"></param>
		public void ToXMLFile(string path){
			/* Eine Instanz wird in einer using-Anweisung erstellt, um sicherzustellen, dass beim
			 * Verlassen der using-Anweisung Dispose zum Objekt aufgerufen wird. Eine
			 * using-Anweisung kann verlassen werden, wenn entweder das Ende der using-Anweisung
			 * erreicht wird oder wenn z. B. eine Ausnahme ausgelöst wird und dem Anweisungsblock
			 * die Steuerung vor dem Ende der Anweisung entzogen wird. */
			using(FileStream Fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite)){
				/* Die XML-Serialisierung ist die Konvertierung der öffentlichen Eigenschaften
				 * und Felder eines Objekts in ein serielles Format (in diesem Fall XML) zum
				 * Zweck der Speicherung und Übermittlung. Die Deserialisierung erstellt das
				 * Objekt aus der XML-Ausgabe in seinem ursprünglichen Zustand erneut. Die
				 * Serialisierung kann daher als eine Möglichkeit zum Speichern des Zustands
				 * eines Objekts in einen Stream oder Puffer aufgefasst werden. */
				XmlSerializer Xs = new XmlSerializer(typeof(CryptoProviderDES));
				Xs.Serialize(Fs, this);
			}
		}
		
		/// <summary>
		/// liest gültige Schlüsseldaten aus einer XML-Datei.
		/// </summary>
		/// <param name="path"></param>
		public void FromXMLFile(string path){
			// Deserialisierung des Key-files
			using(FileStream Fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)){
				XmlSerializer Xs = new XmlSerializer(typeof(CryptoProviderDES));
				/* Der as-Operator ähnelt einer Typumwandlung, ergibt jedoch bei einem
				 * Konvertierungsfehler Null und löst keine Ausnahme aus. */
				CryptoProviderDES temp = Xs.Deserialize(Fs) as CryptoProviderDES;
				if(temp != null){
					this.IV = temp.IV;
					this.Key = temp.Key;
				} else {
					throw new InvalidCastException("CryptoProviderDES.FromXMLFile: Konnte nicht auf CryptoProviderDES casten!");
				}
			}
		}
		
		/// <summary>
		/// Verschlüsselt ein Byte-Array mit aktuellen Key und Initialisierungsvektor (IV)
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public byte[] EncryptData(byte[] source){
			// schreibt die vershlüsselten Daten in einen MemoryStream in den Hauptspeicher
			MemoryStream Ms = new MemoryStream();

			// Verschlüsselungsalgorithmus anfordern
			ICryptoTransform transform = cryptoManager.CreateEncryptor(Key, IV);
				
			/* Stream basierend auf dem Verschlüsselungsalgorithmus
			 * --------
			 * CryptoStream definiert einen Stream, der Datenstreams mit kryptographischen
			 * Transformationen verbindet.
			 * Die Common Language Runtime verwendet einen streamorientierten Kryptographieentwurf.
			 * Der Kern dieses Entwurfs ist CryptoStream. Alle kryptographischen Objekte, die
			 * CryptoStream implementieren, können mit allen Objekten verkettet werden, die Stream
			 * implementieren, so dass der Ausgabestream eines Objekts als Eingabestream für ein
			 * anderes Objekt verwendet werden kann. Das Zwischenergebnis (die Ausgabe des ersten
			 * Objekts) muss nicht getrennt gespeichert werden. */
			CryptoStream Cs = new CryptoStream(Ms, transform, CryptoStreamMode.Write);
			
			Cs.Write(source, 0, source.Length);
			Cs.Close();
			
			// Kein result.GetBuffer, da bei GetBuffer nicht benutzte Bytes im Array mit '\0'
			// aufgefüllt werden.
			return Ms.ToArray();
		}
		
		/// <summary>
		/// Entschlüsselt ein Byte-Array mit aktuellen Key und Initialisierungsvektor (IV)
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public byte[] DecryptData(byte[] source){
			// liest die verschlüsselten Daten aus einem MemmoryStream im Hauptspeicher
			MemoryStream Ms = new MemoryStream(source, 0, source.Length);

			// Verschlüsselungsalgorithmus anfordern
			ICryptoTransform transform = cryptoManager.CreateDecryptor(Key, IV);

			// Stream basierend auf dem Verschlüsselungsalgorithmus
			CryptoStream Cs = new CryptoStream(Ms, transform, CryptoStreamMode.Read);
			
			// Blockweise aus dem MemoryStream, der die entschlüsselten Daten enthält, lesen
			// und in einen Result-MemoryStream scheiben
			byte[] buffer = new byte[512];
			int count = 0;
			// int total = 0;

			MemoryStream result = new MemoryStream();
			while((count = Cs.Read(buffer, 0, buffer.Length)) > 0){
				result.Write(buffer, 0, count);
				// total += total;
			}
			
			// Kein result.GetBuffer, da bei GetBuffer nicht benutzte Bytes im Array mit '\0'
			// aufgefüllt werden
			return result.ToArray();
		}

		/// <summary>
		/// Verschlüsselt einen String und liefert eine Base64-String zurück
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public string EncryptToBase64String(string source){
			// Variante 1 zur Umwandlung von Strings in ByteArrays
			byte[] buffer = System.Text.Encoding.UTF8.GetBytes(source);

			// Variante 2:
			// byte[] buffer = Convert.FromBase64String(source);

			// Verschlüsselung selbt...
			byte[] secret = EncryptData(buffer);

			// Convert: Konvertiert einen Basisdatentyp in einen anderen Basisdatentyp.
			return Convert.ToBase64String(secret);
		}

		/// <summary>
		/// Entschlüsselt einen Base64-String und liefert einen Stream zurück
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public Stream DecryptFromBase64Stream(string source){
			byte[] secret = Convert.FromBase64String(source);
			byte[] buffer = DecryptData(secret);
			return new MemoryStream(buffer);
		}
		
		/// <summary>
		/// Entschlüsselt einen Base64-String und liefert einen UTF-8-String zurück
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public string DecryptFromBase64String(string source){
			byte[] secret = Convert.FromBase64String(source);
			byte[] buffer = DecryptData(secret);
			return System.Text.Encoding.UTF8.GetString(buffer);
		}
	}
}

Was sagen die Gurus dazu?

Gruß
Morpheus

15.07.2006 - 17:47 Uhr

Die neue Farbgebung ist gewöhnungsbedürftig. Aber für die Fälle, bei denen ich ganz und gar nicht mit der Gestaltung einer Webseite leben kann, habe ich Greasemonkey für mein Fireföxchen 😁

15.07.2006 - 17:42 Uhr

Hallo backdoor,

das Buch gibt es wirklich (siehe bei Amazon).

Meine vorherige Nachricht war eine Buchempfehlung und keine Beleidigung.

Gruß
Morpheus

15.07.2006 - 17:35 Uhr

Original von Zocker
...Wobei ich noch einmal darauf hinweisen möchte ... Hallo Zocker,

bist Du jetzt unter die Politiker gegangen? 8o

Damit sollte Dein Problem gelöst sein:

/// <summary>
		/// Diese Methode prüft auf ein vorhandenes Komma in den Messwerten und ersetzt es durch einen
		/// Punkt. Hiermit wird die berühmt berüchtigte Komma-Punkt-Falsche-Zahl-Ermittlungs-Problematik
		/// umgangen. Die "Punktzahlen" lassen sich durch die InvariantCulture problemlos in Double-Werte
		/// umwandeln.
		/// </summary>
		/// <param name="input">String, aus dem ein Zahlenwert werden soll.</param>
		/// <param name="factor">Umrechnungsfaktor.</param>
		/// <returns>Die Zahl.</returns>
		public static double CheckDouble(string input, double factor) {
			if (!String.IsNullOrEmpty(input)) {
				double myDouble = 0D;
				string dummy = input.Replace(',', '.');
				try {
					myDouble = double.Parse(dummy, NumberStyles.Float, CultureInfo.InvariantCulture);
				} catch (FormatException) {
					throw;
				}
				return myDouble * factor;
			} else {
				throw new ArgumentOutOfRangeException(String.Format(CultureInfo.CurrentUICulture, CommonDataResources.StringIsNullOrEmpty, input));
			}
		}

Eine Ersetzung, die auf meine Bedingungen zugeschnitten ist, must Du noch vornehmen. Ich verrate aber nicht welche 😉

Gruß
Morpheus

15.07.2006 - 09:28 Uhr

Original von backdoor
wie kann ich per knopfdruck auf "OK", aus einer textbox die eingegebenen zeichen auslesen und in eine listview eintragen lassen?

Hallo backdoor,

ich hoffe ernsthaft, dass diese Frage rein rhetorische Natur ist. Denn ansonsten kann ich Dir nur den Tipp geben: Kauf Dir das Buch "C# für Dummies".

Gruß
Morpheus

14.07.2006 - 22:32 Uhr

Original von Quest
ich kann also nicht davon ausgehen dass ich 2.5 speichere und dann auch 2.5 rausbekomme?

Hallo Quest;

bei der Float-Genauigkeit (7 Stellen im Wertebereich ±1.5 × 1045 bis ±3,4 × 1038 ) kannst Du sicherlich nicht davon ausgehen. Wenn Du nur eine wesentlich geringere Genauigkeit benötigst und sicher sein willst, dass 2.5 == 2.5, verwende einen anderen Typen.

Gruß
Morpheus

14.07.2006 - 22:26 Uhr

Hallo Zocker,

anbei ein Beispiel, mit dem Du sowohl Decimal- als auch Double-Werte in eine Firebird-DB schreiben kannst.

Wenn die Datenbank entsprechend konfiguriert ist, dann schluckt sie eigentlich alles, was sie bekommt.

Gruß
Morpheus

14.07.2006 - 14:30 Uhr

Hallo doc,

automatisch speichert der BindingNavigator nicht. Das musst Du selbst erledigen (TableAdapter.Update()).

Wenn Du hier neue Datensätze hinzufügst, stehen die erst einmal nur im RAM. Beim Verlassen der Form werden die Daten zur GC freigegeben - wenn Du nicht selbst für die Persistierung sorgst.

Gruß
Morpheus

13.07.2006 - 18:47 Uhr

Hallo Lord Hessia,

eine Minute suchen hat mir 141 Treffer zum Thema eingebracht. gugstduhier

Gruß
Morpheus

13.07.2006 - 18:12 Uhr

Wie war das doch gleich? 95 % aller Computerfehler sitzen vor dem Rechner 😁

13.07.2006 - 18:08 Uhr

Original von impact
Wie verhalten sich ListViewItems bei Dir ? Gibts da das gleiche Problem ? Ich bin noch nie in die Verlegenheit gekommen, so ewig lange Texte in eine ListView schreiben zu müssen.

Auf alle Fälle habe ich es getestet und bei mir werden ebenfalls "nur" 259 Zeichen in einer Spalte angezeigt. Anbei mal ein kleines Beispiel, wie ich so etwas lösen würde. Den Grundsatz habe ich oben schon beschrieben.

Gruß
Morpheus

13.07.2006 - 16:47 Uhr

Hallo impact,

Original von impact
Mein Chef reist mir den Kopf ab...... 8o

Dann suche Dir schon einmal einen guten Chirugen, der Dir den Kopf wieder annähen kann 😉

Im Ernst: Ich denke, dass eine Spalte in einer ListView nicht viel mehr als die genannten 259 Zeichen anzeigen kann. Eventuell kannst Du das Problem ja so lösen: Fange die Klicks ab, erzeuge eine kleines Fenster mit einer RichTextBox und fülle dahin Deinen Text zum Editieren.

Gruß
Morpheus

13.07.2006 - 16:13 Uhr

Hallo bintec,

aus

selbstgeschriebenen SELECTS resultieren auch selbstgeschriebene Update-Commands. 😉

Gruß
Morpheus