Laden...

Forenbeiträge von uwen2 Ingesamt 44 Beiträge

19.12.2007 - 22:19 Uhr

Hallo hervivore,

ja, ich möchte nicht nur einmal undo/redo realisieren, sondern mehrere Male, also eine Historie erstellen, wenn ich Dich darin richtig verstanden habe.

Alle Tabellen deshalb zu spiegeln (nur mit Einträgen für die Historie), hmm, muß ich erstmal drüber nachdenken. Ist sicher auch aufwendig mit dem Rückschreiben in die Haupttabelle.

Danke jedenfalls für den Tip.

An Dich und an alle hier
erstmal frohe Weihnacht und ein erfolgreiches Jahr 2008

Uwe

18.12.2007 - 21:35 Uhr

Sorry,

beim Abschicken ist mir gerade eingefallen, daß ich ja alle Datenbanktransaktionen rollierend protokollieren muß.

Ich probiere am besten ertmal an einem einfachen Beispiel.
Hinweise trotzdem willkommen.

Uwe

18.12.2007 - 21:31 Uhr

Hallo,

ich habe mir folgenden Link durchgelesen:
Multilevel-Undo/-Redo mit dem Command-Muster
herbivore, Hochachtung auch dazu, wie Du die Hilfe dazu aufgebaut hast.

Aber zum Thema: Ich habe folgende Idee und würde gern Eure Meinung dazu hören:

Da ich jede abgeschlossene Benutzeraktion grundsätzlich in der Datenbank abspeichere würde ich gern Undo/Redo vereinfacht dadurch realisieren, daß ich an jede Tabelle noch 1 Spalte "UndoRedoStatus" dranhänge.

Beim Starten gibt es nur Zeilen mit 0 in der Statusspalte. Bei z.B. 9 Mal zurück und wieder vor würden neue Einträge angehängt bzw. aktualisiert, die in der Statusspalte Einträge von 0 bis -9 einnehmen können.

Im normalen Programmablauf wird dann grundsätzlich mit den üblichen Selektionskriterien AND UndoRedoStatus = 0 selektiert. Bei Drücken der Button Vor/Zurück wird ein AblaufStatus auf einen Wert 0 bis -9 gesetzt und in der Datenbank nach Selektionskriterien AND AblaufStatus selektiert.

Beim Abspeichern werden alle Zeilen mit UndoRedoStatus <> 0 gelöscht.

Ist das ein gangbarer Weg?

Gruß
Uwe

08.12.2007 - 19:27 Uhr

Hallo CyberAnt,

ich habe versucht, überhaupt erstmal den Help-Button testweise in eines meiner Fenster zu bekommen. Trotz Eigenschaft HelpButton = True, erscheint kein Button.

Beim Googeln bin ich auf folgenden interessanten Link gestoßen und habe ihn gleich in die Favoriten genommen (für später), weil das Tutorial wirklich gut gemacht ist:

http://www.functionx.com/vcsharp2003/topics/onlinehelp.htm

Noch was allgemeines zur Hilfe. Da sowieso keiner mehr die Hilfe liest, stelle ich mir vor, in meiner Anwendung kurze Filme ablaufen zu lassen. Hat jemand Erfahrung damit? Was gibt es zu beachten? Hat VS2005 eine Arte Filmkamera eingebaut um die Transaktionen aufzuzeichnen?

Nichts für ungut
Uwe

08.12.2007 - 19:00 Uhr

Hallo FZelle,

ich denke ich werde Deinen Rat beherzigen.

Gruß
Uwe

08.12.2007 - 16:46 Uhr

Ich glaube ich habe es jetzt.

Ich mußte erst meine Denkrichtung ändern, von Fom2 Richtung Form1 auf Form1 Richtung Form2. Ich ändere jetzt die Form2-Eigenschaften von Form1 aus und versuche nicht mehr von Form2 aus auf Form1-Methoden zuzugreifen.

Es funktioniert sogar, in Form1 auf die Ereignisse aus Form2 zu reagieren. Toll.

Code in Form1:

            Form2.myDataGridView.CellMouseUp += new DataGridViewCellMouseEventHandler(myDataGridView_CellMouseUp);
Form2.ShowDialog();

Gruß
Uwe

07.12.2007 - 23:32 Uhr

Hallo Rocket,

gib mal ein Beispiel (notfalls verallgemeinert), was Du konkret machen möchtest.
Ich poste dann Code oder Tips, wenn ich was passendes habe.

Gruß
Uwe

07.12.2007 - 22:52 Uhr

Hallo herbivore,

ich habe meinen Code nach Deinen Anregungen etwas umgestellt.

Um auf eine öffentöiche Methode einer Klasse zugreifen zu können, brauche ich das Objekt der Klasse (wenn sie oder die Methode nicht abstract sind)

Wenn ich also in einem zweiten Fenster auf Methoden des ersten Fensters zugreifen möchte, bräuchte ich das erste Fenster als Objekt. Das erste Fenster ist schon offen wenn ich das zweite öffne, aber ich habe innerhalb des zweiten Fensters keinen Zugriff darauf. Warum sehe ich das erste Fenster nicht in der zweiten Kasse, obwohl es public ist und als Objekt existiert?

Ich habe mir damit geholfen, daß ich die öffentliche Methode, die im ersten Fenster definiert ist und auf die ich vom zweiten Fenster zugreifen möchte, noch als "static" deklariert habe.

Das funktioniert, aber ist es der richtige Weg?
Oder, wie komme ich an das Objekt des schon offenen Fensters ran?

Gruß
Uwe

07.12.2007 - 22:34 Uhr

Hallo FZelle,

ich benutze in meiner derzeitigen Anwendung DataGridViews (DGV) vorrangig dazu um Daten grafisch in Tabellenform darzustellen. Die Alternative dazu ware wesentlich aufwendiger, nämlich alles selbst in ein Panel zu zeichnen.

Selbstverständlich ist eine DataTable dahinter, da aber meine DGVs ähnlich wie eine Pivottabelle in Excel userabhängig zig Darstellungsvarianten annehmen können, kann ich kein DataBinding nutzen. So lese ich die DataTable und generiere den DGV dynamisch in Abhängigkeit von der Benutzerauswahl.

Noch ein Wort zu dem Dogma, daß Darstellung und Datenhaltung getrennt sein sollten. Leuchtet mir prinzipiell ein. Allerdings finde ich bei weiterem Nachdenken nichts dabei, Werte auf Controls (Tags) zu speichern, da es dem Arbeitsspeicher eigentlich egal sein müßte, ob er Werte in einer internen Tabele oder auf Controls speichert. Stürzt die Anwendung ab, ist in beiden Fällen alles verloren.

Gruß
Uwe

07.12.2007 - 00:49 Uhr

Nur so' ne Idee:

Variante 1
Bei Picturebox voreingestellte Images im Speicher vorhalten und über Timer wechselseitig zuweisen, bei Button Imagelist erstellen und über Timer den Zugriffsindex auf Imagelist ändern. Im einfachsten Fall also rotes und weißes Rechteck abwechselnd als Bild. Das macht aber keinen Spaß, deshalb ...

Variante 2 (ggf. weniger performant, aber sehr ausbaufähig)
Zur Laufzeit in Abhängigkeit vom Benutzerverhalten Image erstellen und Picturebox zuweisen.
Google mal nach ColorMatrix. Mit den Matrizen läßt sich so ziemlich alles machen.
Matrix33 ist z.B. für Durchsichtigkeit verantwortlich.

Beispiel für eine 80/20-durchsichtiges Image beim Verschieben in einem TreeView:

            Bitmap bmp1 = new Bitmap(imageListBaum.Images[QuellNode.Name]);
            ImageAttributes ia1 = new ImageAttributes();
            ColorMatrix cm1 = new ColorMatrix();
            cm1.Matrix33 = 0.8f;
            ia1.SetColorMatrix(cm1);

Wahrscheinlich brauchst Du aber auch einen Thread für die gleichzeitige Ausführung. Ich hatte doch mal irgendwann einen thread gemacht ... Hier ein Beispiel, noch aus VS2002:

namespace WindowsApplication1
{
	public class Form1 : Form
	{
		public Form1()
		{
		}
		[STAThread]
		static void Main() 
		{
		         Application.Run(new Form1());
		}
	}
	public class PanCla : Panel
	{
		Thread th = new Thread(new ThreadStart(Malen));
		th.Start();
	}
	public void Malen()
	{
	     while(true)
		{
			try{Thread.Sleep(0);}
			catch(ThreadAbortException e){}
		}
	}	

}

Gruß
Uwe

06.12.2007 - 22:55 Uhr

Man wird ja bescheiden mit der Zeit 🙂
Hat denn keiner eine Antwort auf Frage 3?

Ich benötige das wirklich, da ich in der Ausgangsklasse alle Methoden nutzen muß, um den klitzekleinen DGV-Ausschnitt zu generiern, den ich dann an das andere Fenster übergeben möchte.

Ich habe bereits probiert, in der Ausgangsklasse die benötigten Methoden öffentlich zu machen. Aber da die Masse der Mehtoden verschachtelt sind und auch viele Steuerelemente eingebunden sind, verlangt der Compliler immer mehr zu veröffentlichen, so daß ich im Endeffekt 90% der Methoden und Steuerelemnte öffentlich machen müßte. Das kann es doch nicht sein.

Gibt es in C# eine explizite Kennzeichung der Übergabeparameter, die sagt "Clone das Objekt und übergib es"?

Gruß
Uwe

06.12.2007 - 00:37 Uhr

Sorry, nicht [ ][ ] sondern [ , ]
Gruß Uwe

05.12.2007 - 22:46 Uhr

Noch ein Tip:

Du kannst die Zellen auch direkt über z.B. MyDataGridView [spalte][zeile] aufrufen, ohne erst über die Zeile zu gehen.
Wichtig: Falls Du VBA(Excel) gewohnt bist, in C# zuerst die Spalte, dann die Zeile, in Excel andersherum.

Gruß
Uwe

05.12.2007 - 22:23 Uhr

Hallo daniel94ever,

ich mache es so, vielleicht kannst Du es gebrauchen

        private void Löschen(object sender, EventArgs e)
        {
            
            // TODO Prüfung auf Bewegungsdaten
                        
            TreeNode rtn = treeViewStammdaten.SelectedNode;
            RekursivLöschen(rtn);
            int ibaum = dbPasadenaDataSet.Bäume.Rows.IndexOf(dbPasadenaDataSet.Bäume.Rows.Find(rtn.Name));
            dbPasadenaDataSet.Bäume.Rows[ibaum].Delete();
            bäumeTableAdapter.Update(dbPasadenaDataSet.Bäume);
            rtn.Remove();
            treeViewStammdaten.Refresh();
        }


        private void RekursivLöschen(TreeNode rtn)
        {
            foreach (TreeNode n in rtn.Nodes)
            {
                RekursivLöschen(n);
                this.bäumeTableAdapter.Update(dbPasadenaDataSet.Bäume);
                int ibaum = dbPasadenaDataSet.Bäume.Rows.IndexOf(dbPasadenaDataSet.Bäume.Rows.Find(n.Name));
                dbPasadenaDataSet.Bäume.Rows[ibaum].Delete();
                this.bäumeTableAdapter.Update(dbPasadenaDataSet.Bäume);
                treeViewStammdaten.Refresh();
            }
        }

Stammt noch aus der Anfängerzeit und funktioniert. Kommentare und Verbesserungen von Profis wilkommen.

Gruß
Uwe

05.12.2007 - 21:58 Uhr

Hallo herbivore

Danke für Deine Antwort, die Links hatte ich schon gelesen, aber nicht vollständig begriffen.

Bedeutet 4b), daß ich eine abstrakte Klasse definieren soll, in der alle Methoden definiert sind und ich bei jedem Aufruf eine Unmenge an Referenzen hin- und her schaufeln muß?

Hat jemand für 4a) ein konkretes Negativbeispiel?

Wenn ich trotzdem bie 3) bleiben möchte, wie wird es gemacht?

Gruß
Uwe

05.12.2007 - 21:24 Uhr

Hallo Andy1988,

vielleicht hilft Dir das hier. Der Code ist dafür da, alle gleichartigen Fenster auf dem selben Stand zu halten, d.h. verändert sich in einem etwas, werden alle anderen aktualisiert:

                foreach (Form f in MdiParent.MdiChildren)
                {
                    if (f.GetType() == typeof(Eingabefenster) & f != this)
                    {
                        Eingabefenster ef = (Eingabefenster)f;
                        ef.AllesNeuZeichnen1();
                        ef.AllesNeuZeichnen2();
                    }
                }

AllesNeuZeichnen ist als internal deklariert. Dahinter stecken Datenbankabfragen, Formatierungen u.ä.

MfG Uwe

05.12.2007 - 21:13 Uhr

Hallo,

ich habe zwei Fenster.

In einem Ausgangsfenster einen DataGridView (Quell-DGV), der keine Datenbindung und keine Zeilen- und Spaltenköpfe hat, nur eingefärbte Zellen und Einträge.

Ich baue mir daraus im Ausgangsfenster einen weiteren DGV (Übergabe-DGV) als Untermenge zusammen, der in dem Zielfenster (als Ziel-DGV) weiterbearbeitet werden soll.

Ein Test, der erstmal das Quell-DGV übergeben sollte, ergab, daß ich

  • im Zielfenster nichts gesehen habe (Anweisung: Ziel-DGV = Übergabe-DGV)
  • anscheinend nur die Referenz auf den Quell-DGV übergeben wurde, da sich
    Änderungen im Zielfenster-DGV auf den Quell-DGV auswirkten

Fragen:

  1. Warum wird hier die Referenz übergeben und nicht das Objekt selbst, wenn ich bei Methoden explizit mit „ref“ angeben muß, damit nur die Referenz übergeben werden soll?
  2. Warum hat das Zielfenster überhaupt Zugriff auf das DGV des Ausgangsfensters, wo ist public Quell-DGV definiert? Im Designer habe ich nichts dergleichen gefunden.
  3. Wie übergebe ich den DataGridView als Objekt, so daß ich im Zielfenster alles sehe, was ich auch im Ausgangsfenster sehe, ohne daß Änderungen im Zielfenster Auswirkungen auf das Ausgangsfenster haben?
  4. Ich habe hier im Forum mehrfach gelesen, daß es schlechter Programmierstil sei, Daten von einem Fenster an das andere zu übergeben.
    4a) Warum ist das so, was kann passieren?
    4b) Was ist die Alternative?

Danke für Eure Hilfe
Uwe

27.11.2007 - 23:39 Uhr

Hallo,

ich habe eine Form, die ihe Größe der Größe des darin befindlichen DataGridView anpassen soll. Die Größe des DataGridView wird zur Laufzeit erstellt.

Die Form ist auf AutoSize = true und AutoSizeMode = GrowAndShrink gesetzt.
Das DataGridView mal auf Anchor = Top, Bottom, Left, Right mal auf Dock = Fill.

Das Fenster paßt sich aber der Größe der Tabelle nicht an.
Woran kann das liegen?

Danke im voraus
Uwe

24.11.2007 - 12:38 Uhr

Juetho, das konnte ich leider so nicht herauslesen, ich kenne auch die Vorgeschichte nicht, falls es eine gibt.

Aber kein Problem, SteelWarrior, entschuldige, falls ich Dich mit meiner Aussage beleidigt haben sollte. Bei meinen allgemeinen Grundausagen bleibe ich jedenfalls.

Uwe

24.11.2007 - 03:49 Uhr

Hallo ara,

was Du da versprichst, klingt sehr interessant. Vielleicht könnten wir uns da nächste Woche nochmal austauschen.

Ich habe jede der Spalten mit absteigender Sortierung indexiert.
Da die Tabelleneinträge nur automatisch vergebene Int-Schlüssel einer Stammdatentabelle enthalten, stehen die aktuellsten immer ganz oben (hoffentlich🙂).

Ich will jetzt am Wochenende 100.000 Sätze Altdaten reinladen, um zu testen. (Altdaten ...) Bis jetzt läuft es auch mit 6000 Sätzen einwandfrei.

Zu Deinen Tips:
Antwort1 a) alle Einträge sind bekannt
Antwort1 b) das ist nur unter großem Aufwand und wahrscheinlich nur unter PerformanceVerlust an anderer Stelle realisierbar, es kann im Programm jede der Spalten an jeder Stelle des SQL-Suchstrings stehen
Antwort2 Muß ich mich erstmal schau machen, kenn ich noch nicht, aber eigentlich wollte ich beim TableAdapter bleiben

Tschüß
Uwe

24.11.2007 - 02:06 Uhr

Hallo Steelwarrior,

der Thread ist zwar schon eine Woche her, aber vielleicht guckst Du ja nochmal rein.

Ich habe mich auch manchmal in Foren (nicht hier) über arrogante Antworten geärgert. Aber ich weiß aus eigenem Erleben, daß man alles und zwar wirklich alles durch selbst Suchen, selbst Lesen, selbst Nachdenken, selbst Kombinieren, und selbst Testen herausbekommen kann. Es kostet eben nur sehr sehr viel Zeit. Diese Zeit ist immens viel wert, weil Leute, die Dir mit einem Tip weiterhelfen, vielleicht mehrere Stunden Ihres kostbaren Lebens damit zugebracht haben, eine Lösung nur für diesen einen Tip zu finden.

Ein Forum sollte auf Geben und Nehmen beruhen, mit einem Augenzudrücken für Anfänger, die aber guten Willen zeigen, aus Fehlern lernen und irgendwann etwas zurückgeben sollten. Ich bin selber fortgeschrittener Anfänger in C#, habe mir jedoch in SAP 90% und in Visual Basic for Applications 100% selbst erarbeitet. Wodurch? Durch Lesen der Hilfe und permanentes Ausprobieren am System, manchmal 8 Stunden durchgehend am Tag. Kannst Du 8 Stunden lang Hilfe lesen? Das Lesen und Ausprobieren ist nebenbei gesagt auch die beste Methode, um etwas dauerhaft zu behalten.

In der freien Wirtschaft ist das so: willst Du SAP/C# lernen, mußt Du dafür bezahlen. Du machst ein paar Seminare und weißt hinterher gar nichts. Warum? Weil Du ohne Problemstellung versuchst zu lernen. Du brauchst ein Problem, um zu verstehen, Du mußt Dich quälen, das Problem selbst zu lösen, ohne andere zu fragen. Und nur wenn Du absolut nicht mehr weiter kommst, fragst Du andere.

Wenn Du dann diese mehrjährige Lehrzeit hinter Dir hast, es ist eine schwere Zeit, Du mußt der Typ dafür sein, dann kannst Du Geld verdienen. Viel Geld, 1000 Euro am Tag entweder wenn Du gut bist oder wenn Du ein guter Blender bist. Die kenn ich auch zur Genüge.

Also, hör auf zu jammern, lies die Hilfe, probiere, denk nach, reiß Dich zusammen, oder mach was anderes, wenn Du nicht die Zeit oder den Willen dafür hast.

Viel Erfolg
Uwe

24.11.2007 - 00:13 Uhr

Man sollte natürlich korrekt sein, sorry, ich hatte einen Mischmasch aus SQL und Umgangssprache verwandt.
Mit Komma (,) ist AND gemeint, "or" ist aus dem Englischen kopiert und meint "oder der folgende Ausdruck' bzw. "zum Beispiel", nicht OR als Operator.

Hiermit ("So..., jetzt sind wir wahrscheinlich zwei, die sich gegenseitig nicht mehr verstehen.") hast Du zumindest mit Deinem folgenden Satz Recht:

"Also die erste Frage ist mal: Soll die Unterscheidung im Client oder auf dem Server geschehen. Der sicherste Weg um die von dir beschriebene Anforderung umzusetzen und sicherzustellen, dass das auch IMMER eingehalten wird ist klar ein TRIGGER."

Wenn du nochmal diesen Link öffnen soltest, erkläre es mir bitte.

Bis bald
Uwe

23.11.2007 - 23:27 Uhr

Hallo Oxygen,

ich war lange nicht im Forum, deshalb erst jetzt die Antwort.

Also, das ganze ist ein Performance-Problem.
Ich möchte einfach nur perfomant eine Abfrage aus einer beliebigen Kombination einer beliebigen Anzahl von Spalten auf einer Tabelle durchführen.
Performant sind aber leider nur festgelegte Schlüssel.
Wie man es mit dynamisch generierten „Schlüsseln“ mit der höchsten Geschwindigkeit macht, war die Frage.

C#-Select-Abfragen sind nicht perfomant (habe ich gelesen).
„Find“ mit Schlüssel schon. Geht aber hier nicht, da der Schlüssel immer anders aussehen kann.
Die Syntax die ich aufgeschrieben hatte, betraf nur SQL., zum leichteren Verständnis, ist aber anscheinend nicht angekommen.
Derzeit baue ich mir die SQL-Abfrage als string mühsam zusammen, funkioniert auch ganz gut.
Wie es bei größeren Datenmengen aussieht, ggf. Info hier.

Gruß
Uwe

23.11.2007 - 22:46 Uhr

Hallo,

ich habe ein Formular (ein Fenster) das 3 Container enthält, einer davon mit einem DataGridView.
Die Formularklasse enthält circa 50 Methoden, wobei sich die Hälfte auf das DataGridView bezieht.
Im Hintergrund ist eine Datenbank für die Steuerelemente und die Daten.

Ich möchte nun bei einer bestimten Aktion auf dem DataGridView ein weiteres abgespecktes Fenster öffnen, das nur einen Ausschnitt des DataGridViews zeigt (Behandlung von Doppeleingaben), wobei alle Methoden des ursprünglichen Fensters, die sich auf das DataGridView beziehen, verwendet werden sollen.

Frage 1: Ist es sinnvoll, das abgespeckte Formuar als Erbe des ursprünglichen Formlars aufzubauen, oder ist es besser die Methoden einzeln zu kopieren und ggf. anzupassen?
Frage 2: Was muß ich bei einem solchem Vorhaben beachten, bzw. habt Ihr ein paar allgemeine Tips dazu?
Frage 3: Ich habe bereits probiert, ein geerbtes Formular anzulegen und erhalte die Meldung „Fehler beim Anfügen einer automatisch benannten Datenbank für die Datei C:\Programme\Microsoft Visual Studio 8\Common7\IDE\DBPasadena.mdf. Eine Datenbank mit diesem Namen ist bereits vorhanden, die angegebene Datei kann nicht geöffnet werden, oder sie befindet sich in der UNC-Freigabe. Was hat es damit auf sich?

Danke im voraus
Uwe

PS: Administrator, falls das Thema besser bei Datenbanken aufgehoben ist, bitte verschieben.

03.11.2007 - 16:09 Uhr

Danke Euch beiden,

ich versuche es trotzdem erstmal mit der DB-Lösung.
Ich hab's halt gern alles einheitlich.
Das ganze Gewusel von XML-Dateien gefällt mir (rein gefühlsmäßig) irgendwie nicht.

In der Testphase werde ich von meinen Erfahrungen an dieser Stelle mal berichten.

Gruß
Uwe

02.11.2007 - 23:48 Uhr

Hallo,

ich möchte Formulareinstellungen die in mehreren Klassen vorkommen zentral durch den Benutzer verwalten lassen, bei MS allgemein bekannt unter Extras/Optionen, also z.B. Höhe, Breite, Schriftart von Textboxen.

Bevor ich anfange noch eine Rückversicherung: ist folgender Weg der richtige?

  • Speicherung der Optionen über Menü in Datenbank
  • statische Klasse MyControl definieren, wobei get{} die Eigenschaften z.B. Höhe. Breite mit tableAdaper zuerst in dataTable füllt und dann von dort abfragt
  • in jeder weiteren Klasse Control.Eigenschaft = MyControl.Eigenschaft ?

Was gibt es zu beachten?

Noch ein Tip an alle, die das auch vorhaben. Macht es ganz am Anfang des Projekts.
Und eine Frage an alle: Was sollte man noch ganz am Anfang eines Projekts festlegen/programmieren?

Gruß
Uwe

02.11.2007 - 23:01 Uhr

Hallo Ben,

ich habe ein Stück meines Codes kopiert, wo ich etwas ähnliche mache, vielleicht hilft es dir weiter. Vermutlich fehlt nur ShowDialog():


TreeViewfenster treeViewFenster = new TreeViewfenster(baumeingabe);
int cellbottom = dataGridViewEingabe.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true).Bottom;
int cellright = dataGridViewEingabe.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true).Right;
Point pt = dataGridViewEingabe.PointToScreen(new Point(cellright, cellbottom));
int außerhalbscreenX = pt.X + treeViewFenster.Width - Screen.GetBounds(treeViewFenster.Location).Right;
int außerhalbscreenY = pt.Y + treeViewFenster.Height - Screen.GetBounds(treeViewFenster.Location).Bottom;
if (außerhalbscreenX > 0) pt.X = pt.X - außerhalbscreenX;
if (außerhalbscreenY > 0) pt.Y = pt.Y - außerhalbscreenY;
treeViewFenster.Location = pt;
treeViewFenster.ShowDialog();
bäumeTableAdapter.Fill(dbPasadenaDataSet.Bäume);

Gruß
Uwe

01.11.2007 - 22:36 Uhr

Hallo

ich möchte jedem Image in einer ImageList einen Text zuweisen.
Wenn ich es zum Beispiel über

imglist.Images_.Tag = "abc";

versuche, ist der Tag leer, die Zuweisung wird irgendwie nicht angenommen.

Gruß
Uwe

29.10.2007 - 22:44 Uhr

verwendetes Datenbanksystem: VS Standard 2005

Hallo,

ich möchte im nachstehenden Ausdruck Spaltenname und Eintrag dynamisch
durch Variablen vergeben.
Also statt myDataview.RowFilter = "City = 'Berlin'";
myDataview.RowFilter = ... feldname = eintrag ...;

Wie schreibt man das?

Gruß
Uwe

25.10.2007 - 23:09 Uhr

Hallo allerseits,

ich verstehe nicht, wozu Ausnahmen (exceptions) gebraucht werden.
Sollte man nicht lieber die Zeit, die man für die Programmierung von Ausnahmen verwendet, dafür nutzen, den Code fehlerfrei zu gestalten und die Tests der Software perfektionieren?

Wenn man eine Ausnahme programmiert, weiß man doch eigentlich schon vorher, was schief gehen kann. Warum kümmert man sich nicht um die Ursachen, sondern um die Symptome?

Gruß
Uwe

25.10.2007 - 16:37 Uhr

Vielleicht die Tabelle erst sortieren, dann durchlaufen und abfragen ob vorhergehender Satz = aktueller Satz. Wenn ja, dann ist was doppelt.

Grüße Uwe

25.10.2007 - 10:44 Uhr

Hallo Warappa,

ich habe dasselbe Performance-Problem.
Könntest Du ein Code-Beispiel posten, ich habe noch nicht verstanden, was Du gemacht hast.

Gruß
Uwe

24.10.2007 - 23:25 Uhr

verwendetes Datenbanksystem: MS VS 2005 Standard

Hallo allerseits,

stellt Euch eine Tabelle vor, die folgende Spalten enthält:

wer was wann wo warum + 4 weiter Spalten

Jede Spalte nimmt Integerwerte als Schlüssel zu den zugehörigen Stammdatentabellen auf.

Die Tabelle kann aufgrund der Ausprägungen jeder Spalte und der möglichen Kombinationen mehrere Millionen Einträge enthalten.

Es ist sichergestellt, daß jeder Datensatz in seiner Kombination aus den Einträgen nur einmal in der Tabelle vorkommt.

Wenn ein Eintrag in der Tabelle vorgenommen wird, soll vorher abgeprüft werden, ob die zu ändernde Ausgangskombination schon existiert. Wenn ja, soll nur ein Spalteneintrag geändert werden und der Rest der Kombination soll so bleiben, wenn nein, soll ein neuer Satz hinzugefügt werden.

Ich habe ins Auge gefaßt, die Tabelle um eine Primärschlüsselspalte zu erweitern und bei jedem Eintrag einen String-Schlüssel wer-was-wann-warum-etc. (Länge wahrscheinlich max. 25 Zeichen) zu generieren und mit wegzuschreiben und ihn dann bei Änderung über „find“ abzufragen. Desweiteren könnte man über „select“ die einzelnen (indizierten) Spalten abfragen.

Meine Frage: Was ist der performanteste Weg die Prüfung zu realisieren?

Danke im voraus
Uwe

20.05.2007 - 15:03 Uhr

Danke erstmal für die Tips.

Wenn ich mit einem Brush in eine PictureBox zeichne funktioniert alles.
Wenn ich aber einer Zelle in einem DataGridView eine transparente Hintergrundfarbe zuweisen möchte, geht es nicht.
Eine Farbe mit Alpha = 255 funktioniert dagegen.


dataGridViewEingabe[spalte - 1, zeile - 1].Style.BackColor = Color.FromArgb(100, Color.FromArgb(backcolor));

20.05.2007 - 01:57 Uhr

Hallo dr4g0n76,

ich möchte die Farbe sehr blaß, also bei hellem Hintergrund duchsichtig machen.
Ich habe es mit


Color.FromArgb(100,Color.FromArgb(backcolor));

versucht, klappt aber nicht.
Bei einem Alpha-Wert von 255 zeigt er die komplette Farbe, bei einem Wert ≤ 254 zeigt er schwarz/weiß.
Hast Du noch einen Tip? Ich habe wie gesagt nur einen Integerwert für die Ausgangsfarbe, nicht RGB einzeln.

MfG Uwe

19.05.2007 - 22:49 Uhr

Hallo allerseits,

ich habe bisher mit Images (bestehend aus Text und Format) gearbeitet und Wasserzeichen der Images folgendermaßen erzeugt:


Bitmap bmp = new Bitmap(imageListBaum.Images[QuellNode.Name]);
ImageAttributes ia = new ImageAttributes();
ColorMatrix cm = new ColorMatrix();
cm.Matrix33 = 0.5f;
ia.SetColorMatrix(cm);

g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia);
g.Dispose();

Inzwischen habe ich alles auf eine Anzeige in einem DataGridView umgestellt und erhalte die Farben als int aus einer Datenbank und färbe die Zellen folgendermaßen ein:


dataGridViewEingabe.Rows[zeile].Cells[spalte].Style.BackColor = Color.FromArgb(backcolor);
dataGridViewEingabe.Rows[zeile].Cells[spalte].Style.ForeColor = Color.FromArgb(forecolor);

forecolor und backcolor sind dabei int-Werte.

Frage: Wie kann man diese int-Werte in int-Wasserzeichen-Werte umwandeln, die o.g.Farbmatrix mit 50% Farbtiefe entsprechen?

Danke im voraus
Uwe

19.05.2007 - 22:16 Uhr

Hallo allerseits,

wie zoomt man ein Datagrid?
Es sollte analog zu Excel Ctrl+Mausrad funktionieren.

Ich konnte die Begrenzung des Datagrid über die Maus- und Tastenabfrage der Form und DataGridView.Scale() schon zoomen, allerdings nicht die Größe der Zellen. Außerdem möchte ich Dock=Fill für das Datagrid so lassen, die Ränder sollen nicht mit zoomen, nur der Inhalt.

Danke im voraus
Uwe

17.05.2007 - 01:48 Uhr

... an Euch beide, Durin-V und DeveloperX.

ich werd' den morgigen Tag nicht zum Ausflug nutzen, sondern erstmal was über statische Klassen und Methoden lesen, das hab ich bisher immer beiseite geschoben.

Wie auch immer, mein Anliegen ist, den Code für eine MessageBox möglichst kurz zu halten, am liebsten M(x), M global und überall aufrufbar für alle Formate von x definiert. Ich würde gern auch vermeiden, immer erst ein Objekt für die Anzeige erzeugen zu müssen.

Ich halte Euch auf dem Laufendem
Uwe

16.05.2007 - 23:57 Uhr

Halllo allerseits,

ich möchte nicht immer MessageBox.Show(<irgendwas>.String())
eingeben, um mir im Prgrammablauf etwas anzeigen zu lassen.

Gibt es eine einfachere Möglichkeit als die u.s.?

Danke im voraus
Uwe


    class Wz
    {
        public void msg(string s)
        {
            MessageBox.Show(s);
        }
        public void msg(int i)
        {
            MessageBox.Show(i.ToString());
        }

    }
   
   class <andere Klasse>
   {
     private void Testmethode()
        {
            Wz wz = new Wz();
            wz.msg(1);
            wz.msg("a");
        }
    }

25.04.2007 - 20:59 Uhr

Hallo citizen.ron

Danke für Deinen Tip. Mit KeyDown (für das Fenster) lässt sich zwar eine Verarbeitung einschalten, aber mit KeyUp nicht wieder ausschalten.

Ich habe jetzt zumindest für die Tastenbehandlung den u.s.Code (für das Panel) gefunden. Damit wird das horizontale Scrollen nur während des Drückens der Ctrl-Taste beinflußt.
Leider kann ich nicht die vertikale Scrollbewegung ausschalten – ein Tip?
(Math.Abs(e.Delta) dient selbstverständlich nur dem Zweck zu sehen, ob überhaupt etwas passiert, das wird später noch richtig ausgerechnet)

Uwe


        private void PanelGesamtübersicht_MouseWheel(object sender, MouseEventArgs e)
        {
            if (Panel.ModifierKeys == Keys.Control)
            {
                panelGesamtübersicht.HorizontalScroll.Value = Math.Abs(e.Delta);
                panelGesamtübersicht.VerticalScroll.Enabled = false;
            }
        }
        private void picGesamtübersicht_MouseClick(object sender, MouseEventArgs e)
        {
            picGesamtübersicht.Select();
        }

23.04.2007 - 21:13 Uhr

Hallo allerseits,

ich habe ein Panel mit AutoScroll=True, darin eine PictureBox mit SizeMode=AutoSize. Das Scrollen mit der Maus funktioniert vertikal und horizonal, wenn die PictureBox das Panel in der jeweiligen Richtung überlappt. MouseWheelEvent abfragen funktioniert auch.

Ich möchte nun folgende Funktionalität realisieren:
Ctrl + Mausrad = HorizontalScrollen, Shift + Mausrad = Zoom, <nichts>+Mausrad = VertikalScrollen
Beim Scrollen soll darüber hinaus ein Teil des Bitmaps der PictureBox (Zeilenkopf/Spaltenkopf) in der Scrollrichtung nicht mitwandern, sondern stehen bleiben.

  1. Muß ich das zu Fuß über eigene Scrollbalken machen oder gibt es einen eleganteren Weg?
  2. Wie kann ich die MouseWheel- und die KeyState-Abfrage verbinden?
  3. Hat jemand Erfahrung / ein Beispiel für PictureBox.Scale(), ich bekomme das mit den Faktoren nicht hin, oder muß man über eine Grafik-Matrix zoomen?
  4. Muß man das Stehenbleiben der Zeilen- und Spaltenköpfe mit eigenen Panels/Picturboxes über Anzeigen/Verbergen realisieren oder gibt es eine elegantere Lösung.

Danke im voraus für Eure Hilfe.
Auch unvollständige Lösungen und ungeprüfte Ideen sind willkommen.
Uwe