Domanda

Vorrei creare un controllo derivato da System.Windows.Forms.ComboBox che è associato a un elenco di oggetti che recupero dal database. Idea è che altri sviluppatori possono semplicemente rilasciare questo controllo sul loro modulo senza doversi preoccupare dell'origine dati, vincolante, a meno che non lo vogliano.

Ho cercato di estendere la casella combinata e quindi impostare DataSource, DisplayMember e ValueMember nel costruttore.

public class CustomComboBox : ComboBox
{
    public CustomComboBox() 
    {
        this.DataSource = MyDAL.GetItems(); // Returns List<MyItem>
        this.DisplayMember = "Name";
        this.ValueMember = "ItemID";
    }
}

Funziona quando corro, ma genera molti errori in Visual Studio una volta aggiunto a qualsiasi modulo. L'errore che ottengo è:

  

" Generazione di codice per la proprietà "Articoli" non riuscita. Errore: "Riferimento oggetto non impostato su un'istanza di un oggetto "

Qual è il modo corretto per ottenere questo risultato (C #, Winforms, .NET 2.0+)?

È stato utile?

Soluzione 2

La proprietà DesignMode non funziona in un costruttore. Da Google per un po ', ho trovato questa cosa LicenseManager.

if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
    // Do your database/IO/remote call
}

Tuttavia LicenseManager funziona solo nei costruttori. Per i gestori di eventi utilizzare DesignMode.

Fonte: http: // dotnetfacts .blogspot.com / 2009/01 / identificando-run-time-e-design-mode.html

Un altro riferimento: http: //weblogs.asp. net / fmarguerie / archive / 2005/03/23 / 395658.aspx

Altri suggerimenti

Il problema è che il designer esegue effettivamente alcune compilazioni ed esecuzioni in un contesto leggermente diverso rispetto a quanto normalmente fa il programma.

Nel costruttore, puoi racchiudere il tuo codice in:

if (!DesignMode)
{
  //Do this stuff
}

Ciò dirà al progettista di non eseguire alcun codice di inizializzazione durante la progettazione.

Il mio solito commento qui - DesignMode non è affidabile in nessuna situazione se non se il controllo è posizionato direttamente su una superficie di progettazione - ovvero se il controllo è posizionato su un altro controllo, DesignMode non è vero anche se si è in modalità progettazione. Non ho trovato NESSUN modo affidabile per sapere se sei in modalità progettazione, soprattutto con i controlli ereditati. Anche le varianti che utilizzano Sito non sono affidabili se il controllo è ereditato da un controllo non visivo (ad esempio Finestra di dialogo comune).

Vedi http://keyofdflat.livejournal.com/5407.html (assicurati per leggere l'ultimo commento).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top