2009-02-09 5 views
8

Ho un datagrid che viene popolato con dati CSV quando l'utente trascina/rilascia un file su di esso. È possibile visualizzare un messaggio nella griglia vuota, ad esempio "Trascinare un file qui" o "Questa griglia è attualmente vuota". La griglia attualmente viene visualizzata come una casella grigio scuro mentre aspetto finché il file non viene trascinato per impostare le colonne ecc.È possibile visualizzare un messaggio in un datagrid vuoto

risposta

8

Abbiamo sottoclasse il controllo DataGridView e aggiunto questo. Non avevamo bisogno della funzionalità di trascinamento/rilascio - ci serviva solo per dire all'utente quando non c'erano dati restituiti dalla loro query.

Abbiamo una proprietà emptyText dichiarato così:

private string cvstrEmptyText = ""; 
    [Category("Custom")] 
    [Description("Displays a message in the DataGridView when no records are displayed in it.")] 
    [DefaultValue(typeof(string), "")] 
    public string EmptyText 
    { 
     get 
     { 
      return this.cvstrEmptyText; 
     } 
     set 
     { 
      this.cvstrEmptyText = value; 
     } 
    } 

e sovraccaricato la funzione PaintBackground:

protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds) 
    { 
     RectangleF ef; 
     base.PaintBackground(graphics, clipBounds, gridBounds); 
     if ((this.Enabled && (this.RowCount == 0)) && (this.EmptyText.Length > 0)) 
     { 
      string emptyText = this.EmptyText; 
      ef = new RectangleF(4f, (float)(this.ColumnHeadersHeight + 4), (float)(this.Width - 8), (float)((this.Height - this.ColumnHeadersHeight) - 8)); 
      graphics.DrawString(emptyText, this.Font, Brushes.LightGray, ef); 
     } 
    } 
+0

Questo è bello e riutilizzabile senza logica aggiuntiva, posso impostare il testo vuoto nel designer –

1

Penso che la cosa più semplice da fare qui sia di fare un controllo etichetta gigante per fare il "Trascina qui" e gestire l'evento drag/drop dell'etichetta. Una volta completato il trascinamento, nascondi l'etichetta e mostra la griglia.

+0

Ho usato questa tecnica con ListViews in passato, bello, pulito e semplice! –

1

se si utilizza un gridview, è possibile utilizzare la proprietà EmptyDataText. Può fare tutto ciò che un datagrid può e (IMHO) penso che sia più facile lavorare nella maggior parte dei casi

+0

Questa potrebbe essere una soluzione, ma sto usando Winforms non ASP. Dovrò indagare su questo –

0

Quello che faccio in questa situazione è aggiungere un controllo scheda per modulo, inserire il DGV in una scheda e un'etichetta ('Trascina qui' o qualcosa di simile) nell'altra scheda. Nascondi le schede. Quindi se il DGV è vuoto, mostra la scheda con l'etichetta. Proprio come la risposta di routeNpingme, gestirai qui l'evento drag/drop, caricherò il DGV in background e poi cambierai tab al termine del caricamento. Questo è bello, perché hai anche la possibilità di passare facilmente avanti e indietro tra le schede mentre in VS Designer.