2017-02-08 9 views
0

Frage für Sie:C# Aktualisierung der Datenbanktabelle mit Datagridview

ich Visual Studio 2015 bin mit einer Windows-Forms-Anwendung zu machen. Das Ziel besteht darin, eine einfache Tabelle in einer Netezza-Datenbank mit einem Data Grid Viewer-Steuerelement bearbeiten zu können.

Ich legte das Datenraster-Viewer-Steuerelement auf mein Formular, erstellte eine Datenquelle, die auf die Tabelle verweist, und zeigte dann die Datenrasteransicht auf diese Tabelle. Es funktioniert gut, wenn ich es ausführe und die 10 oder so Reihen von Daten tadellos anzeigt.

Gibt es eine einfache Möglichkeit, die Daten von der Datagridview zu aktualisieren? Ich sehe, es gibt Bearbeitungs/Sperr-Optionen, aber selbst mit allen von ihnen richtig eingestellt, wenn ich einen Wert in der Zelle des Rasters bearbeiten und drücken Sie die Eingabetaste, es geht nicht zurück und aktualisieren Sie die Datenbank. Muss ich das manuell codieren? Ich war mir nicht sicher, ob das Raster eine Möglichkeit hat, es automatisch zu machen. Im Code überprüfte ich alle Methoden für den Tableadapter und fand kein .Update oder ähnliches.

einige Ratschläge würden sehr geschätzt werden. Vielen Dank!

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace SBTForceClose 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 
    private void LoadGrid() 
    { 
     dataGridView1.DataSource = dataSet1.LKP_SBT_FORCE_CLOSE; 
     dataGridView1.Refresh(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     LoadGrid(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // TODO: This line of code loads data into the 'dataSet1.LKP_SBT_FORCE_CLOSE' table. You can move, or remove it, as needed. 
     this.lKP_SBT_FORCE_CLOSETableAdapter.Fill(this.dataSet1.LKP_SBT_FORCE_CLOSE); 

    } 

    private DataRow LastDataRow = null; 

    private void UpdateRowToDatabase() 
    { 
     if (LastDataRow != null) 
     { 
      if (LastDataRow.RowState == DataRowState.Modified) 
      { 
       this.lKP_SBT_FORCE_CLOSETableAdapter.Update(this.LastDataRow); 
      } 
     } 

    } 

    private void lKPSBTFORCECLOSEBindingSource_PositionChanged(object sender, EventArgs e) 
    { 
     BindingSource thisBindingSource = (BindingSource)sender; 
     DataRow ThisDataRow = ((DataRowView)thisBindingSource.Current).Row; 
     if (ThisDataRow == LastDataRow) 
     { 
      throw new ApplicationException(); 
     } 
     UpdateRowToDatabase(); 
     LastDataRow = ThisDataRow; 
    } 
} 
} 

Antwort

1

Es gibt keine integrierte Lösung, um das zu lösen, was Sie erreichen möchten. Und Sie müssen mehrere Codezeilen schreiben, damit es funktioniert. Hier ist ein Link, der Sie entlang des gesamten Prozesses fahren:

https://www.codeproject.com/Articles/12846/Auto-Saving-DataGridView-Rows-to-a-SQL-Server-Data

Wie dem auch sei, IMHO werde ich nicht in die Datenbank gehen empfehlen, wenn der Benutzer einen Wert auf dem Datagridview ändert, da es einen Aufruf an das machen Datenbank immer dann, wenn der Benutzer etwas ändert und sich durch das Steuerelement bewegt. Dies ist vielleicht kein Problem in einer kleinen Anwendung, aber wenn Ihre Anwendung wächst, möchte ich diese Dinge unter Kontrolle haben. Ich finde einen besseren Ansatz mit einer SAVE-Schaltfläche oder dem Auslösen eines Ereignisses, wenn der Eingabeprozess beendet ist und meine Datenbank an dieser Instanz arbeitet.

+0

So helfen, folgte ich diese Anleitung und Es werden keine Fehler ausgelöst, die Datenbank wird jedoch nicht aktualisiert. Ich habe gerade meinen Beitrag aktualisiert, um meinen Code für das Formular zu haben. Ich setze Haltepunkte durch und wenn ich eine Zelle im Datagridviewer bearbeite geht es zur upgedatedaterowtodatabase Methode aber es aktualisiert die Tabelle nicht. Mache ich etwas falsch? Es sieht so aus, als würde alles gut funktionieren, aber es wird den verdammten Tisch nicht aktualisieren! so frustrierend! – user3494110

0

auch der beste Weg ist ein buttun

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); 
      conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\BD\RepertoireDrapor.accdb"; 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "UPDATE Contact SET VAL1 = @VAL1, VAL2 = @VALE2 WHERE VAL3 = @VAL3"; 
      cmd.Parameters.AddWithValue("@VAL1", VAL1); 
      cmd.Parameters.AddWithValue("@VAL2", VAL2); 
      cmd.Parameters.AddWithValue("@VAL3", VAL3); 
      cmd.Connection = conn; 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 

zu erstellen und auf Ihrem Datagridview Sie erholen Werte wie

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 

     dataGridView1.RowsDefaultCellStyle.SelectionBackColor = Color.Red; 
     rowselect = e.RowIndex; 
     VAL3 = dataGridView1.Rows[rowselect].Cells[0].Value.ToString(); 
     VAL1 = dataGridView1.Rows[rowselect].Cells[1].Value.ToString(); 
     VAL2= dataGridView1.Rows[rowselect].Cells[2].Value.ToString(); 

    } 

Hoffnung wird seine Sie

Verwandte Themen