将文本框绑定到comboBox.SelectedItem的属性

时间:2010-02-05 18:06:34

标签: c# winforms linq-to-sql data-binding textbox

我正在使用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中显示的文本,这一切都很棒。

但是,当我从下拉列表中选择一个不同的项目时,文本框不会绑定到新选择的项目,它们会保持与旧项目绑定。

每次在组合框中选择更改时,是否需要删除并重新添加我的绑定?

2 个答案:

答案 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窗体绑定源   成分