bar*_*zek 5 c# combobox winforms
我正在做简单的WinForms应用程序,我面临一些奇怪的问题.
我的表格:
它很简单:3个组合框和两个按钮 - 确定和取消.
视图:
private void applyOrderButton_Click(object sender, EventArgs e)
{
List<string> testList = new List<string>()
{
"A",
"B",
"C"
};
comboBox1st.DataSource = testList;
comboBox2nd.DataSource = testList;
comboBox3rd.DataSource = testList;
comboBox1st.SelectedIndex = 2;
comboBox2nd.SelectedIndex = 1;
comboBox3rd.SelectedIndex = 0;
//Presenter.DoTest();
}
Run Code Online (Sandbox Code Playgroud)
在校准方法之后会发生什么applyOrderButton_Click()(单击Ok按钮后会发生)我的所有组合框都会更改所选位置.但是,每个组合框都具有相同的选定索引 - 在这种特殊情况下,它将是"A".
然后我使用我的cursour更改了更改comboBox selectedIndex(例如我选择第三个comboBox来显示"C"),对所有三个组合框执行更改.我做错了什么?
ang*_*son 10
您正在运行WinForms背景中存在的称为"CurrencyManager"的内容.
它的工作是在引用相同数据源的所有可绑定控件之间同步"当前记录".
例如,如果您添加了一个标签并将其绑定到同一个列表,并将其绑定以使其显示其中一个对象的属性,则它将始终显示您在组合框中选择的同一对象的属性值.
这样做的一个好处是,您可以轻松添加一个表单来编辑对象列表,将文本框等绑定到其中一个对象的属性,并添加一个允许您移动到下一行或上一行的导航器.您不必手动确保所有文本框都引用正确的对象,CurrencyManager将为您完成所有这些操作.
但是,在您的情况下,由于您将相同的数据源绑定到所有三个组合框,因此CurrencyManager将确保所有三个选择同一行.如果在其中一个组合框中选择一个新行,则CurrencyManager将继续修复所有其他行以引用同一行.
您可以通过各种方式解决此问题:
您可以覆盖每个组合框的绑定上下文:
comboBox2nd.BindingContext = new BindingContext();
comboBox3rd.BindingContext = new BindingContext();
Run Code Online (Sandbox Code Playgroud)
请注意,如果您执行此路由,则需要在分配SelectedIndex或SelectedItem属性之前执行此操作,否则CurrencyManager将在您分配新的BindingContexts之前更新其他两个组合框.
您可以为每个组合框分配不同的数据源:
combobox2nd.DataSource = testList.ToList();
combobox3rd.DataSource = testList.ToList();
Run Code Online (Sandbox Code Playgroud)只需将新上下文分配给其他ComboBox就像这样:
List<string> testList = new List<string>()
{
"A",
"B",
"C"
};
comboBox1st.DataSource = testList;
comboBox2nd.BindingContext = new BindingContext();
comboBox2nd.DataSource = testList;
comboBox3rd.BindingContext = new BindingContext();
comboBox3rd.DataSource = testList;
comboBox1st.SelectedIndex = 2;
comboBox2nd.SelectedIndex = 1;
comboBox3rd.SelectedIndex = 0;
Run Code Online (Sandbox Code Playgroud)
CurrencyManager用于保持数据绑定控件彼此同步(显示来自同一记录的数据).CurrencyManager对象通过管理数据源提供的绑定数据的集合来完成此操作.对于与Windows窗体关联的每个数据源,该窗体至少维护一个CurrencyManager.由于可能有多个与表单关联的数据源,因此BindingContext对象管理任何特定表单的所有CurrencyManager对象.更广泛地说,所有容器控件都至少有一个BindingContext对象来管理他们的CurrencyManagers.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |