2010-04-08 3 views
0

C'est un problème bizarre, alors je vais essayer de décrire le mieux possible. J'ai un DataGridView qui montre une liste de contrats et de divers éléments d'information à leur sujet. Il existe trois modes d'affichage: Approbation de contrat, Pré-Production et Production. Chaque mode a son propre ensemble de colonnes qui doivent être affichées.Les colonnes du tableau de données deviennent irrecevables après la modification de la source de données

Ce que j'ai fait, c'est que j'ai trois boutons radio pour chaque style de contrat. tous le feu leur contrôle a changé cette fonction

private void rbContracts_CheckedChanged(object sender, EventArgs e) 
{ 
    dgvContracts.Columns.Clear(); 
    if (((RadioButton)sender).Checked == true) 
    { 
     if (sender == rbPreProduction) 
     { 
      dgvContracts.Columns.AddRange(searchSettings.GetPreProductionColumns()); 
      this.contractsBindingSource.DataMember = "Preproduction"; 
      this.preproductionTableAdapter.Fill(this.searchDialogDataSet.Preproduction); 
     } 
     else if (sender == rbProduction) 
     { 
      dgvContracts.Columns.AddRange(searchSettings.GetProductionColumns()); 
      this.contractsBindingSource.DataMember = "Production"; 
      this.productionTableAdapter.Fill(this.searchDialogDataSet.Production); 

     } 
     else if (sender == rbContracts) 
     { 
      dgvContracts.Columns.AddRange(searchSettings.GetContractsColumns()); 
      this.contractsBindingSource.DataMember = "Contracts"; 
      this.contractsTableAdapter.Fill(this.searchDialogDataSet.Contracts); 
     } 
    } 
} 

Voici la fonction GetxxxColumns

public DataGridViewColumn[] GetPreProductionColumns() 
{ 
    this.dgvTxtPreAccount.Visible = DgvTxtPreAccountVisable; 
    this.dgvTxtPreImpromedAccNum.Visible = DgvTxtPreImpromedAccNumVisable; 
    this.dgvTxtPreCreateDate.Visible = DgvTxtPreCreateDateVisable; 
    this.dgvTxtPreCurrentSoftware.Visible = DgvTxtPreCurrentSoftwareVisable; 
    this.dgvTxtPreConversionRequired.Visible = DgvTxtPreConversionRequiredVisable; 
    this.dgvTxtPreConversionLevel.Visible = DgvTxtPreConversionLevelVisable; 
    this.dgvTxtPreProgrammer.Visible = DgvTxtPreProgrammerVisable; 
    this.dgvCbxPreEdge.Visible = DgvCbxPreEdgeVisable; 
    this.dgvCbxPreEducationRequired.Visible = DgvCbxPreEducationRequiredVisable; 
    this.dgvTxtPreTargetMonth.Visible = DgvTxtPreTargetMonthVisable; 
    this.dgvCbxPreEdgeDatesDate.Visible = DgvCbxPreEdgeDatesDateVisable; 
    this.dgvTxtPreStartDate.Visible = DgvTxtPreStartDateVisable; 
    this.dgvTxtPreUserName.Visible = DgvTxtPreUserNameVisable; 
    this.dgvCbxPreProductionId.Visible = DgvCbxPreProductionIdVisable; 
    return new System.Windows.Forms.DataGridViewColumn[] { 
               this.dgvTxtPreAccount, 
               this.dgvTxtPreImpromedAccNum, 
               this.dgvTxtPreCreateDate, 
               this.dgvTxtPreCurrentSoftware, 
               this.dgvTxtPreConversionRequired, 
               this.dgvTxtPreConversionLevel, 
               this.dgvTxtPreProgrammer, 
               this.dgvCbxPreEdge, 
               this.dgvCbxPreEducationRequired, 
               this.dgvTxtPreTargetMonth, 
               this.dgvCbxPreEdgeDatesDate, 
               this.dgvTxtPreStartDate, 
               this.dgvTxtPreUserName, 
               this.dgvCbxPreProductionId, 
               this.dgvTxtCmnHold, 
               this.dgvTxtCmnConcern, 
               this.dgvTxtCmnAccuracyStatus, 
               this.dgvTxtCmnEconomicStatus, 
               this.dgvTxtCmnSoftwareStatus, 
               this.dgvTxtCmnServiceStatus, 
               this.dgvTxtCmnHardwareStatus, 
               this.dgvTxtCmnAncillaryStatus, 
               this.dgvTxtCmnFlowStatus, 
               this.dgvTxtCmnImpromedAccountNum, 
               this.dgvTxtCmnOpportunityId}; 
} 
public DataGridViewColumn[] GetProductionColumns() 
{ 
    this.dgvcTxtProAccount.Visible = DgvTxtProAccountVisable; 
    this.dgvTxtProImpromedAccNum.Visible = DgvTxtProImpromedAccNumVisable; 
    this.dgvTxtProCreateDate.Visible = DgvTxtProCreateDateVisable; 
    this.dgvTxtProConvRequired.Visible = DgvTxtProConvRequiredVisable; 
    this.dgvTxtProEdgeRequired.Visible = DgvTxtProEdgeRequiredVisable; 
    this.dgvTxtProStartDate.Visible = DgvTxtProStartDateVisable; 
    this.dgvTxtProHardwareRequired.Visible = DgvTxtProHardwareReqiredVisable; 
    this.dgvTxtProStandardDate.Visible = DgvTxtProStandardDateVisable; 
    this.dgvTxtProSystemScheduleDate.Visible = DgvTxtProSystemScheduleDateVisable; 
    this.dgvTxtProHwSystemCompleteDate.Visible = DgvTxtProHwSystemCompleteDateVisable; 
    this.dgvTxtProHardwareTechnician.Visible = DgvTxtProHardwareTechnicianVisable; 
    return new System.Windows.Forms.DataGridViewColumn[] { 
            this.dgvcTxtProAccount, 
            this.dgvTxtProImpromedAccNum, 
            this.dgvTxtProCreateDate, 
            this.dgvTxtProConvRequired, 
            this.dgvTxtProEdgeRequired, 
            this.dgvTxtProStartDate, 
            this.dgvTxtProHardwareRequired, 
            this.dgvTxtProStandardDate, 
            this.dgvTxtProSystemScheduleDate, 
            this.dgvTxtProHwSystemCompleteDate, 
            this.dgvTxtProHardwareTechnician, 
            this.dgvTxtCmnHold, 
            this.dgvTxtCmnConcern, 
            this.dgvTxtCmnAccuracyStatus, 
            this.dgvTxtCmnEconomicStatus, 
            this.dgvTxtCmnSoftwareStatus, 
            this.dgvTxtCmnServiceStatus, 
            this.dgvTxtCmnHardwareStatus, 
            this.dgvTxtCmnAncillaryStatus, 
            this.dgvTxtCmnFlowStatus, 
            this.dgvTxtCmnImpromedAccountNum, 
            this.dgvTxtCmnOpportunityId}; 
} 
public DataGridViewColumn[] GetContractsColumns() 
{ 
    this.dgvTxtConAccount.Visible = this.DgvTxtConAccountVisable; 
    this.dgvTxtConAccuracyStatus.Visible = this.DgvTxtConAccuracyStatusVisable; 
    this.dgvTxtConCreateDate.Visible = this.DgvTxtConCreateDateVisable; 
    this.dgvTxtConEconomicStatus.Visible = this.DgvTxtConEconomicStatusVisable; 
    this.dgvTxtConHardwareStatus.Visible = this.DgvTxtConHardwareStatusVisable; 
    this.dgvTxtConImpromedAccNum.Visible = this.DgvTxtConImpromedAccNumVisable; 
    this.dgvTxtConServiceStatus.Visible = this.DgvTxtConServiceStatusVisable; 
    this.dgvTxtConSoftwareStatus.Visible = this.DgvTxtConSoftwareStatusVisable; 
    this.dgvCbxConPreProductionId.Visible = this.DgvCbxConPreProductionIdVisable; 
    this.dgvCbxConProductionId.Visible = this.DgvCbxConProductionVisable; 
    return new System.Windows.Forms.DataGridViewColumn[] { 
            this.dgvTxtConAccount, 
            this.dgvTxtConImpromedAccNum, 
            this.dgvTxtConCreateDate, 
            this.dgvTxtConAccuracyStatus, 
            this.dgvTxtConEconomicStatus, 
            this.dgvTxtConSoftwareStatus, 
            this.dgvTxtConServiceStatus, 
            this.dgvTxtConHardwareStatus, 
            this.dgvCbxConPreProductionId, 
            this.dgvCbxConProductionId, 
            this.dgvTxtCmnHold, 
            this.dgvTxtCmnConcern, 
            this.dgvTxtCmnAccuracyStatus, 
            this.dgvTxtCmnEconomicStatus, 
            this.dgvTxtCmnSoftwareStatus, 
            this.dgvTxtCmnServiceStatus, 
            this.dgvTxtCmnHardwareStatus, 
            this.dgvTxtCmnAncillaryStatus, 
            this.dgvTxtCmnFlowStatus, 
            this.dgvTxtCmnImpromedAccountNum, 
            this.dgvTxtCmnOpportunityId}; 
} 

La question est quand je vérifie un bouton la première fois, tout apparaît ok. Je choisis une autre vue, tout va bien. Mais quand je clique sur la première vue, les colonnes sont en désordre (c'est comme si elles étaient dans l'ordre inverse mais ce n'est pas exactement la même chose). Cela n'arrive qu'à la première page sur laquelle vous cliquez, les deux autres sont bien. Vous pouvez désactiver et cliquer de nouveau sur autant de fois que vous le souhaitez après ces étapes initiales. La première liste que vous avez sélectionnée au début sera hors service, les deux autres seront correctes.

Des idées sur ce qui pourrait causer cela?

EDIT-- choses que j'ai trouvé à ce jour: ColumnDisplayIndexChanged incendies beaucoup de fois (plus de 200 fois) quand je visionne la première sélection une seconde fois. si la fonction ne fait rien, elle charge la page, si je mets une boîte de dialogue pour la montrer (il y a eu beaucoup de clics), soit je reçois un gros X rouge dans la zone de vue de la grille de données, soit ça se charge la page, je reçois un X pour la pré-production mais les deux autres charges bien (la boîte de message apparaît encore des centaines de fois) quand vous les sélectionnez d'abord)

+0

Avez-vous essayé de relier le GridView lorsque vous revenez à sa vue? –

+0

Ajout de 'this.contractsBindingSource.ResetBindings (true);' en tant que dernière ligne de la logique modifiée et vérifiée et elle se comporte toujours de la même manière. –

+2

Si vous avez la possibilité de déboguer, vérifiez si vous pouvez inspecter les valeurs DisplayIndex des colonnes pour voir si elles ont changé. Si elles ont changé pour une raison quelconque, alors vous aurez une idée de ce qu'il faut rechercher. Peut-être ajouter un gestionnaire d'événement pour l'événement 'ColumnDisplayIndexChanged' avec un BP pour piéger l'occurance. – galford13x

Répondre

0

Je pris la voie facile. Je viens de créer 3 DataGridView et de les définir en fonction du bouton radio.

0

Ma meilleure estimation est que this.XXX.Fill change la valeur DisplayIndex si la modification se produit après que la fonction de création de plage de colonnes est retournée. Il y a quelques choses que vous pourriez considérer cependant.

  1. Créez la plage de colonnes une fois plutôt qu'à chaque fois qu'une vue différente est sélectionnée.
  2. La mémoire est-elle un problème? Si les jeux de données ne sont pas volumineux et ne devraient pas être volumineux à l'avenir, vous pouvez remplir 3 conteneurs séparés et changer la liaison en un conteneur différent plutôt que de recharger un seul conteneur à chaque fois.

Je pense que je créerais au moins les plages de colonnes une seule fois plutôt qu'à chaque fois.

Modifier

private DataGridViewColumns[] PreProducitonColumns {get;set;} 
private DataGridViewColumns[] ProductionColumns {get;set;} 
private DataGridViewColumns[] ContractsColumns {get;set;} 

private void Form_Load() 
{ 
    this.PreProducitonColumns = searchSettings.GetPreProductionColumns(); 
    this.ProductionColumns = searchSettings.GetProductionColumns(); 
    this.ContractsColumns = searchSettings.GetContractsColumns(); 
} 

private void rbContracts_CheckedChanged(object sender, EventArgs e) 
{ 
    dgvContracts.Columns.Clear(); 
    if (((RadioButton)sender).Checked == true) 
    { 
     if (sender == rbPreProduction) 
     { 
      dgvContracts.Columns.AddRange(PreProducitonColumns); 
      this.contractsBindingSource.DataMember = "Preproduction"; 
      this.preproductionTableAdapter.Fill(this.searchDialogDataSet.Preproduction); 
     } 
     else if (sender == rbProduction) 
     { 
      dgvContracts.Columns.AddRange(ProductionColumns); 
      this.contractsBindingSource.DataMember = "Production"; 
      this.productionTableAdapter.Fill(this.searchDialogDataSet.Production); 

     } 
     else if (sender == rbContracts) 
     { 
      dgvContracts.Columns.AddRange(ContractsColumns); 
      this.contractsBindingSource.DataMember = "Contracts"; 
      this.contractsTableAdapter.Fill(this.searchDialogDataSet.Contracts); 
     } 
    } 
} 
+0

Utilisation de intelliTrace I peut voir que Fill n'a pas encore été appelé, l'indice a changé d'événement lors de l'appel 'dgvContracts.Columns.AddRange()' –

+0

Comment créer les colonnes une fois et les modifier dans la vue Grille de données? –

+0

Je modifierai ma réponse pour afficher la création des colonnes une seule fois – galford13x

Questions connexes