Hat wirklich keiner einen Vorschlag???
Dann hab ichs mit kopieren über den Server versucht.
Schien zu funktionieren, aber ich kann mich nicht anmelden.
Das Problem ist wie ich in meinem letzten Beitrag geschrieben habe, dass der Benutzer in beiden Servern unterschiedlich ist.
Der Datenbankuser in der eingespielten Datenbank hat eine andere interne ID als der SQL-Server-User (obwohl er den gleichen Namen hat). Also - in der kopierten Datenbank den Datenbank-User löschen und den entsprechenden SQL-Server-User neu der Datenbank zuweisen ... dann klappt es auch mit der Anmeldung.
Gruß Ralf
Hallo herbivore,
X( vielen Dank - ist ja fast schon peinlich, dass ich nicht selbst daraufgekommen bin.
Gruß Ralf
Hallo,
ich muss in einer meiner Funktionen zu einer Zeitberechnung (in Echtzeit beim Verschieben von Objekten auf einer Zeichenfläche) die Performance erhöhen. Dabei habe ich zum folgenden Code eine Frage:
Datum = DateTime.Parse(Datum.ToShortDateString() + " " + AnderesDatum.ToShortTimeString());
Ein Datum wird aus seinem eigenen Datumsteil und dem Zeitteil eines anderen Datums neu zusammengesetzt. Hierbei sind aber viele String-Funktionen beteiligt, die ja bekanntlich nicht sehr schnell sind.
Hat jemand von Euch eine Ahnung, wie man diese Problemstellung Performancemäßig schneller und eleganter lösen könnte?
Gruß Ralf
Hallo,
ich hatte vor längerem das gleiche Problem. Ich bin mir nicht mehr ganz sicher, aber es hatte glaube ich etwas mit dem Speicherort der Log- und Data-Dateien zu tun, wenn diese in eine ganz falsche Richtung zeigen. D.h. wenn die Speicherplätze dieser Dateien auf den beiden SQL-Servern komplett unterschiedlich sind.
Überprüfe mal diese Pfade beim einspielen der DB auf dem Zielsystem, ob die auf die richtigen physikalische Speicherorte verweisen (siehe Screenshot).
Nächstes Problem wirst du ggf. mit einem eigens angelegten Datenbankuser haben: Wenn du z.b einen User 'DBUser' auf beiden SQL-Servern angelegt hast mit Zugriff auf diese DB und dann die DB von einem Server auf den anderen einspielst, hat der User 'DBUser' keinen Zugriff mehr auf die eingespielte DB. Der Grund ist, dass die User zwar auf beiden DBs gleich heißen, aber verschiedene interne IDs besitzen und somit auf beiden Systemen unterschiedlich sind.
Abhilfe bietet das Löschen des Users 'DBUser' aus der eingespielten DB (nur in der DB löschen, nicht den ganzen Useraccount im SQL-Server) und gleich wieder Zuweisung des Useraccounts 'DBUser' zur DB. Damit hat der 'DBUser' des Zielsystems wieder Zugriff auf die eingespielte DB.
Ich hoffe das hilft dir weiter!
Gruß Ralf
verwendetes Datenbanksystem: SQL-Server
Hallo,
wie bewerkstellige ich ein 'Order By' mit natural sorting?
Varchar-Spalte soll folgendermaßen sortiert werden:
1.1, 1.2, 2.4, 6.8, 10.4.5, 100.5
Gruß Ralf
Jo - auf Haggy seinem Blog war ich schon.
Ich bastle mal weiter an meinem Split-Container rum. Mal seh'n ob ich das ganze geschmeidiger hinkriege.
Soweit mal Danke euch allen.
Gruß Ralf
Hallo,
keiner eine Idee, wie man den Gantt sauber lösen könnte?
Danke
Ralf
Hallo herbivore,
grundsätzlich ja, aber dafür hat man das Problem, dass man 2 verschiedene Controls auf gleicher vertikaler Ausrichtung halten muss. Bei mir ist jetzt das Problem, dass z.B. das Panel scrollt und das Grid 'hinterherhinkt'.
Viel lieber hätte ich z.B. dass die Balken ebenfalls im Grid 'eingebaut' werden (in einer Spalte). Dies ist techn. kein Problem, aber wie könnte man da einen Splitter zwischen dieser Spalte und dem vorderen Teil des Grids realisieren?
(Und noch dazu einen horizontalen Scrollbalken für die Balken-Spalte und getrennt davon ein Scroller für die gesamten linken Spalten - uff)
Durch diese Lösung wäre aber immer der 'Scroll-Gleichlauf' gewährleistet und die Headerzeilen würden beim Scroll stehenbleiben - aber wohl zu aufwändig?
Gruß Ralf
Hallo herbivore,
danke für deinen Input:
Im Scroll-Event des Panels:
private void SplitContainerProjektGantt_Panel2_Scroll(object sender, ScrollEventArgs e)
{
if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
{
this.DataGridView.FirstDisplayedScrollingRowIndex = (e.NewValue / Zeilenhöhe);
}
}
Aber gibt es bessere Ansätze als den SplitContainer?
Gruß Ralf
Hallo allerseits,
Ich will einen Projektplaner bauen wie MS Projekt. Als GanttContainer habe ich den SplitContainer verwendet. Links ist ein Datagridview eingebaut und rechts ein Panel zum Zeichnen der Vorgangsbalken.
Das Problem sind nun die vertikalen Scrollbalken beider Bereiche, welche nun syncron laufen müssen. Auf den Datagridview-Scroller kann ich einen Event legen und damit das Panel fernsteuern. Umgekehrt geht das nicht, da man anscheinend auf das Datagridview-AutoScrolling keinen Zugriff hat.
Ich denke mir 'Macht nix' - dann blende ich den vertikalen Scroller des Panels einfach aus
SplitContainer.Panel2.VerticalScrollbar.Visible = false
und steuere nur mit dem Scroller des Grids.
-> Pustekuchen - der Scroller bleibt immer sichtbar!!!
Hat jemand Ahnung, wie man das Scrolling des GridViews fernsteuern kann oder gibt es eine bessere Möglichkeit für den Gantt als den SplitContainer.
Z.B. alles ins Grid packen (Balken-Diagramm in einer Spalte), aber wie könnte man hier den Splitter realisieren?
Grüße Ralf
So - jetzt weis ich wie's in VS2005 geht:
Cursor in VS erstellen und mit eingekringeltem Symbol den Hotspot festlegen ('Mittelpunkt' des Cursors: entspricht den Mauskoordinaten)
Ralf
@herbivore: hmmm - Den Cursor hab' ich in VS2005 erstellt. Mal schauen ob ich da was finde. Ich geb' hier dann Bescheid.
Jedenfalls danke - jetzt weis ich, wo ich es einstellen muss!
Gruß Ralf
Hallo,
ich habe in VS2005 ein CustomControl, welchem bei OnMouseMove ein CustomCursor zugewiesen wird.
Dies geschieht wie folgt:
private Cursor _CursorVerknüpfung;
...
protected override void OnMouseMove(MouseEventArgs e)
{
...
this._CursorVerknüpfung = new Cursor(GetType(), "CursorVerknüpfung.cur");
this.Cursor = this._CursorVerknüpfung;
...
}
Soweit sogut. Ich will aber das beim Cursorwechsel dieser 'Verschoben' angezeigt werden soll. D.h. normal zeigt der Maus-Point auf die linke obere Ecke. Ich will aber das der Maus-Point in der Cursor-Mitte liegt (wie in Grafikprogrammen das Fadenkreuz).
Beispiel: wenn man vom Default-Cursor zum Cursors.VSplit wechselt wird dieser sofort um die halbe Cursorgröße nach links oben verschoben (Offset?) und die zurückgegebenen Maus-Koordinaten stellen den Cursormittelpunkt dar.
Genau das will ich mit meinem Custom-Cursor auch!!!
Ich hoffe, dass hat jetzt jemand verstanden!
Zum Test habe ich schon
this._CursorVerknüpfung.HotSpot.Offset(-5, -5);
versucht, aber da passiert gar nix.
Hat jemand eine Idee?
Grüße Ralf
Hallo pcfreak17,
nachfolgend ein möglicher Lösungsansatz (ungetestet):
private Point _startControl;
private Point _startMouse;
protected override void OnMouseDown(MouseEventArgs e)
{
this._startMouse = Cursor.Position;
this._startControl = this.Location;
}
protected override void OnMouseMove(MouseEventArgs e)
{
this.Left = this._startControl.X + (Cursor.Position.X - this._startMouse.X);
this.Top = this._startControl.Y + (Cursor.Position.Y - this._startMouse.Y);
}
Gruß Ralf
Hallo herbivore,
ja - aber bei Refresh() kannst Du keinen einzelnen Bereich angeben, der neu gezeichnet werden soll.
Refresh() aktualisiert immer den gesamten Control-Hintergrund!
Ich brauchte aber ein sofortiges Neuzeichnen eines Teilbereiches.
Gruss Ralf
Hallo punkdevil,
Original von punkdevil
Hast du schon mal Update() probiert?
Danke - das war's:
Rectangle rc = new Rectangle(this.Location, this.Size);
Parent.Invalidate(rc, true);
Parent.Update();
Update() erzwingt das Neuzeichnen des für ungültig erklärten Bereichs.
Gruss Ralf
Hallo,
folgendes Problem beim Neuzeichnen eines Parent-Controls:
Rectangle rc = new Rectangle(this.Location, this.Size);
Parent.Invalidate(rc, true);
veranlasst das Neuzeichnen des entsprechenden Bereiches beim 'nächsten regulären Neuzeichnen' des Controls. - Also nicht sofort!
Wenn man eine sofortiges Neuzeichnen erzwingen will muss man
Parent.Refresh();
angeben. Hier ist es aber nicht möglich, nur den Teilbereich anzugeben, welcher Neugezeichnet werden soll.
Hat jemand eine Idee, wie sofortiges Neuzeichnen eines Teilbereiches erzwungen werden kann?
Hintergrund meines Problemes ist, dass ein Custom-Control auf einem Panel plaziert ist. Dieses kann per Maus verschoben werden (OnMouseMove). Während des Verschiebens wird das Panel nicht aktualisiert, wodurch das verschobene Custom-Control einen grauen Schlierer hinterlässt bis das OnMouseMove-Event erledigt ist. Jetzt will ich also im OnMouseMove-Event das Neuzeichnen des Panels nur im Custom-Control-Bereich erzwingen, wobei ich aber obiges Problem habe.
Invalidate greift erst nach erledigtem OnMouseMove (Schlierer bleibt bis Drag-Ende), mit Refresh() geht's, aber da das gesamte Panel aktualisiert wird, flackert alles zu stark!
Gruss Ralf
Hallo,
hab's inzwischen selbst rausgefunden:
Die Arbeitsfläche bei transparenten Controls kann nicht direkt gelöscht werden. Statt dessen muss der entsprechende Bereich des Parent-Controls zurückgesetzt werden:
public void Clear()
{
if (Parent == null)
return;
Rectangle rc = new Rectangle(this.Location, this.Size);
Parent.Invalidate(rc, true);
}
Gruss Ralf
Hallo - ich nerve schon wieder mit den blöden transparenten Controls:
Ich habe folgendes transparente Control:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace App
{
class TransparentPictureBox : Panel
{
public TransparentPictureBox()
{
this.BorderStyle = BorderStyle.None;
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.FromArgb(0, 0, 0, 0);
this.Dock = DockStyle.Fill;
}
public void Erase()
{
Graphics g = CreateGraphics();
g.Clear(Color.FromArgb(0, 0, 0, 0));
g.Dispose();
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
}
protected override void OnPaintBackground(PaintEventArgs e)
{
}
}
}
In dieses Control zeichne ich aus externen Klassen etwas hinein.
Das funktioniert alles super.
Da diese 'Zeichnungen' laufend geändert werden, muss die Arbeitsfläche dauernd gelöscht und der Inhalt neu aufgebaut werden.
Dazu dient eigentlich die obige Codezeile
g.Clear(Color.FromArgb(0, 0, 0, 0));
-> Arbeitsbereich erneuern mit angegebener Farbe.
Hier beginnt mein Problem, sobald ich Erase() aufrufe:
Wenn ich irgendeine Farbe angebe, funktioniert es (Farbe blau - Control wird mit blauem Hintergrund 'gecleared'). Aber bei 'Color.Transparent' (was ich ja haben will!) bzw. Color.FromArgb(0, 0, 0, 0), was ebenfalls Transparenz bewirken sollte, erscheint das ganze Control SCHWARZ?!?!?
Hat jemand eine Idee, wie ich ein sauberes transparents Arbeitsflächen-Clear hinbekomme?
Gruß Ralf
Hallo Sandybanks,
den 3-Zeiler, dann ich am Anfang gepostet habe, muss nicht unbedingt im OnPaint-Event liegen, sondern kann auch im Konstruktor sein. Genauer gesagt, er sollte sogar im Konstruktor liegen, da in der OnPaint so wenig wie möglich Code rein sollte (Performance).
Dies wollte ich nur noch anmerken, um Verwirrungen zu vermeiden. Also so wie es dr4g0n76 vorhin gepostet hat!
Wenn Du das Beispiel von dr4g0n76 verwendest hast, hast Du dabei auch beachtet, dass deine Array-Elemente dann auch von Typ CPictureBox sind und nicht PictureBox?
Gruß Ralf
Hallo Sandybanks,
ich habe gerade das gleiche Problem. Dieses wird im Thread Transparenz in CustomControl (.NET-Bug?) gerade behandelt.
Grundsätzlich musst Du im OnPaint der PictureBox folgenden Code ergänzen:
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
BackColor = Color.FromArgb(0, 0, 0, 0);
Ich habs zwar in CustomControls eingesetzt, aber ich denke in der PictureBox müsste es auch gehen.
Im o.g. Thread sind auch weiterführende Links zu diesem Thema.
Gruß Ralf
Hallo und Danke für alle Vorschläge!
Ich habe mich jetzt für das Singleton entschieden und eingebaut, da dies schnell und einfach zu Realisieren war.
Gruß Ralf
@Friedel:
Einen riesen Dank an dich erst mal!!! Es funzt. =)
Folgender Code in OnPaint ergänzt
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
BackColor = Color.FromArgb(0, 0, 0, 0);
und es geht.
Aber nun habe ich gleich die nächsten Probleme:
1.
Wenn ich meine grüne Balken verschiebe (ebenfalls CustomControls) bleibt der Panel-Hintergrund an der alten Balkenposition solange grau, wie das OnMouseMove-Event wirkt. Erst bei kurzen Pausen wird der Hintergrund neu gezeichnet. Dies hat natürlich sehr häßliche Effekte (siehe Bild).
Wie kann dies vermieden werden?
2.
Auch die Pfeil-Controls, deren OnPaint-Methode durch das Balkenschieben getriggert werden verhalten sich nicht korrekt:
protected override void OnPaintBackground(PaintEventArgs pevent)
{}
verhindert das Neuzeichnen des Backgounds, wodurch teilweise 'alte' Pfeile einfach in der Landschaft stehen bleiben. Mit
protected override void OnPaintBackground(PaintEventArgs pevent)
{
base.OnPaintBackground(pevent);
}
bleiben keine Pfeile fälschlichweise stehen, aber wie bei (1) bleibt der Background bei OnMove grau bis der Pfeil 'stehen bleibt'.
Wenn ich in die Pfeil-Controls die Clear-Funktion einbaue
public void Clear()
{
if (Parent == null)
return;
Rectangle rc = new Rectangle(this.Location, this.Size);
Parent.Invalidate(rc, true);
}
und von außerhalb bei Balken-OnMouseMoves, wo das Neuzeichnen der betreffenden Pfeile mit Pfeil.Invalidate() getriggert wird mit aufrufe, dann flackert der betreffende Bereich.
Lösungsvorschlag?
3.
Das gesamte Raster im zugrunde liegenden Panel wird bei jedem neuzeichnen (Panel_OnPaint()) neu berechnet. Dies ist natürlich performance-mäßig ziemlich schlecht.
Ich denke es wäre eine gute Idee, dass beim ersten Zeichnen des Rasters dieses in ein Image geschoben wird und dann ab dem 2. Neuzeichnen nur mehr das Image neu hinterlegt wird.
Ist dies eine gute Idee und wenn ja wie könnte dies Code-technisch realisiert werden?
@norman_timo
Ich habe deshalb Controls verwendet, da in diesen die Referenzen der benachbarten Balken-Controls mit hinterlegt sind und sich somit der Pfeil beim Triggern des Neuzeichnens alle benötigten Koordinaten 'in sich trägt'. Da ist mir halt im ersten Versuch nix besseres eingefallen.
Aber ich denke, Du hast da ganz recht, dass Controls hier etwas unperformant sind. Das Ganze kann auch in einer Klasse realisiert weredn. Ich habe da was Brauchbares zum Thema RubberBand gefunden und mach mich mal daran, dies auf die Pfeile umzumünzen und die Pfeile direkt ins Panel zu zeichnen. Das größte Problem wird wohl im Merken der Pfeil-Positionen liegen.
Im überlappenden Bereich wird natürlich der 'obere' Pfeil gewählt. Aber egal, welche Technik man verwendet, dieses Problem kommt wohl immer hoch.
Also nochmals Danke an euch beide!
Gruß Ralf
Hallo,
ich habe folgendes Problem und sitze wohl auf der Leitung:
In einem CustomControl 'mainControl' ist ein Panel und darin ein TabControl mit entsprechenden TabPages integriert.
In einem dieser TabPages ist ein weiteres CustomControl 'childControl' eingebettet.
Des weiteren existiert im 'mainControl' ein Attribut names 'm_temp'.
So - nun wollte ich aus dem 'childControl' auf das Attribut 'm_temp' zugreifen:
if (this.Parent.m_temp == irgendwas)
{ }
Dieser Versuch ist kläglich gescheitert, da das TabPage als Parent angesehen wird und nicht 'mainControl'!
Also greife ich nun mit
if (((mainControl)this.Parent.Parent.Parent.Parent).m_temp == irgendwas)
{ }
auf das benötigte Attribut zu.
Dies funktioniert nun so, aber mich stören die vier Parents!
Hat jemand einen sinnvolleren Lösungsvorschlag zum Zugriff auf das Attribut?
Grüsse Ralf
Hallo herbivore,
ja, genau so ist das. Works as designed.
🙁 Gibt es da einen Workaround?
Einfach so ins Panel zeichnen kann ich nicht. Es müssen Controls sein, da die Pfeile auswählbar sein müssen.
Gruß Ralf
Hallo erstmal!
Ich habe ein UserControl mit transparentem Hintergrund und darauf ein in der OnPaint-Methode erstellter Pfeil. Dieses Usercontrol wird zur Laufzeit dynamisch mehrmals in ein Panel geladen.
Die Anzeige ist grundsätzlich korrekt: der Hintergrund ist Transparent und der Pfeil sichtbar.
ABER: Wenn sich zwei dieser UserControls überschneiden ist zwar immernoch der Hintergrund des Panels sichtbar, aber ein Control verdeckt den Pfeil des zweiten darunterliegenden Controls. D.h. die Transparenz bezieht sich darauf, dass der PanelHintergrund immer sichtbar ist, aber nicht ein zweites unter einem Control liegendes Control. Dieses (also die Pfeilreste) sieht man erst außerhalb des darüberliegenden Controls (bzw. des imaginären Randes).
Hab' schon alles im Netz abgesucht, aber nichts dazu gefunden. Rumgespielt mit Opacity - nix.
Folgender Code ist auch eingebaut:
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
Hilft aber alles nichts!
Hat irgendjemand eine Idee oder geht das grundsätzlich mit UserControls nicht?
Anbei noch ein Screenshot. Ich habe ihn etwas modifiziert:
Das Raster ist der Panelhintergrund.
Der durchgehende Pfeil in der Mitte ist das betreffende obenliegende transparente UserControl. Den roten Rand habe ich jetzt nachträglich eingezeichnet und stellt dessen 'offiziellen' Rand dar.
Darunter liegt ein zweiter UserControl-Pfeil mit gleichem Anfangspunkt. Der gestrichelte Teil fehlt in echt, sollte aber (nach Logik der Transparenz) ebenfalls sichtbar sein.
Grüsse Ralf