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
...
}
...
}
...
}
...