2017-09-28 5 views
1

Je suis bloqué avec trouver une solution pour ce scénario:Persister éléments dans la liste en C#

J'ai deux datagrids (DevExpress). Sur la grille de gauche, j'ai des valeurs de modèles (lignes). J'ai un bouton de déplacement entre deux grilles, qui sur l'événement de clic devrait effectuer déplacer l'article choisi de la grille de gauche à la grille de droite. Avant de copier cette valeur, il convient de vérifier que cette valeur existe peut-être déjà dans la grille de droite. Si fait: Afficher le message qu'il existe déjà, sinon, ajouter la valeur sélectionnée à la grille de droite.

Dans le code j'ai collections qui détiennent ces valeurs:

private void btnMove_Click(object sender, EventArgs e) 
{ 
    ClosingStockTemplateModel _mClosingStockTemplateModel = (ClosingStockTemplateModel)gridViewAvailableTemplates.GetRow(gridViewAvailableTemplates.FocusedRowHandle); 
    ClosingStockTemplateModel currentTemplateRow = new ClosingStockTemplateModel(); 
    ModelCollection<ClosingStockTemplateModel> currentTemplateList = new ModelCollection<ClosingStockTemplateModel>(); 

    for (var i = 0; i < currentTemplateList.Items.Count; i++) 
    { 
     currentTemplateRow = (ClosingStockTemplateModel)gridViewTemplatesToPrint.GetRow(i); 
     currentTemplateList.Items.Add(currentTemplateRow); 
    } 

    if (currentTemplateList.Items.Contains(_mClosingStockTemplateModel)) 
    { 
     MessageBox.Show("Item has already been selected."); 
     return; 
    } 
    else 
    { 
     currentTemplateList.Items.Add(_mClosingStockTemplateModel); 
     grdTemplatesToPrint.DataSource = null; 
     grdTemplatesToPrint.DataSource = currentTemplateList.Items.OrderBy(i => i.TEMPLATE); 
    } 
} 

gridViewAvailableTemplates - est grille côté gauche. gridViewTemplatesToPrint - est la grille du côté droit.

Ce que je fais dans ce code est:

  1. Obtenez ligne sélectionnée dans la grille gauche:
  2. Créer nouvelle collection où je vais ajouter tous les éléments de la grille à droite (je vais utiliser plus tard pour comparer et vérifier ce que j'ai déjà sélectionné).
  3. Ajoutez des éléments à la collection temporaire en faisant une boucle sur les lignes de la grille droite. Le paramètre currentTemplateList contient la valeur sélectionnée.
  4. Si oui, affichez le message, sinon ajoutez-le à la grille de droite en définissant DataSource à currentTemplateList.Items.

Le problème se produit ici:

ModelCollection<ClosingStockTemplateModel> currentTemplateList = new ModelCollection<ClosingStockTemplateModel>(); 

que je dois faire et instance de ModelCollection, mais chaque fois que je clique sur le bouton liste Déplacer s'instancié et il est effacé. J'ai donc essayé quelque chose comme ceci:

ModelCollection<ClosingStockTemplateModel> currentTemplateList; 
if(gridViewTemplatesToPrint.RowCount == 0) 
{ 
    currentTemplateList = new ModelCollection<ClosingStockTemplateModel>(); 
} 
else 
{ 
    for (var i = 0; i < currentTemplateList.Items.Count; i++) 
    { 
     currentTemplateRow = (ClosingStockTemplateModel)gridViewTemplatesToPrint.GetRow(i); 
     currentTemplateList.Items.Add(currentTemplateRow); 
    } 
} 

seulement pour faire une instance propre de currentTemplateList lorsque le bouton de déplacement est cliqué pour la première fois et la grille de droite est encore vide, mais je problème avec currentTemplateList étant inconnu variable locale dans else partie. Existe-t-il un moyen propre de résoudre ce problème? Parce que avec ce code, les nouveaux éléments ne sont pas ajoutés à la grille côté droit, ils sont nettoyés à chaque fois et sur le côté droit, je n'ai que le dernier élément déplacé. J'ai besoin de trouver un moyen de conserver les éléments déjà sélectionnés dans la collection lorsque la grille n'était pas vide.

+4

Utilisez MVVM et faites-le dans le viewmodel. –

Répondre

0

Declare champ suivant au niveau de la classe et la rendre statique .... et initialiser où vous avez besoin ...

> ModelCollection<ClosingStockTemplateModel> currentTemplateList = new 
> ModelCollection<ClosingStockTemplateModel>(); 
0

Vous ne devez pas définir le DataSource chaque fois . Définissez le DataSource à vos collections une seule fois, puis utilisez uniquement les listes ou les collections pour ajouter ou supprimer des éléments. Voici un exemple simple (2 de la grille et 2 de Bouton)

private List<ClosingStockTemplateModel> moTemplatesToPrintList; 
private List<ClosingStockTemplateModel> moAvailableTemplates; 

public Form4() 
{ 
    InitializeComponent(); 

    this.moAvailableTemplates= new List<ClosingStockTemplateModel>() 
    { 
     new ClosingStockTemplateModel() {ID = 1, TEMPLATE ="Template 1" }, 
     new ClosingStockTemplateModel() {ID = 2, TEMPLATE ="Template 2" }, 
     new ClosingStockTemplateModel() {ID = 3, TEMPLATE ="Template 3" }, 
     new ClosingStockTemplateModel() {ID = 4, TEMPLATE ="Template 4" }, 
    }; 

    this.moTemplatesToPrintList = new List<ClosingStockTemplateModel>(); 

    this.grdAvailableTemplates.DataSource = this.moAvailableTemplates; 
    this.grdTemplatesToPrint.DataSource = this.moTemplatesToPrintList; 
} 

private void cmdAdd_Click(object sender, EventArgs e) 
{ 
    var loGridViewAvailableTemplates = (this.grdAvailableTemplates.MainView as GridView); 
    ClosingStockTemplateModel loClosingStockTemplateModel = loGridViewAvailableTemplates.GetRow(loGridViewAvailableTemplates.FocusedRowHandle) as ClosingStockTemplateModel; 

    if (loClosingStockTemplateModel != null && 
     !this.moTemplatesToPrintList.Any(item => item.ID == loClosingStockTemplateModel.ID)) 
    { 
     this.moTemplatesToPrintList.Add(loClosingStockTemplateModel); 
     this.moAvailableTemplates.Remove(loClosingStockTemplateModel); 
    } 
    this.grdAvailableTemplates.RefreshDataSource(); 
    this.grdTemplatesToPrint.RefreshDataSource(); 
} 

private void cmdRemove_Click(object sender, EventArgs e) 
{ 
    var loGridViewTemplatesToPrint = (this.grdTemplatesToPrint.MainView as GridView); 
    ClosingStockTemplateModel loClosingStockTemplateModel = loGridViewTemplatesToPrint.GetRow(loGridViewTemplatesToPrint.FocusedRowHandle) as ClosingStockTemplateModel; 

    if (loClosingStockTemplateModel != null && 
     !this.moAvailableTemplates.Any(item => item.ID == loClosingStockTemplateModel.ID)) 
    { 
     this.moAvailableTemplates.Add(loClosingStockTemplateModel); 
     this.moTemplatesToPrintList.Remove(loClosingStockTemplateModel); 
    } 
    this.grdAvailableTemplates.RefreshDataSource(); 
    this.grdTemplatesToPrint.RefreshDataSource(); 
} 

public class ClosingStockTemplateModel 
{ 
    public int ID { get; set; } 
    public string TEMPLATE { get; set; } 
} 

Si vous utilisez BindingList générique au lieu d'un List vous pouvez supprimer l'appel RefreshDataSource.