一个DataSource用于多个控件

时间:2012-01-03 13:46:12

标签: c# winforms datasource

我的winforms应用程序中有两个ListBox,我为它们分配了一个数据源,如下所示:

private void MakeMeasurementUnits()
{
    var units = new List<MeasurementUnit>
                    {
                        new MeasurementUnit {Name = "Current", SiUnit = "A"},
                        new MeasurementUnit {Name = "Voltage", SiUnit = "V"},
                        new MeasurementUnit {Name = "Time", SiUnit = "s"},
                        new MeasurementUnit {Name = "Temprature", SiUnit = "°C"}
                    };

    lbxXunit.DataSource = units;
    lbxYunit.DataSource = units;
}

奇怪的是(或者可能是因为这是我的第一次!!),在我点击其中一个lisboxes的项目的形式中,第二个列表框中的相同项目也被选中。这是默认行为吗?怎么预防这个?如果这是默认行为,那对它有用吗?

我找到了快速补救措施来制作两个不同的数据源(与另一个名称相同)

4 个答案:

答案 0 :(得分:5)

列表框似乎缓存了绑定源。这是默认行为。如果您想避免这种情况,最简单的方法是创建列表的副本以绑定到第二个数据源:

lbxXunit.DataSource = units;
lbxYunit.DataSource = units.ToList();

当您拥有相同数据的多个视图并希望同步这些项目的选择时,这非常有用。

答案 1 :(得分:3)

是的,这是正常行为。这是因为ListView控件使用BindingSource对象来跟踪当前选定的项目。 (如果没有BindingSource,List无法跟踪所选项目。)

默认情况下,WinForms控件中的DataSource使用由WinForms系统本身为其创建的BindingSource。

您可以在以下位置阅读有关BindingSource的更多信息: http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx

这里有一篇文章可能也有帮助: http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/binding-multiple-comboboxes-to-the-same-datasource.aspx

答案 2 :(得分:2)

您注意到的行为是winforms控件的默认/正确行为。您可以通过为第二个列表框控件设置新的BindingContext而无需创建数据源副本来实现您的目标。

BindingContext

答案 3 :(得分:1)

这是正确的行为。 datasource中的WindowsForms管理跟踪控件中的所选项目,并操纵绑定数据。

您已经找到的解决方案:为这些控件分配2个不同的data sources objects