我正在使用winforms,而且我有一个代表IQueryable的comboBox。组合框下方是一系列文本框,我希望将其绑定到当前从组合框中选择的文本框。
这是我的代码。
public partial class TestForm : Form
{
public DataClassesDataContext DataContext;
public IQueryable<T> datasource;
// Ctor
public TestForm()
{
InitializeComponent();
// L2S data context
this.DataContext = new DataClassesDataContext();
// Get the variable for the data source
this.datasource = this.DataContext.Ts;
// setup the binding for the combobox
this.comboBox1.DataSource = this.datasource;
this.comboBox1.DisplayMember = "Description";
this.comboBox1.ValueMember = "Id";
// assign the databindings of the text boxes to the selectedItem of the combo box
// this is where the problem is, afaik
TId.DataBindings.Add(new Binding("Text", this.comboBox1.SelectedItem, "Id"));
TUser.DataBindings.Add(new Binding("Text", this.comboBox1.SelectedItem, "User"));
TDescription.DataBindings.Add(new Binding("Text", this.comboBox1.SelectedItem, "Description"));
}
执行此操作会绑定所有内容,当我更改文本框中的值时,它会更新组合框中最初选择的项目。即使我更改了描述,它也会更新drop don中显示的文本,这一切都很棒。
但是,当我从下拉列表中选择一个不同的项目时,文本框不会绑定到新选择的项目,它们会保持与旧项目绑定。
每次在组合框中选择更改时,是否需要删除并重新添加我的绑定?
答案 0 :(得分:1)
我原来的答案是错误的,而且我承认我并不完全明白这里发生了什么,但我有一个有效的解决方案。
基本上,您需要从BindingManagerBase
抓取BindingContext
并使用它来对每个SelectedItemChanged
事件强制执行数据绑定。
public partial class TestForm : Form
{
public DataClassesDataContext DataContext;
public IQueryable<T> datasource;
private BindingManagerBase bmComboBoxSelectedItem;
// Ctor
public TestForm()
{
InitializeComponent();
// L2S data context
this.DataContext = new DataClassesDataContext();
// Get the variable for the data source
this.datasource = this.DataContext.Ts;
// setup the binding for the combobox
this.comboBox1.DataSource = this.datasource;
this.comboBox1.DisplayMember = "Description";
this.comboBox1.ValueMember = "Id";
// assign the databindings of the text boxes to the selectedItem of the combo box
// this is where the problem is, afaik
TId.DataBindings.Add(new Binding("Text", this.comboBox1, "SelectedItem.Id"));
TUser.DataBindings.Add(new Binding("Text", this.comboBox1, "SelectedItem.User"));
TDescription.DataBindings.Add(new Binding("Text", this.comboBox1, "SelectedItem.Description"));
bmComboBoxSelectedItem = this.BindingContext[this.comboBox1, "SelectedItem"];
}
// make sure you assign this event on the forms designer or your preferred method
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
bmCustomers.ResumeBinding();
}
}
这MSDN article给了很多帮助。
答案 1 :(得分:0)
使用BindingSource而不是直接依赖L2S数据上下文。绑定源使用并发管理器来处理所有更新,而L2S不会
工作代码:
public partial class TestForm : Form
{
public DataClassesDataContext DataContext;
// Incorrect: public IQueryable<T> datasource;
// Correct:
public BindingSource TsDataSource;
// Ctor
public TestForm()
{
InitializeComponent();
// L2S data context
this.DataContext = new DataClassesDataContext();
// Get the variable for the data source
// Incorrect: this.datasource = this.DataContext.Ts;
// Correct:
this.TsDataSource = new BindingSource();
this.TsDataSource.DataSource = this.DataContext.Ts;
// setup the binding for the combobox
this.comboBox1.DataSource = this.TsDataSource;
this.comboBox1.DisplayMember = "Description";
this.comboBox1.ValueMember = "Id";
// assign the databindings of the text boxes to the selectedItem of the combo box
TId.DataBindings.Add(new Binding("Text", this.TsDataSource, "Id"));
TUser.DataBindings.Add(new Binding("Text", this.TsDataSource, "User"));
TDescription.DataBindings.Add(new Binding("Text", this.TsDataSource, "Description"));
}
更多关于来自source的BindingSource(无法抗拒):
BindingSource组件服务 很多目的。首先,它简化了 将表单上的控件绑定到数据依据 提供货币管理,变革 通知和其他服务 Windows窗体控件和。之间 数据源。这是通过 附加BindingSource组件 使用。到您的数据源 DataSource属性。对于复杂 您可以选择绑定方案 将DataMember属性设置为a 数据中的特定列或列表 资源。然后绑定控件到 BindingSource的。进一步的互动 用数据完成 调用BindingSource组件。 有关如何使用BindingSource的示例 可以简化绑定过程,请参阅 如何:将Windows窗体控件绑定到 DBNull数据库值以及如何: 处理错误和例外 发生数据绑定。导航和 更新数据源是 通过诸如此类的方法完成 MoveNext,MoveLast和Remove。 排序和操作等操作 过滤通过排序处理 和过滤器属性。更多 有关使用排序和 使用BindingSource进行过滤,请参阅 如何:排序和过滤ADO.NET数据 使用Windows窗体绑定源 成分