Generic.List:如何为DataGridView设置/获取位置/ currentitem?

时间:2011-08-30 12:39:45

标签: c# winforms list bindingsource

我目前正在使用自定义DataSource处理DataGridView-extentsion。如果我将列表绑定到两个正常的System.Windows.Forms.DataGridView并在dataGridView1中选择一个项目,dataGridView2也会自动设置该项目的位置。

如果我分配了一个BindingSource,我可以处理PositionChanged事件,但是Generic.List没有CurrencyManager,那么dataGridView2如何知道新的位置?

2 个答案:

答案 0 :(得分:1)

您想从List中获取某些DataGridView(具有DataSource列表)的当前位置吗? 然后答案是:你做不到。该列表不知道连接视图 - 包含(当然)显示的元素

从DataGridView获取信息的替代方法: 订阅DataGridView的SelectionChanged事件并相应地设置第二个的索引 - 对于你应该能够使用CurrentCell - 属性

如果您不了解DataGridView的内容,则无法执行下面评论中所述的操作。 这是一个不同的设计 - 您可以实现自己的“ShowableList”或者其他东西,并尝试创建自己的DataGridView,显示ShowableList中指示的项目并在其中设置ShownIndex - 但您必须自己这样做。

答案 1 :(得分:1)

最后我找到了答案:BindingContext!

一个简单的例子:

public class ModifiedCollection : BindingSource {
    BindingSource Source {get;set;}
    BindingManagerBase bmb;
    Control Parent;

    public ModifiedCollection(object Source, Control Parent) {
        if ((this.Source = Source as BindingSource) == null) {
            this.Source = new BindingSource();
            this.Source.DataSource = Source;
        }

        this.Source.ListChanged += new ListChangedEventHandler(Source_ListChanged);


        this.Parent = Parent;
        this.Parent.BindingContextChanged += new EventHandler(Parent_BindingContextChanged);
    }

    void Parent_BindingContextChanged(object sender, EventArgs e) {
        if (bmb != null) {
            bmb.PositionChanged -= bmb_PositionChanged;
        }
        if (Parent.FindForm().BindingContext.Contains(this.Source.DataSource)) {
            bmb = Parent.BindingContext[this.Source.DataSource];
            if (bmb != null) {
                bmb.PositionChanged += new EventHandler(bmb_PositionChanged);
            }
        }
    }
}