Announcement

Collapse
No announcement yet.

DataGridView wird nicht aktualisiert

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataGridView wird nicht aktualisiert

    Hallo,

    ich habe ein DataGridView in einer WindowsForm , dass über eine BindingSource an eine Access-Tabelle gebunden ist. Nach einem Update der Access-Tabelle wird die BindingSource neu geladen, aber das DGV aktualisiert sich erst, wenn die Form neu geladen wird.

    Per Button wird die Access-tabelle aktualisiert (Was auch funktioniert). Nur das DGV aktualisiert sich nicht!

    Vielleicht kann mir Jemand einen Tipp geben! Die Access-Tabelle sollte dabei auch immer aktuell sein.

    [highlight=c#]
    public partial class frm_Meldungen : Form
    {
    private BindingSource m_BindingSource = new BindingSource();
    private OleDbDataAdapter m_DataAdapter = new OleDbDataAdapter();

    private void frm_Meldungen_Load(object sender, EventArgs e)
    {
    this.dgv_Meldungen.DataSource = this.m_BindingSource;
    GetData("SELECT Meldungstyp,Zeitstempel,Inhalt FROM app_meldungen WHERE Archiv = 0 ORDER BY Zeitstempel DESC");

    }

    private void GetData(string strSQL)
    {
    string connectionString = ReadConnectionSettings();
    this.m_DataAdapter = new OleDbDataAdapter(strSQL, connectionString);

    OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(this.m_DataAdapter);
    DataTable table = new DataTable();

    //Tabelle füllen
    this.m_DataAdapter.Fill(table);
    this.m_BindingSource.DataSource = table;

    this.txtAnzMeldungen.Text = this.dgv_Meldungen.Rows.Count.ToString() + " Meldungen";
    }

    /************************************************** ***********************************************
    * cmdAlleQuittieren_Click
    ************************************************** **********************************************/
    private void cmdAlleQuittieren_Click(object sender, EventArgs e)
    {
    DateTime Zeit = new DateTime();
    Zeit = DateTime.Now;
    string strSQL = "UPDATE app_Meldungen SET Archiv = 1, Quittung = '" + Zeit + "' WHERE Archiv = 0";
    cls_Datenbank.UpdateDBData(ref strSQL);
    // Tabelle neu laden
    GetData(this.m_DataAdapter.SelectCommand.CommandTe xt);
    }
    }


    [/highlight]
    Zuletzt editiert von Jürgen Thomas; 04.01.2010, 12:51. Reason: Doppelte Formatierung entfernt; bitte Vorschau benutzen, damit das auffällt!

  • #2
    Hallo und willkommen,

    füge mal nach dem Einlesen noch BindingSource.ResetBindings ein, das könnte das Problem lösen.

    Gruß Jürgen

    Comment


    • #3
      Ich habe noch
      m_BindingSource.ResetBindings(true);
      eingefügt!

      Das bringt leider nicht die erhoffte Wirkung! Ich habe es auch mit dgv.Invalidate() und dgv.Refresh() versucht.

      In einer anderen Form habe ich ein ähnliches DGV. Dort wird die BindingSource allerdings aus einem anderen Thread aktualisiert und da aktualisiert sich das DGV selbstständig sobald das BindingSource geändert wird.

      Comment


      • #4
        Hmm. Noch ein Vorschlag: Nimm eine feste DataTable, die in FormLoad erzeugt wird (ohne Spalten und ohne Inhalt) und sofort der BindingSource zugewiesen wird. Beim Einlesen wird zunächst table.Clear aufgerufen, dann füllt der DbDataAdapter immer dieselbe DataTable mit den aktuellen Daten, und die BindingSource sollte das als aktuelle Inhalte an das DGV weiterleiten.

        Dein Hinweis mit dem zweiten Formular: Dann kannst du doch Unterschiede im Vorgehen finden, oder?

        Gruß Jürgen

        Comment


        • #5
          Hallo Jürgen,

          vielen Dank für deine Tipps. Nein mit der festen Datatable ging es auch nicht. Das ganze ist, denke ich, ein Timing-Problem. Der OleDB-Adapter ist wohl nicht so schnell!

          Beim Debuggen funktionierte es nämlich. Ich kann das Füllen der Bindungssource mit einen Timer verzögern (500ms) und dann sehe ich sofort die Aktualisierung im DataGridView.

          Ist nicht gerade die saubere Art. Werde mir noch was anderes überlegen, aber erstmal funktioniert das so.

          Gruß baschtian

          Comment


          • #6
            So, habe es jetzt:

            in der cmdAlleQuittieren_Click-Funktion benutze ich nun keine externe Funktion mehr um die Access-Tabelle zu aktualisieren, sondern den DataAdapter.

            [highlight=c#]
            /************************************************** ***********************************************
            * cmdAlleQuittieren_Click
            ************************************************** **********************************************/
            private void cmdAlleQuittieren_Click(object sender, EventArgs e)
            {
            DateTime Zeit = new DateTime();
            Zeit = DateTime.Now;
            string strSQL = "UPDATE app_Meldungen SET Archiv = 1, Quittung = '" + Zeit + "' WHERE Archiv = 0";
            //cls_Datenbank.UpdateDBData(ref strSQL);
            string connectionString = ReadConnectionSettings();
            this.m_DataAdapter = new OleDbDataAdapter(strSQL, connectionString);
            OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(this.m_DataAdapter);
            GetData(this.m_DataAdapter.SelectCommand.CommandTe xt);
            }
            [/highlight]

            Comment

            Working...
            X