2017-07-25 12 views
0

Ich habe versucht, die ausgewählten Zeilen in Datagridview zu aktualisieren, aber das Ergebnis ist seltsam, es ist immer eine Zeile oder eine andere fehlt. Das Problem ist, wenn ich btnSettled Knopf, um das abgerechnete Datum zu setzen, klicken Sie dann auf btnUpdate, um die Datenbank zu aktualisieren, scheint das Ergebnis in Ordnung, aber nach dem Klicken auf btnRefresh, um den DGV zu aktualisieren, gibt es immer eine fehlende Zeile. Ist das das Problem bei UpdateCommand oder foreach loop? Bitte helfen Sie mir, dieses Problem zu lösen. Vielen Dank.Aktualisierung Datagridview Ausgewählte Zeilen

vor btnSettle klicken before click btnSettled

nach klicken btnSettled und btnUpdate after click btnSettled and btnUpdate

nach btnRefresh klicken after click btnRefresh

Mein Code wie folgt:

DataTable dtTrx = new DataTable(); 
SqlDataAdapter daTrx = new SqlDataAdapter(); 
DataSet dsTrx = new DataSet(); 

    public Form1() 
    { 
     InitializeComponent(); 
     getData(); 
    } 

    private void getData() 
    { 
     string strConn = "Data Source=.\\xpw;Initial Catalog=MyStock;Integrated Security=True;"; 
     SqlConnection conn = new SqlConnection(strConn); 
     conn.Open(); 

     string sqlTrx = "SELECT TrxID, TrxDate,Ticker,Qty,Price,Type,AccID, SettledDate,BrokerUserID FROM Trx"; 

     daTrx = new SqlDataAdapter(sqlTrx, conn); 
     SqlCommandBuilder cbTrx = new SqlCommandBuilder(daTrx); 
     daTrx.Fill(dsTrx, "trx"); 

     conn.Close(); 

     dtTrx = dsTrx.Tables["trx"]; 
     dgvTrx.DataSource = dtTrx; 
    } 

    private void btnUpdate_Click(object sender, EventArgs e) 
    { 
     daTrx.Update(dsTrx, "trx"); 
    } 

    private void btnRefresh_Click(object sender, EventArgs e) 
    { 
     dsTrx.Clear(); 
     daTrx.Fill(dsTrx, "trx"); 
    } 

    private void btnSettled_Click(object sender, EventArgs e) 
    { 
     foreach (DataGridViewCell c in dgvTrx.SelectedCells) 
     { 
      dgvTrx[7, c.RowIndex].Value = "2017/7/23"; 
     } 
    } 
+0

Hinweis: Wenn ich SettledDate manuell auf DGV, dann klicken Sie auf Aktualisieren und Aktualisieren bearbeiten, ist das Ergebnis in Ordnung ist. – xpw

+1

Es wäre wie 'foreach (DataGridViewRow r in dgvTrx.SelectedRows) zur Schleife besser' dann den Wert anwenden, indem 'r.Cells mit [ "SettledDate"] Value = "2017.07.23";.' –

+0

Die getData () sollte nach der foreach-Schleife ausgelöst werden, um die Gridview so zu aktualisieren, um zu sprechen – Taco2

Antwort

1

Vor allem Sie muss mit parametrisierten SQL-Abfragen beginnen.

Zweitens sehe ich nicht ein Problem mit Ihrem Code, aber Sie versuchen, diese:

private void btnSettled_Click(object sender, EventArgs e) 
{ 
    foreach (DataGridViewRow r in dgvTrx.SelectedRows) 
    { 
     r.Cells["SettledDate"].Value = "2017/7/23"; //use the column name instead of column index 
    } 
    this.BindingContext[dgvTrx.DataSource].EndCurrentEdit(); 
    //the above line is added to improve the solution 
    //as per the link mentioned in the accepted answer 
} 

Der Grund hinter diesem Ansatz ist, dass jetzt, auch wenn Sie die Spaltenposition ändern, werden Sie nicht haben neu schreiben den Code, um die Änderungen entsprechen

Wie Sie SelectedCells verwenden, damit es sei denn, Sie die Maus über zum letzten Cell gezogen wird, wird es nicht in der SelectedCell Sammlung

Hinweis hinzugefügt werden: in r.Cells["SettledDate"].Value nahm ich an der Spaltenname ist SettledDate

+0

Ja, Ihr Weg ist eleganter, um den Code zu pflegen. aber leider ist das Ergebnis das gleiche - eine Zeile fehlt. Vielen Dank. – xpw

+0

Es tut mir leid, das zu hören, aber ich habe jetzt mein Code-Snippet getestet und arbeitet für mich. Wie auch immer, lemme deinen Code nochmal an –

+0

Die ausgewählten Zeilen sind alle hervorgehoben, ich denke es zeigt deutlich an, welche Zeilen ausgewählt sind. – xpw

0

Schließlich ich die Lösung gefunden:

Programmingly udpating selected rows misses the last one in dgv.DataSource.GetChanges()?

Es braucht nur bis Ende bearbeiten die letzte Zeile nach foreach-Schleife:

this.BindingContext[dgvTrx.DataSource].EndCurrentEdit();  

Dank wieder zu @Nobody.

+0

Großartig Sie haben die Lösung gefunden! Ich habe auch meine Lösung aktualisiert, um die Änderungen zu markieren.Auch dank dir habe ich heute etwas gelernt;] –

Verwandte Themen