c#objectlistview模型更新未绘制
我使用(olv)显示依赖于主记录的子属性集。这是一款使用linq的c#应用程序。我不使用olv作为行编辑器;相反,我将底层子记录弹出到一个动态的、更详细的非wpf对话框中。如果olv列的模型特性依赖于对象(即外键),则olv显示不会刷新 比如说, olv显示包含一个状态日志,其中一列是“Status.Code”,它与对象“log”相关,如“log.Status”。因为它是linq,“Log.StatusId”也存在于linq数据上下文中(但未配置为在olv中显示)。“Log.StatusId”从编辑对话框正确返回,“Log.Status”在编辑对话框终止后立即正确填充。此外,linq还可以正确保存编辑 我尝试过olv的Invalidate()和BuildList()以及几天的hoodoo,但都失败了。这是一个普通的olv-不是rapidlistview或datalistview。欢迎任何观点 下面的代码强调了外键的处理。对于非olv用户,olv的配置与大多数其他windows窗体控件一样c#objectlistview模型更新未绘制,c#,objectlistview,C#,Objectlistview,我使用(olv)显示依赖于主记录的子属性集。这是一款使用linq的c#应用程序。我不使用olv作为行编辑器;相反,我将底层子记录弹出到一个动态的、更详细的非wpf对话框中。如果olv列的模型特性依赖于对象(即外键),则olv显示不会刷新 比如说, olv显示包含一个状态日志,其中一列是“Status.Code”,它与对象“log”相关,如“log.Status”。因为它是linq,“Log.StatusId”也存在于linq数据上下文中(但未配置为在olv中显示)。“Log.StatusId”从
...
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
...
}
...
}
...
}
...
。。。
object old=DataService.Clone(olv.SelectedObject);
//其中old~ olv对象更改的参考库-用于状态管理和linq
对象行=olv.SelectedObject;
//其中row~通过linq接收编辑并进行更新的对象
字典行状态=新建字典();
//罗维州在哪里
RecordDetail dlg=新的RecordDetail(GetUser(),master.GetType(),row,rowState);
//其中~GetUser()&master.GetType()配置表单RecordDetail
DialogResult dr=dlg.ShowDialog();
if(dr==DialogResult.OK)
{
如果(行!=null&&rowState!=null&&rowState.Count>0)
{
int id=DataService.GetPrimaryKeyValue(行);
如果(id>0)///如果不是新的
{
int pk=DataService.GetPrimaryKeyValue(旧);
多状态状态=getChildState(olv);//olv.Tag包含状态
foreach(rowState中的KeyValuePair更改)
{
MethodInfo mi=old.GetType().GetMethod(DataService.LINQ_GET+change.Key);
object newValue=mi.Invoke(行,空);
bool ok=DataService.managemultisteupdate(参考状态、主键、change.Key、newValue、change.Value、old);
///信息填充olv/的fk对象不起作用。也没有补救措施。我当前唯一的解决方案是清除并重新添加原始对象的编辑列表,并使用hack value id值进行添加。任何数据源绑定/状态都是无关的,因为记录都是未关联的linq对象。耶