2009-03-30 15 views
5

Wyobraźmy sobie te dwie klasy:wiąże w WinForms rozwijane

class Part 
{ 
public string Name { get; set;} 
public int Id { get; set; } 
} 

class MainClass 
{ 
public Part APart { get; set;} 
} 

Jak mogę powiązać MainClass do pola kombi na WinForm, więc wyświetla Part.Name (DisplayMember = "Name";) i wybrany element combo ustawia Właściwość APart klasy MainClass bez potrzeby obsługi żadnych zdarzeń z menu rozwijanego.

Z tego co wiem, ustawienie Valuemember w ComboBox na "Id" oznacza, że ​​spróbuje ustawić APART na numer (Id), który nie jest właściwy.

Mam nadzieję, że to wystarczająco jasne!

+0

Dobre pytanie. Zawsze robiłem rzeczy przez id, nigdy przez przedmioty. – Tony

+0

Czy ktoś może zmienić "właściwość" w kodzie na "publiczny"? – Sung

Odpowiedz

1

To, czego szukasz, to mieć odniesienie do samego obiektu, podczas gdy DisplayMember jest jedną właściwością przedmiotu, prawda? Z tego co wiem, nie ma na to dobrego sposobu, bez tworzenia własnego ComboBox i samodzielnego wykonywania wiązania, ze względu na sposób działania ValueMember i DisplayMember.

Ale, oto kilka rzeczy, które może try (zakładając, że masz zbiór Part s gdzieś):

  1. Nadpisz `toString()` metoda `Part` zwrócić` Nazwa `własność. Następnie ustaw `ComboBox`'s` ValueMember` na `" APart "` i pozostaw `DisplayMember` null. (Niewyważone, więc nie ma gwarancji)
  2. Możesz utworzyć nową właściwość w części, aby zwrócić odwołanie do siebie. Ustaw "ValueMember" na nową właściwość, a "DisplayMember" na "" Name ". To może wydawać się trochę hackerem, ale powinno działać.
  3. Rób śmieszne rzeczy ze swoim kombinatorem `` `` Stracisz silne pisanie, ale jeśli zrobisz `APart` obiekt i` MainClass` zawiera kolekcję `Part`s, możesz ustawić ją za pomocą` Id` (`int`) lub` Part`. (Oczywiście będziemy chcieli być ustawienie go przez Id gdy wiążą ComboBox do niego.)
Part _APart; 
object APart 
{ 
    get {return _APart;} 
    set { 
     if(value is int) 
      _APart = MyPartCollection.Where(p=>p.Id==value).Single(); 
     else if(value is Part) 
      _APart = value; 
     else 
      throw new ArgumentException("Invalid type for APart"); 
    } 
} 
0

Zrobiłem trochę badań i znalazłem this article, gdzie autor był w stanie powiązać właściwości zagnieżdżone przez rozszerzenie standardowego komponentu źródłowego wiązania.
Próbowałem go i wygląda na to, że działa dobrze.

0

Jeśli ustawisz ValueMember pola kombi do null, wiązania z danymi powróci wybrany element (tj. instancja części) zamiast określonego elementu. Ustaw DisplayMember na "Nazwa".

+0

Czy możesz podać fragment roboczy tego proszę? Nie mogę zrobić tego, co zrobisz, ustawiając wartość ValueMember na wartość null. – Khash

0

Utwórz klasę zabezpieczającą do przechowywania "informacji" i utwórz właściwości dla wszystkich danych. Następnie wdrożyć System.ComponentModel.INotifyPropertyChanged na tej klasy, coś jak:

private String _SelectedPart = String.Empty; 

public String SelectedPart 
{ 
    get 
    { 
     return _SelectedPart; 
    } 
    set 
    {    
     if (_SelectedPart != value) 
     { 
     _SelectedPart = value; 

     // helper method for handing the INotifyPropertyChanged event 
     PropertyHasChanged(); 
     } 
    } 
} 

następnie utworzyć „ObjectDataSource” dla tej klasy (Shift-Alt-D w VS2008 spowoduje, że nawet patrząc na formę), a następnie kliknij na ComboBox i ustaw następujące właściwości:

DataSource, ustaw na właśnie utworzony obiekt "BindingSource" ObjectDataSource. DisplayMember, Ustaw właściwość nazwy listy części ValueMember, Ustaw identyfikator elementu listy części DataBindings.SelectedValue, ustaw wybraną część na "BindingSource", którą właśnie utworzyłeś.

Wiem, że powyższe dźwięki są skomplikowane i może zająć trochę, aby znaleźć wszystkie części, które właśnie opisałem (chciałbym dać tutorial lub zrzut ekranu), ale naprawdę jest to BARDZO szybkie, gdy się do tego przyzwyczaisz .

To jest przy okazji, za "wiążące dane" w .NET i istnieje kilka dobrych tutoriali, które mogą dać ci więcej informacji.

+0

Dziękuję za Twój wpis dotyczący wiązania danych. Nie odpowiada to jednak na pytanie, które dotyczy wiązania obiektu odnośnika, a nie identyfikatora obiektu odnośnika. – Khash