我目前正在使用自定义DataSource处理DataGridView-extentsion。如果我将列表绑定到两个正常的System.Windows.Forms.DataGridView并在dataGridView1中选择一个项目,dataGridView2也会自动设置该项目的位置。
如果我分配了一个BindingSource,我可以处理PositionChanged事件,但是Generic.List没有CurrencyManager,那么dataGridView2如何知道新的位置?
答案 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);
}
}
}
}