2011-03-16 4 views
0

J'utilise objectlistview (olv) pour afficher des ensembles d'attributs enfants dépendant d'une fiche. c'est une application C# qui utilise linq. je n'utilise pas olv comme éditeur de ligne; au lieu de cela, j'ouvre l'enregistrement enfant sous-jacent dans une boîte de dialogue dynamique, plus détaillée, non-wpf. Si l'aspect du modèle d'une colonne olv repose sur des objets (ie, des clés étrangères), l'affichage olv ne s'actualise pas.C# objectlistview model udpate non dessiné

par exemple,

un écran olv contient un journal des statuts, et une colonne est « Status.Code » qui se rapporte à l'objet « Log » comme ceci: « Log.Status ». parce que c'est linq, "Log.StatusId" existe aussi dans le linq DataContext (mais n'est pas configuré pour s'afficher dans le olv). "Log.StatusId" renvoie correctement à partir de la boîte de dialogue d'édition et "Log.Status" se remplit correctement immédiatement après la fin de la boîte de dialogue d'édition. aussi, linq enregistre les modifications correctement.

J'ai essayé et j'ai échoué avec Invalidate() et olidList() d'olv et quelques jours de hoodoo. C'est un olv ordinaire - pas un quicklistview ou un datalistview. toute perspective accueillie.

Le code ci-dessous souligne la gestion des clés étrangères. Pour les utilisateurs non-olv, olv est configuré comme la plupart des autres contrôles de formulaire Windows.

... 
object old = DataService.Clone<object>(olv.SelectedObject); 
    // where old ~ reference base for changes to olv object - for state management and linq 
object row = olv.SelectedObject; 
    // where row ~ object that receives edits and undergoes updates via linq 
Dictionary<string, object> rowState = new Dictionary<string, object>(); 
    // where ~ rowState<fieldName,originalValue> 
RecordDetail dlg = new RecordDetail(GetUser(), master.GetType(), row, rowState); 
    // where ~ GetUser() & master.GetType() configure form RecordDetail 
DialogResult dr = dlg.ShowDialog(); 
if (dr == DialogResult.OK) 
{ 
    if (row != null && rowState != null && rowState.Count > 0) 
    { 
     int id = DataService.GetPrimaryKeyValue(row); 
     if (id > 0) /// if not new 
     { 
      int pk = DataService.GetPrimaryKeyValue(old); 
      MultiState state = getChildState(olv); // olv.Tag contains state 
      foreach (KeyValuePair<string, object> change in rowState) 
      { 
       MethodInfo mi = old.GetType().GetMethod(DataService.LINQ_GET + change.Key); 
       object newValue = mi.Invoke(row, null); 
       bool ok = DataService.ManageMultiStateUpdate(ref state, pk, change.Key, newValue, change.Value, old); 
       /// INFO populate fk objects for olv // <== works ok 
       Type tdomain = DataService.GetForeignKeyTypeAsAliasSafe(old.GetType(), change.Key); 
       if (tdomain != null) 
       { 
        object fko = GetForeignKey(tdomain, change.Value); 
        mi = row.GetType().GetMethod(DataService.LINQ_SET + change.Key.Replace(DataService.LI_ID, "")); 
        object[] args = { fko }; 
        mi.Invoke(row, args); 
       } 
       ... 
      } 
      olv.BuildList(); // <== both this and olv.Invalidate() fail to display foreign key updates 
      ... 
     } 
     ... 
    } 
    ... 
} 
... 

Répondre

0

AddObjects instead of AddObject ne fonctionnait pas. november 2008 fixes n'a également pas remédié. ma seule solution actuelle consiste à effacer et à rajouter une liste éditée d'objets originaux avec une valeur d'ID de hack pour les ajouts. tout lien/état de source de données est sans importance puisque les enregistrements sont des objets linq dissociés. Yay.

Questions connexes