2009-03-30 5 views
5

Immaginate queste due classi:discesa vincolante in WinForms

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

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

Come posso legare MainClass ad una casella combinata su una WinForm, quindi visualizza Part.Name (DisplayMember = "Name";) e l'elemento selezionato del combo imposta la Proprietà APart di MainClass senza la necessità di gestire alcun evento nel menu a discesa.

Per quanto ne so, l'impostazione di ValueMember del ComboBox su "Id" significa che proverà a impostare APart su un numero (Id) che non è corretto.

Spero che questo sia abbastanza chiaro!

+0

Buona domanda. Ho sempre fatto le cose con ID mai da oggetti. – Tony

+0

qualcuno può cambiare "proprietà" nel codice in "pubblico"? – Sung

risposta

1

Quello che stai cercando è che il ValueMember (= ComboBox.SelectedItem) sia un riferimento all'oggetto stesso, mentre DisplayMember è una proprietà singola dell'articolo, corretto? Per quanto ne so, non c'è un buon modo per farlo senza creare il proprio ComboBox e fare il binding da soli, a causa del modo in cui funzionano ValueMember e DisplayMember.

Ma, ecco un paio di cose che si possibile prova (ammesso che abbiate una raccolta di Part s da qualche parte):

  1. Override del `ToString()` di `Part` di restituire il` Nome `proprietà. Quindi imposta il `ValueMember` di` ComboBox` su `" APart "` e lascia null `DisplayMember`. (Non verificato, quindi nessuna garanzia)
  2. È possibile creare una nuova proprietà in Parte per restituire un riferimento a se stesso. Impostare 'ValoreMember' sulla nuova proprietà e 'DisplayMember' su `" Nome "`. Potrebbe sembrare un po 'un trucco, ma dovrebbe funzionare.
  3. Fai cose divertenti con il tuo getter e setter `APart`. Perderai qualche tipo di digitazione forte, ma se rendi un oggetto `APart` e` MainClass` contiene la raccolta di `Part`s, puoi impostarlo con` Id` (`int`) o` Part`. (Ovviamente si vorrà essere portarlo per Id quando si associa la casella combinata ad esso.)
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

Ho fatto una piccola ricerca e ho trovato this article dove l'autore è stato in grado di legarsi a proprietà nidificate estendendo il componente di origine dell'associazione standard.
L'ho provato e sembra funzionare bene.

0

Se si imposta l'ValueMember della casella combinata su null, l'associazione dati restituirà l'elemento selezionato (vale a dire l'istanza della parte) invece del membro specificato. Impostare DisplayMember su "Nome".

+0

Puoi fornire uno snippet di lavoro per questo? Non riesco a farlo per fare ciò che dici di fare con l'impostazione di ValueMember su null. – Khash

0

creare una classe di supporto per contenere le "informazioni" e creare proprietà per tutti i dati. Quindi implementare System.ComponentModel.INotifyPropertyChanged in quella classe, qualcosa di simile:

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

Poi creare un "ObjectDataSource" per quella classe (Shift-Alt-D in VS2008 porterà che fino mentre guardando un modulo), quindi fai clic sul tuo ComboBox e imposta le seguenti proprietà:

DataSource, impostato su "BindingSource" ObjectDataSource appena creato. DisplayMember, Impostare sul propertity Nome dell'elenco delle parti ValueMember, Impostare sul membro ID dell'elenco delle parti DataBindings.SelectedValue, impostare su SelectedPart sulla "BindingSource" appena creata.

So che i suoni di cui sopra sono complessi e potrebbe richiedere un po 'di trovare tutte le parti che ho appena descritto (vorrei poter dare un tutorial o uno screenshot), ma in realtà è MOLTO veloce da fare una volta che ci si abitua .

Questo è, considerato "binding di dati" in .NET e ci sono alcuni buoni tutorial là fuori che possono dare ulteriori informazioni.

+0

Grazie per il tuo post sull'associazione dati. Tuttavia, questo non risponde alla domanda che riguarda l'associazione all'oggetto di ricerca anziché all'id dell'oggetto di ricerca. – Khash