Laden...

ShowDialog soll nur letzte Form einfrieren

Letzter Beitrag vor einem Jahr 6 Posts 582 Views
ShowDialog soll nur letzte Form einfrieren

Moin,

ich möchte gerne mit mehreren Fenstern arbeiten, aber bei dem Öffnen eines Dialogs nicht alle Fenster einfrieren.
Gibt es eine Möglichkeit das vereinfacht zu realisieren ohne aufwendiges Programmieren mit Show() ?

Es gibt modale und nicht modale Dialoge.

Letztere ist das was Du willst. Sie werden mit .Show() aufgerufen.

Ist allerdings wie Du schon gemerkt hast mehr Arbeit.

Fehler in WinForms (oder Feature?) : Wenn man mehrere nicht modale Dialoge öffnet kann man ja in allen Dialogen arbeiten. Wenn man nun aus einem dieser Dialoge einen modalen Dialog öffnet sind alle geöffneten Dialoge eingefroren, nicht nur der der den modalen Dialog geöffnet hat. Sehr nervig !

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Hatte ich mir schon gedacht.
Bisher habe ich diese Lösung, welche Parameter überträgt / Methoden auslöst beim beenden des Modalen Dialogs:


            FormDialog formDialog = new FormDialog();
            formDialog.FormClosed += (s, args) =>
            {
                if (formDialog.textBoxParameter != null)
                {
                    //FIRES ON CLOSE DIALOG
                    textBox1.AppendText("Dialog  " + formDialog.textBoxParameter.ToString() + Environment.NewLine);
                }
            };
            formDialog.Show();

Dialog Form:


public partial class FormDialog : Form
    {

        public string textBoxParameter { get; set; }

        public FormDialog()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBoxParameter = textBox1.Text;
            this.Close();
        }
    }

Einfrieren der auslösenden Form habe ich (ohne Beispielcode) mit einem UserControl gelöst,
das UserControl blockiert dann den Zugriff und ist zumdem noch mit this.Opacity = 0.5D;
und schwarzem Hintergrund versehen, um zu erkennen, wo ich gerade arbeite.

Wenn Du den modalen Dialog nachprogrammieren willst kannst Du auch das aufrufende Form auf "Enabled = false" setzen.


this.Enabled = false;

Grüße Bernd

PS.: Vielleicht sollte ich meine wenigen modalen Dialoge die ich noch benutze in nicht modal programmieren und die Modalität selber programmieren. Dann entfällt das lästige Einfrieren aller offenen Dialoge.

PPS.: Hab's gerade probiert, klappt echt gut ! Werde jetzt meine modalen Dialoge umprogrammieren und selber bauen.

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Hallo Bernd,

if (ctrl is Label) ((Label)ctrl).Enabled = false;

Die Abfrage und Typumwandlung ist komplett überflüssig, da Enabled ja eine Eigenschaft der Control-Klasse ist, also reicht.


foreach (Control ctrl in Controls)
{
  ctrl.Enabled = false;
}

Es reicht das gesamte Window auf "Enabled = false" zu setzen : this.Enabled = false.

Ich setze noch einige Parameter mehr und das muss dann teilweise pro Typ gemacht werden. Bei GroupBox und Panels wird dann rekursiv aufgerufen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3