Beantwortet .Show beim Laden einer Form abbrechen

  • Dienstag, 18. September 2012 06:02
     
      Enthält Code

    Hallo alle,

    ich öffne über ein Menüpunkt in meiner Anwendung eine Form, die im Load- Ereignis über eine SQL- Abfrage gefüllt wird. Nun kann es aber sein, dass die Abfrage eine leere Menge zurückgibt. Für diesen Fall soll das Laden (.Show) der Form abgebrochen werden. Wie lässt sich das realisieren?

    Die Methoden dazu:

    public partial class frmMain : Form { private void mnuDateiProjekt_Click(object sender, EventArgs e) { frmZSB ZSBAuswahl=new frmZSB(); ZSBAuswahl.evtFrmZSBClose+=new frmZSBCloseEventHandler(evtFrmZSBClose); ZSBAuswahl.Show(); //TODO Fehler im ZSBAuswahl_Load werden nicht ausgewertet } } public partial class frmZSB : Form { private void frmZSB_Load(object sender, EventArgs e) { string sql = ""; MySqlDataReader ds = null; sql = "SELECT dkwnum,name FROM artnum ORDER BY dkwnum;"; ds = MySqlDB.DatenLesen(sql); try { while (ds.Read()) { //ListBox mit Ergebnismenge füllen lboProjekt.Items.Add(ds["dkwnum"].ToString() + "\t" + ds["name"].ToString()); } ds.Close(); } catch (NullReferenceException) { MessageBox.Show("Tabelle ist leer", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { MySqlDB.SchließeVerbindung(); } } }


    Grüße

      Heiko

Alle Antworten

  • Dienstag, 18. September 2012 08:23
    Beantworter
     
     Beantwortet Enthält Code

    Hallo Heiko,

    wenn das Formular bereits geladen wird, so läuft die Prozedur nunmal durch und Du müsstest das Formular wieder schließen,
    was mindestens ein kurzes (störendes) Geflackere bedeutet.

    Deswegen wäre es hier sinnvoll die Daten zuerst zu lesen und wenn dabei nichts herauskommt,
    gar nicht erst das Formular zu erstellen. Verlagere das Laden in eine eigene Methode, angedeutet in etwa:

            public List<string> LadeDaten()
            {
    
                const string sql = "SELECT dkwnum,name FROM artnum ORDER BY dkwnum;";
    
                List<string> daten = new List<string>();
                try
                {
                    using (MySqlDataReader reader = MySqlDB.DatenLesen(sql))
                    {
                        while (reader.Read())
                        {
                            daten.Add(reader["dkwnum"].ToString() + "\t" + reader["name"].ToString());
                        }
                    }
                }
                finally
                {                
                    MySqlDB.SchließeVerbindung();
                }
                return daten;
            }

    Die so ermittelten Daten kannst Du vorher überprüfen - ist die Auflistung leer (Count = 0) öffnest Du das Formular erst gar nicht.
    Die Daten kannst Du über den Konstruktor oder über eine Eigenschaft dem Formular zuweisen, die Du wiederum über Datenbindung der lboProjekt zuweist.

            public void AnzeigeZSBAuswahl()
            {
                var daten = LadeDaten();
                if (daten.Count > 0)
                {
                    var ZSBAuswahl = new frmZSB();
    // eine öffentliche Eigenschaft in ZSBAuswahl ZSBAuswahl.Projekt = daten; ZSBAuswahl.evtFrmZSBClose += new frmZSBCloseEventHandler(evtFrmZSBClose); ZSBAuswahl.Show(); } else { MessageBox.Show("..."); } }

    Das Form_Load reduziert sich auf:

            // Eigenschaft für die Projekte
            public List<string> Projekte { get; set; }
    
            private void Form_Load(object sender, EventArgs e)
            {
                this.lboProjekte.DataSource = Projekte;
            }
    Gruß Elmar


  • Dienstag, 18. September 2012 12:17
     
     

    Hallo Elmar,

    funktioniert. Danke.

    Grüße

      Heiko