modales Steuerelement

06/10/2008 - 14:02 von Attila Krick | Report spam
Hi NG,

ich möchte gerne die MessageBox nachbauen, jedoch als Control. Sinn soll es
sein das die Meldung und Buttons in einem Control z.B. Panel IN DER Form
angezeig wird.

Das Funktioniert soweit, nur mit der Modalitàt hapert es noch.

Ich rufen das MessageControl wie folgt in der Form auf:

if(MessageBoxPanel.ShowDialog(this.form, "Titel", "MSG",
MessageButtons.YesNo) == MessageButtons.Yes)


Im .ShowDialog wir das Panel der Form untergeschoben, die Controls auf der
Form deaktviert und wie folgt auf eingabe gewartet:

do
{
Application.DoEvents();
System.Threading.Thread.Sleep(50);
} while (buttonResult == DialogResult.None);

bis die .ShowDialog-Methode ein Result zurück gibt.

Leider ist das nicht Modal, sprich wenn der Benutzer sonstige Aktionen
durchführt wie KeyDown, oder das schließen der Form oder was weiß ich was
noch für Events angehàngt wurden werden diese trotzdem ausgeführt.

Wie kann ich das lösen, das sàmtliche Aktionen, ausgenommen meines Panels
im der Form außerkraft gesetzt werden solange DO...LOOP làuft?

Oder gibt es ein Möglichkeit alle angehàngten Event's der Form temp. zu
deaktvieren bzw. archivieren?

Grüße

Attila
 

Lesen sie die antworten

#1 Frank Dzaebel
06/10/2008 - 18:48 | Warnen spam
Hallo Attila,

ich möchte gerne die MessageBox nachbauen, jedoch als Control. Sinn
soll es sein das die Meldung und Buttons in einem Control z.B. Panel
IN DER Form angezeig wird.
Im .ShowDialog wir das Panel der Form untergeschoben, die Controls
auf der Form deaktviert und wie folgt auf eingabe gewartet:
[...] Leider ist das nicht Modal,



Warum denn nicht mit einer normalen Form,
die Du dann mit ShowDialog anzeigst, die
Du ja auch in einen Panel einpassen kannst?

Beispiel:

//==// MessageForm.cs:

Control owner;

public MessageForm() { InitializeComponent(); }

public MessageForm(Control owner) : this()
{
this.owner = owner;
InitializeComponent();
}

private void MessageForm_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;
this.Location = owner.Parent.PointToScreen(owner.Location);
}

private void btnOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}

//==
Aufruf dann etwa:
MessageForm mf = new MessageForm(panel1);
DialogResult result = mf.ShowDialog(panel1);
// ...

//
Hier brauchst Du gar nicht irgendwelche DoEvents()
o.à. stàndig ausführen.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen