2010-08-06 5 views
0

J'ai un dataTable lié à un DatagrindView et je souhaite mettre à jour une colonne sélectionnée. Mon DataTable(displayDT) et mon datagridview1 ont la même mise en page:Problème de performances lors de la mise à jour d'un DataTable lié à un Datagridview

DateTime     item1   item2   item3 
1/1/2010     100    100    100 
1/1/2010 1:00    120    110    90 

.

J'ai 1440 enregistrements. Je permets à l'utilisateur de mettre à jour les données par colonne sélectionnée d'un montant ... afin qu'ils puissent sélectionner item1 et ajouter un montant à la valeur de chaque enregistrement. Voici mon code que j'utilise pour lancer la mise à jour:

Dans ma charge de l'écran:

dataGridView1.DataSource = displayDT; 
bindingSourceDG.DataSource = displayDT; 

Voici mon code qui mettra à jour la colonne sélectionnée avec une valeur inputed.

private void btnUpdateColumns_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     //user will key in a value that they would like 
     //the column to be increased/decreased by 
     double iValue = double.Parse(txtValue.Text); 

     this.Cursor = Cursors.WaitCursor; 

     //here I am trying to stop the datagridview 
     //from syncing up with the datatable after each record changes.  
     bindingSourceDG.RaiseListChangedEvents = false; 

     bindingSourceDG.SuspendBinding(); 

     //I created a list of columns the user would like 
     //to update by the amount they typed in. 
     List<int> colIndexList = new List<int>(dataGridView1.Columns.Count); 

     foreach (DataGridViewColumn col in dataGridView1.SelectedColumns) 
     { 
      colIndexList.Add(col.Index); 
     } 

     // here is my work around to get this process to work faster.... 
     //with this line of code(the filter) the DataTable will 
     //update in a second... 
     //without it takes much longer and this is what I 
     //do not understand...???? 
     //Why does it update so fast with the filter. 
     //With the filter applied the 1440 record go down 
     //to 24 records. So try a test with and without this line of code. 

     displayDT.DefaultView.RowFilter = 
      "1 = 1 AND DateTime = '" + iModelStartDate + "'"; 

     //I loop through all the rows in the displayDT and 
     //for each column selected I add the value keyed in by the user. 

     foreach (DataRow dr in displayDT.AsEnumerable()) 
     { 
      for (int counter = 0; counter < colIndexList.Count; counter++) 
      { 
       dr[colIndexList[counter]] = 
        (double)dr[colIndexList[counter]] + iValue; 
      } 
     } 

     // I clear the filter. 
     //But you would not need this if running without the "work around" 
     displayDT.DefaultView.RowFilter = ""; 

     dataGridView1.CurrentCell = null; 

     bindingSourceDG.RaiseListChangedEvents = true; 
     bindingSourceDG.ResetBindings(false); 

     dataGridView1.Refresh(); 
    } 
    catch 
    { 
     MessageBox.Show("Please enter numeric value.", "Enter Numeric"); 
    } 

    this.Cursor = Cursors.Default; 

} 

Répondre

0

Eh bien, pour répondre à la question (je pense ... il est un peu difficile à suivre), la raison pour laquelle le filtre rend les choses plus rapidement est parce qu'il diminue le nombre de dossiers traités. Comme vous l'avez dit:

Avec le filtre appliqué le dossier 1440 aller jusqu'à 24 dossiers

Donc, avec le filtre, il ne va que plus de 24 enregistrements au lieu de l'ensemble 1440.

EDIT

Je suppose que cela a à voir avec votre utilisation de AsEnumerable(). Généralement, il est utilisé avec le filtrage de type LINQ. J'oserais deviner que le réglage du filtre avant la main accélère l'interation. Je testerais cette hypothèse, mais je n'aurai pas le temps jusqu'à plus tard aujourd'hui.

+0

Il met à jour tous les 1440 enregistrements .... – Lenny

+0

Voici une question pour vous. Y at-il une raison particulière pour laquelle vous faites displayDT.AsEnumerable() au lieu de displayDT.Rows? –

+0

aucune raison autre que cela est la façon dont je l'avais vu fait. Je suis nouveau à C# cette année encore en train d'apprendre. Donc, basé sur la question, je suppose que displayDT.Rows est une meilleure méthode. – Lenny

Questions connexes