Hallo,
ich habe ein Problem mit dem Standart Save File Dialog von C#.
Und zwar ist es so, das wenn ich versuche eine Datei zu überschreiben, kommt die Frage
ob ich die Datei überschreiben möchte erst, nachdem ich die Taste "Alt" gedrückt habe.
Was könnte das sein?
Ich hatte das auch schon mal bei einer MessageBox die ich mit YES / NO Buttons und nem MessageBox Icon versehen hab, aber dort funktioniert das jetzt wieder.
Was kann da die Ursache sein?
Mfg Kaladial
Hallo,
deine Fragestellung hilft nicht wirklich weiter.
Die Meldung kommt ja erst nach dem bestätigen des Dialoges, wenn man eine bestehende Datei ausgewählt hat.
Wie ist dein SaveFile Dialog konfiguriert? (Ein Stück Code wäre nicht schlecht)
Gruß
Der Aufruf:
string file = "";
sFDLabel.Filter = "Label|*.xml";
sFDLabel.InitialDirectory = MainWindow.HomeDirectory + "\\Labels\\";
DialogResult res2 = sFDLabel.ShowDialog(this);
Parameter:
siehe Anhang
Also ich versuche in diesem Dialog eine Datei zu überschreiben.
Wenn ich auf Speichern klicke passiert nichts
Anhang der Dialog
Dann irgendwann nach beliebiger Zeit drücke ich die Taste "ALT" und dann kommt:
siehe anhang.
Wieso muss ich ALT drücken?
Das Fenster mit der Frage scheint im Hintergrund aufzugehen. Mit dem Drücken der ALT-Taste bekommt es den Fokus und rückt in den Vordergrund.
Hallo Kaladial,
kann es sein, dass die Meldung im Hintergrund ist und durch Drücken der ALT-Taste nur nach vorne geholt wird?
Gruss
Coffeebean
PS: Ahhh zu langsam 😉
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
durchaus möglich...
aber wieso ist die im hintergrund?
und wie ändere ich das?
also was ich jetzt sagen kann (hab grad kopfhörer aufgesetzt und es gehört)
es pingt wenn ich auf speichern klicke und ich kann den "SaveDialog" nicht bewegen oder so
hmmm jetzt kommt gar keine Frage mehr....
hmmm in dem Fall auch ok. Danke.
Hallo Kaladial,
hast du mal einen anderen Dialog probiert, eventuell in einer neuen Solution und geschaut, ob der sich genauso verhält? Dann kannste ja vergleichen.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
ähm, naja wie soll ich sagen 😃
ich weiß nicht wie das geht.
also ich hab vs2013. ka wo ich da in ner neuen solution nachschauen soll.
bzw ich bin noch gar nicht auf die idee gekommen das es da etwas anderes gibt.
Hallo Kaladial,
ich meinte einfach nur eine neue Visual Studio Instanz aufmachen und mal den Minimalcase nachbauen. [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden
File --> New Project --> WinForms etc.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
achso...
ja ok ich war jetzt echt verwirrt was du von mir wolltest...
also ich hab in dem letzten halben jahr 5 verschiedene programme geschrieben.
das hier ist die erste in der dieser fehler auftritt.
aber ich habs eben ausprobiert.
im Testprogramm tritt das nicht auf.
ich versteh nur nicht so ganz was da dazwischen funken soll.
hab keine BackgroundWorker oder dergleichen laufen...
Das einzigste was ich hab sind Mouse Events bei bestimmten Controls.
Aber da hab ich mir ausgaben gebaut.
dort kommt er nicht lang.
Hallo Kaladial,
aber ich habs eben ausprobiert.
im Testprogramm tritt das nicht auf.
Hast du mal die Properties verglichen?
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Was passiert denn, wenn du ein anderes Fenster über deine Anwendung legst?
Verschwindet das auch in den Hintergrund?
das geht leider nicht ,
aber ich hab noch etwas anderes gefunden, vielleicht ist das auch für dieses problem verantwortlich:
also es ist im endeffekt ein labeldesigner für einen industriedrucker.
heißt ich habe eine grundfläche auf dem ich text code128 und datamatrix objekte an bestimmten positionen positionieren will um das dann auf dem drucker abzuspeichern.
um diese elemente darzustellen habe ich Labels benutzt und die natürlich auch in 90Grad Schritten drehbar gemacht. wenn ich also objekte im 0 Grad darstelle kommt die meldung beim Save Dialog.
wenn ich sie im 90Grad gedrehten darstelle muss ich die alt taste drücken.
darauf bin ich gekommen weil ich tool tips einbauen wollte und auch da: solange ich bei 0 grad bleibe ist alles schön, sobald ich auf 90 grad geh verschwinden die tooltips.
ich würde mal die label-klasse posten.
ich denk die ist dran schuld.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NovexxLabelEditor.PinterObjects
{
public class PrintObjectCode128 : System.Windows.Forms.Label
{
int puid = 0;
string ptype = "Code 128";
string pfont = "";
int protateangle = 0;
string pnewText = "";
int pwidth = 0;
int pheight = 0;
int pgroesse = 48;
bool prahmen = true;
public FormPropsCode128 formProperties;
#region properties region
public int PoUid
{
get
{
return this.puid;
}
set
{
this.puid = value;
}
}
public int PoRotateAngle
{
get
{
return this.protateangle;
}
set
{
this.protateangle = value;
}
}
internal string PoName
{
get
{
return this.Name;
}
set
{
this.Name = value;
}
}
internal string PoType
{
get
{
return this.ptype;
}
set
{
this.ptype = value;
}
}
internal string PoNewText
{
get
{
return this.pnewText;
}
set
{
this.pnewText = value;
}
}
internal string PoText
{
get
{
return this.Text;
}
set
{
this.Text = value;
}
}
internal string PoFont
{
get
{
return this.pfont;
}
set
{
this.pfont = value;
}
}
internal Point PoPos
{
get
{
return this.Location;
}
set
{
this.Location = value;
}
}
internal Size PoSize
{
get
{
return this.Size;
}
set
{
this.Size = value;
}
}
public bool PoRahmen
{
get
{
return this.prahmen;
}
set
{
this.prahmen = value;
}
}
public int PoWidth
{
get
{
return this.pwidth;
}
set
{
this.pwidth = value;
}
}
public int PoHeight
{
get
{
return this.pheight;
}
set
{
this.pheight = value;
}
}
public int PoGroesse
{
get
{
return this.pgroesse;
}
set
{
this.pgroesse = value;
}
}
#endregion
public PrintObjectCode128()
{
formProperties = new FormPropsCode128(this);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
string NewText = this.Text;
double groesse = (double)this.pgroesse;
groesse = groesse + 0.25;
this.Font = new System.Drawing.Font("Code 128", (float)groesse, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
if (this.prahmen)
{
this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
}
else
{
this.BorderStyle = System.Windows.Forms.BorderStyle.None;
}
if (this.PoRotateAngle == 0)
{
this.TextAlign = ContentAlignment.MiddleLeft;
this.Size = new System.Drawing.Size(this.pwidth, this.pheight);
base.OnPaint(e);
}
if (this.PoRotateAngle == 90)
{
this.TextAlign = ContentAlignment.MiddleLeft;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(this.PoRotateAngle);
g.TranslateTransform(0, -this.pheight);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pheight, this.pwidth);
base.OnPaint(e);
}
if (this.PoRotateAngle == 180)
{
this.TextAlign = ContentAlignment.MiddleCenter;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(this.PoRotateAngle);
g.TranslateTransform(-this.pwidth, -this.pheight);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pwidth, this.pheight);
base.OnPaint(e);
}
if (this.PoRotateAngle == 270)
{
this.TextAlign = ContentAlignment.MiddleCenter;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(-90);
g.TranslateTransform(-this.pwidth, 0);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pheight, this.pwidth);
base.OnPaint(e);
}
this.Text = NewText;
}
}
}
Hallo,
direkt läßt sich aus dem Code nicht entnehmen, warum es zu diesem Verhalten kommt.
Generell ist aber die OnPaint-Methode falsch implementiert: in dieser sollten nur reine Zeichenmethoden aufgerufen werden, keine Änderungen von Eigenschaften o.ä. (denn diese rufen intern wiederum weitere Ereignisse auf).
Packe also alle logischen Abfragen und Zuweisungen in die Setter der entsprechenden Eigenschaften (denn dafür sind diese da).
Also u.a. Font-Zuweisung in den Konstruktor, BorderStyle in die Eigenschaft PoRahmen, ...
hmmm ich hab das zum test einfach auskommentiert.
hat aber nicht wirklich was gebracht....
auch die geschichte das es bei 0 grad ja funktioniert spricht da dagegen das die parameter setzen schuld sind.
also ich denk eher das hier irgendwas falsch läuft
if (this.PoRotateAngle == 90)
{
this.TextAlign = ContentAlignment.MiddleLeft;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(this.PoRotateAngle);
g.TranslateTransform(0, -this.pheight);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pheight, this.pwidth);
base.OnPaint(e);
}
Moin
so ich hab die funktionalität mal in nen kleines Test Projekt ausgelagert.
Funktion:
Mit Button erstellen wird ein Label auf einem Panel erstellt.
Der Button Drehen dreht diese Objekte um 90 Grad.
Mit der Linken Maustaste auf die Objekte: Kann man die Objekte frei verschieben
Das Problem:
Die beiden Buttons Drehen und Erstellen haben Tooltips.
Diese funktionieren nur wenn die Objekte bei 0 Grad sind.
Sobald sie bei 90 / 180 / 270 Grad sind funktionieren die Tooltips nicht mehr.
Kann mir da jemand erklren wieso?
Mfg Kala
Ein Problem an deinem Code ist, dass das OnPaint() nach einem Klick auf "Drehen" ständig aufgerufen wird.
if (this.PoRotateAngle == 90)
{
...
this.Text = "";
...
}
this.Text = NewText;
Das bewirkt ein ständiges neu zeichnen! Quasi eine Endlosschleife.
Deswegen nochmal der Verweis auf die Antwort von Th69:
Hallo,
direkt läßt sich aus dem Code nicht entnehmen, warum es zu diesem Verhalten kommt.
Generell ist aber die OnPaint-Methode falsch implementiert: in dieser sollten nur reine Zeichenmethoden aufgerufen werden, keine Änderungen von Eigenschaften o.ä. (denn diese rufen intern wiederum weitere Ereignisse auf).
Packe also alle logischen Abfragen und Zuweisungen in die Setter der entsprechenden Eigenschaften (denn dafür sind diese da).
Also u.a. Font-Zuweisung in den Konstruktor, BorderStyle in die Eigenschaft PoRahmen, ...
EDIT sagt noch: warum setzt du die Text
-Property überhaupt jedes Mal neu? Die TextAlign
-Property ebenso, ändert sich doch sowieso nie...
@pille: an deiner antwort sieht man das du das projekt nicht einmal ausgeführt hast oder?
ist nicht böse gemeint aber: ich schreib doch nicht quellcode in mein programm weil ich da grad lust zu hab ...
lass doch einfach mal das this.Text = ""; weg (auskommentieren) und führ die software aus.
wenn du mir dann noch erklärst wie ich den dann auftretenden text-kauderwelsch weg bekomme,
dann wäre mir geholfen.
und auch die geschichte mit den parametern alles schön und gut funktioniert aber zum einen und wenn ich es weg nehme ändert sich trotzdem nix an dem problem. und der textalign war mal dynamsch ist aber derzeit fix. hatte damit nur rumgespielt.
@pille: an deiner antwort sieht man das du das projekt nicht einmal ausgeführt hast oder?
Da muss ich dich enttäuschen, ich habe das Projekt runtergeladen, entpackt, geöffnet, gestartet und mir das Verhalten angeschaut. Danach habe ich einen Breakpoint im 90-if gesetzt und gesehen, dass der Debugger da nie mehr raus kommt. Alles, um dir zu helfen.
Dass du Code aus lauter Langeweile schreibst, habe ich zu keiner Zeit behauptet. Trotzdem löst eben das ständige Setzen des Textes deine Probleme aus.
Den Text-Kauderwelsch bekommst du übrigens weg, wenn du das base.OnPaint() weglässt - das führt ja die Standardzeichenaktion durch.
Kurz: this.Text = ...
und base.OnPaint(e);
auskommentieren und alles läuft wie gewünscht.
und auch die geschichte mit den parametern alles schön und gut funktioniert aber zum einen und wenn ich es weg nehme ändert sich trotzdem nix an dem problem. und der textalign war mal dynamsch ist aber derzeit fix. hatte damit nur rumgespielt.
Dazu noch kurz ein, zwei generelle Sätze.
Es mag sein, dass es am Verhalten nichts ändert. Trotzdem sollte man immer minimalistisch programmieren und nur das tun, was man wirklich benötigt. Das hilft u.a. dabei, a) den Überblick zu behalten und b) die Fehlerquelle einzugrenzen.
Das ist einfach ein Tipp und muss nicht gleich abgebügelt werden.
siehste die info mit dem base.OnPaint hat aber gefehlt 😃
kannst du mir erklären warum ich bei 0 grad das base.OnPaint drin lassen muss?
Wenn ich das raus nehme wird kein Text mehr angezeigt.
Da zeichnest du nicht selbst, logisch oder? 😉
siehste die info mit dem base.OnPaint hat aber gefehlt 🙂
Jein. Das war ja nur ein Folgeproblem. Dein Problem war das Verschwinden der Tooltips und daran war einfach das ständige Setzen des Textes Schuld. Unabhängig davon, ob man base.OnPaint auskommentiert oder nicht, ist es grundsätzlich falsch, die Text-Property im OnPaint zu verändern (vor allem wenn man es immer 2x macht).
Die Frage kannst du dir mit Logik alleine beantworten. =)
Prüfe dann mal bitte, ob die Ausgangsproblematik behoben ist.
ok ich habs so erstmal eingebaut und es geht.
aber ich hab noch ein kleines problem mit meinen Datamatrix - Objekt.
Hier wird in meinem Code in der On Paint folgendes gemacht:
if (this.PoRotateAngle == 0)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_0grad, width, height);
base.OnPaint(e);
}
if (this.PoRotateAngle == 90)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_90grad, width, height);
//base.OnPaint(e);
}
if (this.PoRotateAngle == 180)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_180grad, width, height);
base.OnPaint(e);
}
if (this.PoRotateAngle == 270)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_270grad, width, height);
//base.OnPaint(e);
}
Das Problem dabei: wenn ich da das OnPaint weg lasse, wird das Image nicht mehr angezeigt.
@pille: ja ist es 😃 davon bin ich auch ausgegangen, nur funktioniert das halt bei den DMAX objekten noch nicht
Hallo Kaladial,
ist das Problem "SaveFile Dialog - Frage zum Überschreiben einer exist. Datei kommt erst nach Druck der "Alt"-Taste " also hiermit gelöst?
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Tut mir leid, aber du hast gerade ein grundsätzliches Verständnisproblem.
Entweder du zeichnest selbst oder du nutzt die Standardzeichenfunktion (base.OnPaint).
Wenn beides fehlt, siehst du natürlich nichts.
Nichtsdestotrotz nochmal der Hinweis auf den Post von Th69. Das Setzen der Size und des Image gehört nicht in das OnPaint()!
Dann hier noch der Hinweis auf [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox), also am besten statt dem Label einfach ein Panel benutzen und selber dann das Bild und den Text zeichnen.
Hi,
der Fehler lässt sich mit Hilfe deines Projekts in der Tat reproduzieren bei mir - sobald du selbst mit dem Zeichnen anfängst.
Grundlegend:
Du zeichnest anders, wie das Label das per Default tut - merklich anders.
Tipp: Zeichne auch ohne Rotation selbst - dann sieht es zumindest einheitlich aus.
Des Weiteren:
Von Label abzuleiten bringt dir doch hier überhaupt gar nichts - das Label versaut dir aber komplett die Anzeige, weshalb du dauernd dieses .Text = "xyz"-Gefrickel machst - noch dazu im OnPaint - das löst ständig ein "Invalidate", damit ein neues "OnPaint" - und damit die Endlosschleife aus - was auch der Auslöser für dein seltsames Verhaltens ist, weshalb du Pille und die Anderen durchaus ernst nehmen solltest.
Nur mal als Beispiel eine etwas abgespeckte Version von dem was du vorhast.
Auch als Hilfe, dass man durchaus bequem "normal" zeichnen kann und danach das Image die Rotation durchführen lässt...
public class PrintObjectLabel2 : System.Windows.Forms.Control
{
private bool _enableBorder;
private int _rotationAngle;
private Color _borderColor;
public override string Text
{
get => base.Text;
set
{
var txt = value?.Replace("\\", "");
base.Text = txt;// base.Text will raise Invalidate automatically
}
}
public bool EnableBorder
{
get => _enableBorder;
set
{
_enableBorder = value;
Invalidate();
}
}
public Color BorderColor
{
get => _borderColor;
set
{
_borderColor = value;
if (EnableBorder)
Invalidate();
}
}
public int RotationAngle
{
get => _rotationAngle;
set
{
_rotationAngle = value;
Invalidate();
}
}
public PrintObjectLabel2()
{
EnableBorder = true;
}
public int PoUid { get; set; }
public string PoType { get; set; }
public string PoFont { get; set; }
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
var txt = e.Graphics.MeasureString(Text, this.Font);
using (var bmp = new Bitmap((int) txt.Width + 1, (int) txt.Height + 1))
{
using (var bmpGraphics = Graphics.FromImage(bmp))
{
if (EnableBorder)
{
using (var pen = new Pen(Color.Black))
{
bmpGraphics.DrawRectangle(pen, new Rectangle(0, 0, bmp.Width-1, bmp.Height-1));
}
}
bmpGraphics.DrawString(Text, Font, Brushes.Black, new RectangleF(0,0, bmp.Width, bmp.Height));
}
if (RotationAngle == 0)
{
bmp.RotateFlip(RotateFlipType.RotateNoneFlipNone);
}
else if (RotationAngle == 90)
{
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
}
else if (RotationAngle == 180)
{
bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);
}
else if (RotationAngle == 270)
{
bmp.RotateFlip(RotateFlipType.Rotate270FlipNone);
}
e.Graphics.DrawImageUnscaled(bmp, 0, 0);
}
}
}
LG
if (this.PoRotateAngle == 0)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_0grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1,1);
g.DrawImage(imageTmp, p);
}
if (this.PoRotateAngle == 90)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_90grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1, 1);
g.DrawImage(imageTmp, p);
}
if (this.PoRotateAngle == 180)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_180grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1, 1);
g.DrawImage(imageTmp, p);
}
if (this.PoRotateAngle == 270)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_270grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1, 1);
g.DrawImage(imageTmp, p);
}
so damit gehts.
und damit ist mein Problem auch gelöst.
Sowohl Alt Taste als auch Tooltip
thx