Form wir mehrfach geöffent



  • Vermutlich ein einfaches Problem, aber ich verstehe es nicht 😞

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                    if (e.RowIndex != -1)
                    {
                        // Prüfen auf Spaltenname.
                        string headerText = dataGridView1.Columns[e.ColumnIndex].HeaderText;
    
                        if (headerText.Equals("Anzeigen"))
                        {
                            // 1 = Kunde.
                            if (dataGridView1["art", e.RowIndex].Value.ToString() == "1")
                            {
                                F_Kunde kunde = new F_Kunde(newUser, Convert.ToInt32(dataGridView1["Id", e.RowIndex].Value));
                                kunde.Show();
    			    // this.Close();
                            }
                            // 2 = Lieferant.
                            if (dataGridView1["art", e.RowIndex].Value.ToString() == "2")
                            {
                                F_Lieferant lieferant = new F_Lieferant(newUser, Convert.ToInt32(dataGridView1["Id", e.RowIndex].Value));
                                lieferant.Show();
                                //this.Close();
                            }                     
                        }
                    }
            }
    

    Soweit lässt sich der Code ausführen, allerdings werden dann in der Task-Leiste mehrere Fenster geöffnet. Weshalb? Dies passiert mir nur bei diesem Zugriff auf andere Forms.

    Und sobald ich this.Close() einkommentiere, erhalte ich eine ArgumentOutOfRangeException. Weshalb das?



  • Dann debugge doch deinen Code (der übrigens ein bißchen besser sein könnte, wenn du doppelte Berechnungen nur einmalig durchführen würdest, d.h. in Variablen ablegen).



  • Danke für die Info bezüglich der Variablen! Diese muss ich dann innerhalb der

    dataGridView1_CellClick
    

    Funktion anlegen, oder wie macht man das "ordentlich"?

    Mit dem Debugger habe ich es schon versucht. Nach dem Öffnen der anderen Form wird erneut die Zeile

    if (e.RowIndex != -1)
    

    aufgerufen. Und wenn natürlich mit

    this.Close()
    

    die Form nicht mehr da ist, kommt der Fehler. Nur verstehe ich nicht, weshalb? Bei anderen Zugriffen auf diese Art habe ich nie ein Problem - weder mit mehrfach geöffneten Forms noch mit dem Schließen einer Form 😕



  • magma schrieb:

    Danke für die Info bezüglich der Variablen! Diese muss ich dann innerhalb der

    dataGridView1_CellClick
    

    Funktion anlegen, oder wie macht man das "ordentlich"?

    Ja, das ist schon mal richtig! Am besten Variablen so weit innen wie möglich definieren, also in deinem Fall könntest du z. B. für

    Convert.ToInt32(dataGridView1["Id", e.RowIndex].Value)
    

    innerhalb des Blocks

    if (headerText.Equals("Anzeigen"))
    {
        // hier
    }
    

    eine Variable anlegen.

    magma schrieb:

    Mit dem Debugger habe ich es schon versucht. Nach dem Öffnen der anderen Form wird erneut die Zeile

    if (e.RowIndex != -1)
    

    aufgerufen. Und wenn natürlich mit

    this.Close()
    

    die Form nicht mehr da ist, kommt der Fehler. Nur verstehe ich nicht, weshalb? Bei anderen Zugriffen auf diese Art habe ich nie ein Problem - weder mit mehrfach geöffneten Forms noch mit dem Schließen einer Form 😕

    Kann es sein, dass du in deine Zelle einen Doppelklick machst? Anders kann ich mir nicht erklären, dass der Handler für Click zweimal aufgerufen wird.

    Noch zwei kleine Anmerkungen:

    Mir ist aufgefallen, dass du das:

    if (dataGridView1["art", e.RowIndex].Value.ToString() == "2")
    

    als "else if" definieren kannst, weil es nicht "2" sein kann, wenn es schon "1" ist. Oder du nimmst switch/case.

    Außerdem könntest du den Wert (dataGridView1["art", e.RowIndex].Value.ToString()) in eine Variable speichern, damit es nicht mehrfach vom DataGridView ermittelt werden muss.



  • Danke für die Tipps Helfer!!! Hab gerade relativ frisch überhaupt mit dem Programmieren angefangen, da bin ich für solche Hinweise wirklich dankbar!

    In der Zelle mache ich leider keinen Doppelklick. Ich habe im DataGridView eine DataGridViewButtonColumn eingefügt.

    DataGridViewButtonColumn bnCol = new DataGridViewButtonColumn();
                bnCol.Text = "Anzeigen";
                bnCol.Name = "Anzeigen";
                bnCol.UseColumnTextForButtonValue = true;
                this.dataGridView1.Columns.Add(bnCol);
    

    Den EventHandler habe ich über die grafische Oberfläche beim Ereignis "Maus" - CellClick angelegt. Das ist auch die Funktion, die beim Click aufgerufen wird.



  • Kannst du mal den Code jeder .cs-Datei hier rein packen? Ich hab bei mir ein leeres DataGridView angelegt, deinen Code für den Button und einen CellClick-Handler eingefügt und bei mir wird der Handler nur einmal ausgeführt.



  • So, ich hoffe, der Code sieht nicht zu schlimm aus 😞

    Noch kurz zur Erklärung.
    Es ist eine Form mit einem TabControl. Auf einer TabPage befindet sich die Adressen-Übersicht in einer DataGridView. Doppelklick auf einen Eintrag dort zeigt eine andere TabPage an. Auf dieser gibt es ebenfalls eine DataGridView mit einem Button "Anzeigen". Beim klicken auf diesen Button kommt mein Problem ...

    public partial class Adressen : Form
        {      
            User newUser;      
    
            // Adressübersicht.
            DataView dvAdressuebersicht = new DataView();
    
            // ===========================================================================
    
            public Adressen(User newUser)
            {
                InitializeComponent();
                this.newUser = newUser;
    
                tabControlAdressen.TabPages.Clear();
                tabControlAdressen.TabPages.Add(tabPageUebersicht);
                FillGriAdressuebersicht();
            }
    
            #region Adressübersicht
            // Tab anzeigen.
            private void btnAddressOverview_Click(object sender, EventArgs e)
            {
                tabControlAdressen.TabPages.Clear();
                tabControlAdressen.TabPages.Add(tabPageUebersicht);
                FillGriAdressuebersicht();
            }
    
            // Grid mit Daten füllen.
            void FillGriAdressuebersicht()
            {
                tabControlAdressen.TabPages.Clear();
                tabControlAdressen.TabPages.Add(tabPageUebersicht);
    
                dgAdressuebersicht.DataSource = null;
                dgAdressuebersicht.Columns.Clear();
                dvAdressuebersicht = D_Queries.GetAlleStandorteUebersicht().DefaultView;
                dgAdressuebersicht.DataSource = dvAdressuebersicht;
                dgAdressuebersicht.ClearSelection();
                AddButton();
            }
            // Button zum bearbeiten einer Adresse für Übersicht hinzufügen.
            void AddButton()
            {
                DataGridViewButtonColumn bnCol = new DataGridViewButtonColumn();
                bnCol.Text = "Bearbeiten";
                bnCol.Name = "Bearbeiten";
                bnCol.UseColumnTextForButtonValue = true;
                this.dgAdressuebersicht.Columns.Insert(23, bnCol);
                dgAdressuebersicht.CellClick += new DataGridViewCellEventHandler(dgAdressuebersicht_CellClick);
            }
    
            // Auswahl eines Standorts zum Bearbeiten.
            private void dgAdressuebersicht_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                // Prüfen auf Spaltenname.
                string headerText = dgAdressuebersicht.Columns[e.ColumnIndex].HeaderText;
    
                if (headerText.Equals("Bearbeiten"))
                {
                   // ...
                }
            }
    
            #endregion
    
            #region Adresse bearbeiten.
            // Tab zum Bearbeiten anzeigen.
            private void ShowEditTab(int iLocationId)
            {
                tabControlAdressen.TabPages.Clear();
                tabControlAdressen.TabPages.Add(tabPageEditAddress);
    
                AdresseBearbeiten(iLocationId);
            }
    
            void AdresseBearbeiten(int iLocationId)
            {
               // ...
            }
    
            #endregion
    
            #region Adressstamm
            // Ansprechpartner zu Standort hinzufügen
            // Möglichkeit zum Schreiben eines Briefs hinzufügen
    
            private void dgAdressuebersicht_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex != -1)
                {
                    int platzId = Convert.ToInt32(dgAdressuebersicht["id", e.RowIndex].Value);
                    AdressdatenAbrufen(D_Queries.GetDatenZuStandort(platzId));
    				AdressstammArt(platzId);
                    tabControlAdressen.TabPages.Clear();
                    tabControlAdressen.TabPages.Add(tabPageAdressstamm);
    				SetupGridAdressstammKundennr();
                }
            }
    
            // Adressdaten zum Standort abrufen und anzeigen.
            void AdressdatenAbrufen(IEnumerable<Adresse> lstAdressdaten)
            {
                foreach (var item in lstAdressdaten)
                {
                    tbAdressstammAdressNr.Text = item.platzId.ToString();
                    tbAdressstammFax.Text = item.Fax;
                    tbAdressstammOrt.Text = item.Ort;
                    tbAdressstammMail.Text = item.Email;
                    tbAdressstammPLZ.Text = item.PLZ;
                    tbAdressstammPostfach.Text = item.Postfach;
                    tbAdressstammSprache.Text = item.Sprache;
                    tbAdressstammName.Text = item.Name;
                    tbAdressstammStrasse.Text = item.Strasse;
                    tbAdressstammTel.Text = item.Tel;
                    tbAdressstammWebseite.Text = item.Web;
                    tbAdressstammSprache.Text = item.Sprache;
                }
            }
    
            // Infos zum Standort.
            void AdressstammArt(int platzId)
            {
                dgAdressstammKundennr.DataSource = null;
                dgAdressstammKundennr.Columns.Clear();
                DataView dv = new DataView();
                dv = D_Queries.ArtDesStandort(platzId).DefaultView;
                dgAdressstammKundennr.DataSource = dv;
            }
    
    		  void SetupGridAdressstammKundennr()
            {
                DataGridViewButtonColumn bnCol = new DataGridViewButtonColumn();
                bnCol.Text = "Anzeigen";
                bnCol.Name = "Anzeigen";
                bnCol.UseColumnTextForButtonValue = true;
                this.dgAdressstammKundennr.Columns.Add(bnCol);
            }
    
            private void dgAdressstammKundennr_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                try
                {
                    if (e.RowIndex != -1)
                    {
                        // Prüfen auf Spaltenname.
                        string headerText = dgAdressstammKundennr.Columns[e.ColumnIndex].HeaderText;
    
                        if (headerText.Equals("Anzeigen"))
                        {
                            string artId = dgAdressstammKundennr["art", e.RowIndex].Value.ToString();
                            int platzId = Convert.ToInt32(dgAdressstammKundennr["id", e.RowIndex].Value);
    
                            // 1 = Kunde.
                            if (artId == "1")
                            {
                                F_Kunde kunde = new F_Kundenstamm(newUser, platzId);
                                kunde.Show();
                                this.Close();
                            }
                            // 2 = Lieferant.
                            else if (artId == "2")
                            {
                                F_Lieferant lieferant = new F_Lieferantenstamm(newUser, platzId);
                                lieferant.Show();
                                this.Close();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            #endregion
    
        }
    




  • Kannst du mal dein komplettes Projekt hochladen? Es fehlt hier z. B. die Implementierung der InitializeComponent() und ich kann mir anhand des Codes immer noch nicht erklären, wieso der Click-Handler doppelt ausgeführt wird.


Anmelden zum Antworten