TextBox an DataGridView binden

exiter28

Erfahrenes Mitglied
Hallo,

ich möchte gerne eine TextBox an ein DataGridView binden.
Also daß der Inhalt einer Bestimmten Spalte des DataGridViews
in der TextBox angezeigt wird. Die Aktualisierungen sollten auch
von der TextBox an das DataGridView weitergegeben werden.

Hat hier jemand ein Beispiel für mich?

Danke!
 

Hale

Mitglied
Hallo exiter28,

wenn du deine TextBox an das DatagridView binden möchtest, musst du lediglich die Zelle im textbox-TextChanged-Event editieren.

Hier ist mal ein Beispiel mit der 3 Zelle der Spalte:

Code:
private void textBox1_TextChanged(object sender, EventArgs e)
{
       dataGridView1.Rows[0].Cells[2].Value = textBox1.Text;
}

Das ganze sieht dann wie folgt aus:

datagrid0.JPG

datagrid1.JPG

Grüße
Hale
 

exiter28

Erfahrenes Mitglied
Hallo Hale,

danke für die Antwort. Also das funktioniert soweit. Der Inhalt des DataGridView wird jetzt aktualisiert.
Nur wenn ich jetzt ein Update des DataAdapters durchführe, so wird der Wert nicht übernommen.
Wenn ich allerdings die Zelle des DataGridViews direkt anklicke und den Wert ändere und dann das Update mache, so wird der geänderte Wert auch in die DB übernommen, ich verstehe das nicht....
 

Hale

Mitglied
Hallo exiter28,

mit den DataAdapter kenne ich mich leider nicht so wirklich aus, da ich diesen nie benutze. Wenn du jedoch ein bisschen Quellcode bereit stellen könntest, kann ich eventuell daraus auslesen, warum dein gewünschtes Verhalten nicht eintritt.

Gruß
Hale
 

exiter28

Erfahrenes Mitglied
Also der Code für die Form wäre:

Code:
using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

namespace DataGridViewSaveTest
{
    public partial class Form1 : Form
    {
        private OleDbConnection connection;
        private OleDbDataAdapter dapersonen = null;
        private DataSet dspersonen = new DataSet();

        public Form1()
        {
            InitializeComponent();
            IniClass.CreateProgDirs();
            connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + IniClass.GetIniValue("btgbfrm"));
            dapersonen = new OleDbDataAdapter("select * from personen", connection);
            OleDbCommandBuilder cmdBldr = new OleDbCommandBuilder(dapersonen);
            cmdBldr.QuotePrefix = "[";
            cmdBldr.QuoteSuffix = "]";

            dapersonen .Fill(dspersonen, "personen");
            dataGridView1.DataSource = dspersonen;
            dataGridView1.DataMember = "personen";
            foreach (DataGridViewColumn item in dataGridView1.Columns)
            {
                item.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }
        }

        private void cbOK_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows[0].Cells[3].Value = textBox1.Text;
            dapersonen.Update(dspersonen, "personen");
        }

    }
}

Die Form besteht nur aus einem DataGridView mit einem Speicherbutton und einem TextFeld form.jpeg
Die Datenbank ist auch im Anhang....
 

Anhänge

  • btgbfrm.7z
    7,6 KB · Aufrufe: 36

exiter28

Erfahrenes Mitglied
im connection einfach nur den source-string anpassen auf den Speicherort der Datenbank....

Danke!
 

Hale

Mitglied
Hallo exiter28,

nach einigem rumgeteste habe ich festgestellt, dass wenn du die Zelle, über die Textbox, editierst, er nicht in den BeginEdit und EndEdit reinrennt, wodurch dein DataGridView denkt, dass nichts passiert ist.

Dies konnte ich, zwar nicht auf die schönste Art und Weise, jedoch lösen.

Code:
        private void cbOK_Click(object sender, EventArgs e)
        {
            dapersonen.Update(dspersonen, "personen");
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            dataGridView1.BeginEdit(true);
            dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[3].Value = textBox1.Text;
            dataGridView1.EndEdit();
            textBox1.Focus();
        }

Probier das einfach mal aus, bei mir hat das so funktioniert.
Zum Verständnis:

Zuerst sagst du dem DataGrid, dass du jetzt die Spalte editieren wirst, dann editiert du sie und sagst danach, dass sie nun fertig editiert ist. Dann musst du den Fokus wieder auf die TextBox setzen, weil er sonst in der ersten Zelle deines Datagrids ist und du bei mehereren Zeichen, welche du ggf. schreiben möchtest, die erste Zelle editierst. Mit dem "CurrentRow.Index" rufst du den Index der derzeit aktiven Spalte auf, was die Sache dynamischer macht.. gleiches ist auch mit der Zelle möglich.

Ich hoffe das hilft dir weiter

Grüße
Hale

P.S.: Vllt. kommst du ja auf einen besseren Lösungsansatz, jetzt nachdem du weißt, wo das Problem liegt ;)
 

exiter28

Erfahrenes Mitglied
Hallo Hale,

super! das funktioniert soweit. Mit Begin und EndEdit habe ich einige Versuche gemacht, doch leider klappte das auch nicht. Der Grund ist - wie Du beschrieben hast - der Focus zur TextBox, und auf dies
wäre ich sicher nicht gekommen.

Danke für Deine Hilfe******