Привязка текстовых полей к свойствам comboBox.SelectedItem - PullRequest
0 голосов
/ 05 февраля 2010

Я использую winforms, и у меня есть comboBox, который представляет IQueryable. Ниже в поле со списком находится ряд текстовых полей, которые я хотел бы привязать к выбранному в данный момент из поля со списком.

Вот мой код.

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"));
}

Выполнение этого связывает все, когда я изменяю значения в текстовых полях, он прекрасно обновляет первоначально выбранный элемент в поле со списком. Даже когда я меняю описание, он обновляет отображаемый текст в виде сообщения, все это замечательно.

Однако, когда я выбираю другой элемент из выпадающего меню, текстовые поля не привязываются к этому вновь выбранному элементу, они остаются привязанными к старому.

Нужно ли удалять и повторно добавлять мои привязки каждый раз, когда выбор изменяется в поле со списком?

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Мой первоначальный ответ был неверным, и по общему признанию я не полностью понимаю, что все здесь происходит, но у меня есть решение, которое работает.

Как правило, вам нужно извлечь 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 очень помогла.

0 голосов
/ 08 марта 2010

Используйте 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"));
}

Подробнее о BindingSource из источника (не устоял):

Служит компонент BindingSource много целей. Во-первых, это упрощает связывание элементов управления в форме с данными управление валютой, обмен уведомление и другие услуги между элементами управления Windows Forms и источники данных. Это достигается присоединение компонента BindingSource к вашему источнику данных, используя Свойство DataSource. Для сложных обязательные сценарии вы можете по желанию установите для свойства DataMember значение конкретный столбец или список в данных источник. Затем вы привязываете элементы управления к BindingSource. Все дальнейшее взаимодействие с данными осуществляется с вызовы компонента BindingSource. Для примеров о том, как BindingSource можно упростить процесс связывания, см. Как: привязать элементы управления Windows Forms к Значения базы данных DBNull и как: Обрабатывать ошибки и исключения, которые Происходят с привязкой данных. Навигация и обновление источника данных достигается с помощью таких методов, как MoveNext, MoveLast и Remove. Операции, такие как сортировка и фильтрации обрабатываются через сортировку и свойства фильтра. Для большего информация об использовании сортировки и фильтрация с помощью BindingSource, см. Как: сортировать и фильтровать данные ADO.NET с помощью BindingSource для Windows Forms Компонент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...