DataSet aus DataGridView zurückliefern



  • Hallo Forum,
    ich habe eine SQL Datenbank mit ca. 20000 komplexen Datensätzen. Ich möchte diese anstatt in einem DataGridView mittels Textboxen bearbeiten. Ich habe eine Form (Nennen wir sie FormBearbeiten) in der ich die Textboxen habe,
    und eine Form (FormFund) die ein DataGridView beinhaltet. Letztere soll lediglich die zur Suche passenden Treffer in dem DataGridView auflisten und der Benutzer wählt den gesuchten Eintrag. Dann schliesst sich FormFund und FormBearbeiten greift mittels Property auf die ID der ausgewählten Zeile. Mit dieser Frage ich den Datensatz in der SQL Tabelle ab und fülle die Textboxen.

    Meine Frage: Ich finde es sehr unglücklich erneut eine Verbindung zur Datenbank aufbauen zu müssen. Kann ich nicht einfach ein DataSet mit dem entsprechenden Eintrag zurückliefern und die Textboxen daran binden? Was benötige ich dafür?
    Geht das mit dem TableAdapter?
    Ich möchte GUI und Code so gut wie möglich trennen.

    Mein Code:

    private void getData(String selectCommand)
            {
                try
                { 
                    dataAdapter = new SqlDataAdapter(selectCommand, Properties.Settings.Default.ConnectionString);
                    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
                    table = new DataTable();
                    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                    dataAdapter.Fill(table);
                    bindingSource1.DataSource = table;              
                }
                catch (SqlException)
                {
                   MessageBox.Show("SQL Exception");
                }
            }
    
    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
            {
                e.SuppressKeyPress = true;
    
                try
                {
                    DataRowView row = (DataRowView)dataGridView1.CurrentRow.DataBoundItem;
                    currentRow = int.Parse(row.Row["Id"].ToString());                
                }
                catch(Exception)
                {
                    ;
                }
    
            }
    


  • Hallo,

    du kannst die komplette DataRow an das zweite Formular übergeben und bindest auf dem Formular dann an die relevanten Spalten.



  • Hi, ich glaube das hatte ich bereits versucht. Ich werde es heute Abend noch einmal probieren. Danke für deinen Tipp.



  • Hi,
    mittels CurrentRow habe ich leider nur die Möglichkeit den Text zu übergeben:

    if(dr == DialogResult.OK)
    {
         //Ausgewählte Zeile an Steuerelemente übergeben
         rTBEan.Text = artFund.CurrentRow.Cells["EAN"].Value.ToString();
    }
    

    Das funktioniert zwar, nur muss ich die Zelle immer per Index oder Name ansprechen.

    Am liebsten wäre mir die Möglichkeit der Bindung. Könntest du mir vielleicht ein Beispiel nennen?



  • Hallo Forum,
    ich poste hiermit mal meinen bisherigen Code. Vielleicht hilft es ja jemandem. Wäre um Optimierungstipps dankbar!

    Habe in der ersten Form jetzt 2 RichTextBoxen die zunächst einmal die Vorkommnisse in der DB ausfiltern.

    //Verbindung zur DB aufbauen

    private void getData(String selectCommand)
            {
                try
                {
                    dataAdapter = new SqlDataAdapter(selectCommand, Properties.Settings.Default.ConnectionString);
                    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
                    table = new DataTable();
                    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                    dataAdapter.Fill(table);
                    bindingSource1.DataSource = table;                
                }
                catch (SqlException)
                {
                    MessageBox.Show("SQL Exception");
                }
            }
    

    //Eine Suche über die in den TextBoxen eingetragenen Werte

    void multiSuche()
            {
                String kommando = "SELECT * FROM Artikeldatenbank WHERE ";            
                String tmp;
    
                List<String> suche = new List<string>();
    
                if (rTBHersteller.Text.Length > 0)
                {
                    tmp = "Hersteller LIKE '" + rTBHersteller.Text + "%'";
                    suche.Add(tmp);                       
                }
                if(rtBArtikelbezeichnung.Text.Length > 0)
                {
                    tmp = "Artikel LIKE '" + rtBArtikelbezeichnung.Text + "%'";
                    suche.Add(tmp);              
                }
                for (int i = 0; i < suche.Count; i++)
                {
                    if (i == 0)
                    {
                        kommando = kommando + suche[i].ToString();
                    }
                    if (i > 0)
                    {
                        kommando = kommando + " AND " + suche[i].ToString();
                    }
                }            
                getData(kommando);            
            }
    

    //Suchstring generieren und Suche ausführen

    private void rTBHersteller_TextChanged(object sender, EventArgs e)
            {
                multiSuche();
            }
    

    //Suchstring generieren und Suche ausführen

    private void rtBArtikelbezeichnung_TextChanged(object sender, EventArgs e)
            {
                multiSuche();
    
            }
    

    //Die gefilterte Tabelle an die zweite Form übergeben (per Konstruktor)

    private void rTBHersteller_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    Kasse2016.ArtikelFund artFund = new Kasse2016.ArtikelFund(table);
                    DialogResult dr = artFund.ShowDialog();
    
                    if (dr == DialogResult.OK)
                    {                  
                        rTBEan.Text = artFund.CurrentRow.Cells["EAN"].Value.ToString();
                        rTBHersteller.Text = artFund.CurrentRow.Cells["Hersteller"].Value.ToString();
                        rtBArtikelbezeichnung.DataBindings.Add(new Binding("Text", artFund.CurrentRow.DataBoundItem, "Artikel"));
    
                    }
                }
            }
    

    //Form 2:
    //Konstruktor:

    public ArtikelFund(DataTable dt)
            {
                InitializeComponent();
                bindingSource1.DataSource = dt;
            }
    

    //Die Form enthält nur ein einziges DataGridView, welches im Vollbildmodus ausgeführt wird. Der Benutzer wählt mit "Enter" die gewünschte Row aus und Form2 gibt diese an Form 1 zurück.

    Jetzt stellt sich nur noch die Frage wie ich die TextBoxen fülle und anschließend die Änderungen zurückschreibe?

    rTBHersteller.Text = artFund.CurrentRow.Cells["Hersteller"].Value.ToString();
    

    Die Werte als Text einfügen, oder

    rtBArtikelbezeichnung.DataBindings.Add(new Binding("Text", artFund.CurrentRow.DataBoundItem, "Artikel"));
    

    eine Bindung?

    Bei der Bindung kann ich doch bestimmt eine Update Methode nutzen, oder?
    Bei der Textvariante würde ich die ID ermitteln und die Daten manuell speichern.

    Ist meine Vorgehensweise korrekt? Tipps für Verbesserungen? Ich möchte natürlich möglichst wenig "casten". Das scheint mir aber fast unmöglich, da die TextBoxen ja naturgemäß Text darstellen...


Log in to reply