2017-07-25 3 views
0

J'ai essayé de mettre à jour des lignes sélectionnées dans DataGridView, mais le résultat est étrange, il manque toujours une ligne ou une autre. Le problème est lorsque je clique sur le bouton btnSettled pour définir la date fixée, puis sur btnUpdate pour mettre à jour la base de données, le résultat semble correct, mais après avoir cliqué sur btnRefresh pour actualiser la DGV, il y a toujours une ligne manquante. Est-ce le problème sur UpdateCommand ou foreach loop? S'il vous plaît aidez-moi à résoudre ce problème. Je vous remercie.Mise à jour des lignes sélectionnées DataGridView

avant le clic btnSettle before click btnSettled

Après avoir cliqué sur btnSettled et btnUpdate after click btnSettled and btnUpdate

Après avoir cliqué sur btnRefresh after click btnRefresh

Mon code comme suit:

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

Remarque: Si je modifie manuellement SettledDate sur DGV, puis cliquez sur Mettre à jour et actualiser, le résultat est correct. – xpw

+1

Il serait préférable de boucler comme 'foreach (DataGridViewRow r dans dgvTrx.SelectedRows)' puis d'appliquer la valeur en utilisant 'r.Cells [" SettledDate "]. Value =" 2017/7/23 ";' –

+0

Le getData () devrait être déclenché après la boucle foreach afin de mettre à jour le gridview afin de parler – Taco2

Répondre

1

d'abord tout ce que vous besoin de commencer à utiliser des requêtes SQL paramétrées.

Deuxièmement, je ne vois pas de problème avec votre code, mais vous essayez ceci:

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 
} 

La raison derrière cette approche est que maintenant, même si vous changez la position de la colonne, vous ne devrez pas récrire le code pour les changements

Comme vous utilisez SelectedCells, donc à moins que votre souris est déplacée vers le dernier Cell il ne sera pas ajouté dans la collection SelectedCell

note: en r.Cells["SettledDate"].Value Je pris le nom de la colonne est SettledDate

+0

oui, votre chemin est plus élégant pour maintenir le code. mais malheureusement, le résultat est le même - manquant une rangée. Je vous remercie. – xpw

+0

Je suis désolé d'avoir entendu cela, mais j'ai testé mon extrait de code maintenant et travaille pour moi. De toute façon, regardez à nouveau votre code –

+0

Les lignes sélectionnées sont toutes en surbrillance, je pense que cela indique clairement quelles lignes sont sélectionnées. – xpw

0

Enfin, je trouve la solution dans:

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

Il n'a besoin que de mettre fin à-éditer la dernière ligne après boucle foreach:

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

Merci encore à @Nobody.

+0

Génial, vous avez trouvé la solution! J'ai également mis à jour ma solution pour marquer les changements.Aussi grâce à vous, j'ai appris quelque chose aujourd'hui;] –