C#Winform中的动态自动更新(到UI、网格)绑定列表?

C#Winform中的动态自动更新(到UI、网格)绑定列表?,c#,data-binding,idynamicobject,C#,Data Binding,Idynamicobject,我甚至不确定我做的是否正确。但基本上我有一个由类/接口构建的对象列表。从那里,我将列表绑定到Windows窗体(C#)上的DataGridView 这里的列表是一个同步列表,它将自动更新UI,在本例中为DataGridView 现在一切正常,但现在我希望列表应该有一个动态对象,即默认情况下该对象将有两个静态属性(ID、名称),并且在运行时用户将选择其余属性。这些应该绑定到数据网格。列表上的任何更新都应自动反映在网格中 我知道,我们可以使用动态对象,但我想知道,如何找到解决方案 datagridv

我甚至不确定我做的是否正确。但基本上我有一个由类/接口构建的对象列表。从那里,我将列表绑定到Windows窗体(C#)上的
DataGridView

这里的列表是一个同步列表,它将自动更新UI,在本例中为
DataGridView

现在一切正常,但现在我希望列表应该有一个动态对象,即默认情况下该对象将有两个静态属性(ID、名称),并且在运行时用户将选择其余属性。这些应该绑定到数据网格。列表上的任何更新都应自动反映在网格中

我知道,我们可以使用动态对象,但我想知道,如何找到解决方案

datagridview.DataSource = myData;  // myData is AutoUpdateList<IPersonInfo> 

你能帮忙吗?

我想对你来说最好的方法是“模拟”属性。我想最好的方法是实现,最好的例子是

我曾经遇到过类似的问题。就我的情况而言,我采取了一种方法。这可能对你有帮助


此外,还有一种方法(它与任何“动态”无关)可以使基类具有要使用的完整属性集。但是,如果在运行之前没有所有属性,那么它将不起作用。

我想最好的方法是“模拟”属性。我想最好的方法是实现,最好的例子是

我曾经遇到过类似的问题。就我的情况而言,我采取了一种方法。这可能对你有帮助


此外,还有一种方法(它与任何“动态”无关)可以使基类具有要使用的完整属性集。但是,如果在运行时之前没有所有属性,它将无法工作。

我可以通过动态属性添加/删除属性。唯一值得关注的是,这些应该在状态网格中自动更新。您可以使用ITypedList方式。在实现之后,您只需在向集合添加新元素时传递新属性名。我所说的收集是指MasterRecordCollection实例,如本文中的示例所示。我昨天确实查过了。您只需在每次创建新属性时更新DataGridView的数据源。我的意思是,在更新数据源后,新列将自动添加。我可以通过动态属性添加/删除属性。唯一值得关注的是,这些应该在状态网格中自动更新。您可以使用ITypedList方式。在实现之后,您只需在向集合添加新元素时传递新属性名。我所说的收集是指MasterRecordCollection实例,如本文中的示例所示。我昨天确实查过了。您只需在每次创建新属性时更新DataGridView的数据源即可。我的意思是,在更新数据源后,将自动添加新列
public class AutoUpdateList<T> : BindingList<T>
{
    private ISynchronizeInvoke _SyncObject;
    private Action<ListChangedEventArgs> _FireEventAction;

    public AutoUpdateList()
        : this(null)
    {
    }

    public AutoUpdateList(ISynchronizeInvoke syncObject)
    {
        _SyncObject = syncObject;
        _FireEventAction = FireEvent;
    }

    protected override void OnListChanged(ListChangedEventArgs args)
    {
        try
        {
            if (_SyncObject == null)
            {
                FireEvent(args);
            }
            else
            {
                _SyncObject.Invoke(_FireEventAction, new object[] { args });
            }
        }
        catch (Exception)
        {
            // TODO: Log Here
        }
    }

    private void FireEvent(ListChangedEventArgs args)
    { 
        base.OnListChanged(args);             
    }
}