1

我什至不确定我是否正确执行此操作。但基本上我有一个由类/接口构建的对象列表。从那里,我将列表绑定到DataGridViewWindows 窗体 (C#) 上的

这里的列表是一个同步列表,它将自动更新 UI,在这种情况下DataGridView

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

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

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

现在IPersonInfo是对象的类型,需要在运行时为这个类型添加动态属性。

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);             
    }
}

你能帮忙吗?

4

1 回答 1

1

我想对你来说最好的方法是“模拟”这些属性。我想最好的方法是ITypedList实现,一个很好的例子是here

一旦我遇到类似的问题。就我而言,我采用了这种方法。这可能对你有帮助。

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

于 2012-12-03T08:22:24.600 回答