2009-02-12 5 views
1

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

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

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

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

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

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

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

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

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

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

Stu

ответ

0

хорошо еще нужна помощь? вам нужно создать 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 

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

0

Я вывел ComboBox на несколько причины, например, для поддержки привязки к нулевым DTO. Это помогло мне вставить эту functinulity, чтобы решить эту проблему, что 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