События SelectedItem / Index / ValueChanged не возникают, когда DataSource привязан к данным в ComboBox - PullRequest
1 голос
/ 12 февраля 2009

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

Я пытаюсь сделать это правильно, используя привязку данных, но нахожу странную причуду с элементом управления ComboBox.

Я установил источник данных родителя вручную:

cboParent.DataSource = ParentDataSource, где ParentDataSource равен IList<ParentDTO>. Затем я могу привязать выбранный элемент к DTO таким образом:

cboParent.DataBindings.Add(new Binding("SelectedItem", bindingSource, "Parent", true, DataSourceUpdateMode.OnPropertyChanged)); привязка к Parent a ParentDTO объекту в моем всеобъемлющем DTO.

Пока все довольно стандартно. Это работает и записывает изменения в мой объект DTO, как только я выбираю что-то новое в списке, отлично!

Затем я связываю источник данных дочернего поля со списком со списком в всеобъемлющем DTO: cboChild.DataBindings.Add(new Binding("DataSource", bindingSource, "Children", true, DataSourceUpdateMode.OnPropertyChanged));, где Children - это IList<ChildDTO> на всеобъемлющем DTO.

Это также работает нормально, и как только я меняю родительский выбор, докладчик меняет список Children в DTO, и значения, показанные в cboChildren, меняются, фантастически я слышу, как ты плачешь (и я сделал это сам)!

К сожалению, кажется, что если вы используете привязку данных для установки источника данных в ComboBox, события SelectedItemChanged, SelectedIndexChanged и SelectedValueChanged вообще никогда не срабатывают! Это означает, что привязка данных OnProperyChanged не будет работать для второго комбинированного списка. OnValidation работает, но мне это кажется немного странным, и мне было интересно, сталкивался ли кто-нибудь с этим раньше и выяснили ли они, как заставить его работать?

Заранее спасибо

Stu

Ответы [ 2 ]

0 голосов
/ 02 июня 2009

Я получил ComboBox по нескольким причинам, например, для поддержки привязки к нулевым DTO. Это помогло мне вставить эту функцию, чтобы устранить проблему, из-за которой Binding не обновляется:

public new object SelectedItem
{
    get
    {
        return base.SelectedItem;
    }
    set
    {
        base.SelectedItem = value;
        if (value == null || value == System.DBNull.Value)
        {
            this.SelectedIndex = -1;
        }
        **foreach (Binding binding in DataBindings)
        {
            if (binding.PropertyName == "SelectedItem")
            {
                binding.WriteValue();
            }
        }**
    }
}

Возможно, вы захотите сделать это также, если имя свойства SelectedValue или selectedIndex.

Если это кому-то помогло, пожалуйста, напишите обратно!

С наилучшими пожеланиями, EFy

0 голосов
/ 12 февраля 2009

ну все равно нужна помощь? вам нужно создать bindingSources и вспомогательное текстовое поле для фильтра и использовать удобное свойство bindingSource.filter

Вот как:

Dim ds As New DataSet
Dim bind1 As New BindingSource
Dim bind2 As New BindingSource

'' here I add data to the dataset.. you MUST do your own populate way
ds.Merge(GetProducts) ' returns a dataset filled with products
ds.Merge(GetCategories) ' returns a dataset filled with categories

'' after the ds has data

' create binds 
bind1.DataSource = ds
bind1.DataMember = "products"

' crete binds
bind2.DataSource = ds
bind2.DataMember = "categories"

txtMaster.DataSource = bind1
txtMaster.DisplayMember = "product_name"
txtMaster.ValueMember = "product_id"

txtDetails.DataSource = bind2
txtDetails.DisplayMember = "category_name"
txtDetails.ValueMember = "category_id"

txtAux.DataBindings.Add("Text", bind1, "product_id") ' bind1 contais products data
' this perform a filter on bind2... that contains categories data
Private Sub txtMaster_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtMaster.SelectedIndexChanged
    bind2.Filter = "product_id = '" & txtAux.Text & "'"
End Sub

надеюсь, что это поможет

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