2012-06-06 6 views
10

WinForms .NET 3.5 (C#)display di controllo utente in DataGridViewCell

Ho un DataGridView (DGView) e ho creato CustomColumn e CustomCell da visualizzare nella DGView. Ho creato un CustomUserControl che voglio visualizzare in CustomCell.

Problema: non vedo il controllo utente nella colonna. Penso di aver bisogno di sovrascrivere il metodo Paint() in CustomCell - Qualsiasi punto come posso farlo?

Nota: l'esempio MSDN di controllo utente di hosting consente di modificare il valore della cella, in cui è possibile rendere visibile il controllo utente proprio nel punto in cui si modifica la cella. Voglio che il mio controllo utente sia visualizzato come un normale controllo delle forme. Questo controllo utente mostra le notifiche per la riga .. e ogni riga può avere notifiche diverse. Voglio che gli utenti siano in grado di fare clic sulla notifica e ottenere maggiori dettagli a riguardo. .. ma per ora sono bloccato a "come faccio a visualizzare questo controllo utente"

Qualsiasi suggerimento sarà molto apprezzato.

public class CustomColumn : DataGridViewColumn { 
    public CustomColumn() : base(new CustomeCell()) { } 
    public override DataGridViewCell CellTemplate 
    { 
     get 
     { 
      return base.CellTemplate; 
     } 
     set 
     { 
      // Ensure that the cell used for the template is a CalendarCell. 
      if (value != null && 
       !value.GetType().IsAssignableFrom(typeof(CustomeCell))) 
      { 
       throw new InvalidCastException("It should be a custom Cell"); 
      } 
      base.CellTemplate = value; 
     } 
    } 
} 
public class CustomeCell : DataGridViewTextBoxCell 
{ 
    public CustomeCell() : base() { } 
    public override Type ValueType 
    { 
     get 
     { 
      return typeof(CustomUserControl); 
     } 
    } 
    public override Type FormattedValueType 
    { 
     get 
     { 
      return typeof(CustomUserControl); 
     } 
    } 
} 
+0

È inoltre necessario definire una classe derivata da Control e implementare l'interfaccia IDataGridViewEditingControl. –

+0

@AngshumanAgarwal Come ho detto nella mia domanda - Non voglio modificare, voglio solo mostrare il mio controllo utente per tutte le righe in una colonna. – karephul

+0

non capisco esattamente..ma vuoi mostrare i valori delle celle non mostrate di un datagridview all'utente ?? (es. quando l'utente fa clic una volta su una cella) se è così, quindi usa semplicemente ToolTip con SQLQuery o LINQ – sihirbazzz

risposta

4

Primo tentativo: Ho provato a posizionare un controllo utente sulla griglia in cui avevo bisogno. Problema: lo scorrimento della vista griglia dati richiede la disposizione di tutti quei controlli utente. Risultato - Rifiutato.

Secondo tentativo: ho costruito un controllo utente e l'ho dipinto nella cella appropriata. Risultato - funziona finora.

Ho appena annullato i metodi Paint e OnClick di DataGridViewCell nella classe CustomCell.

public class CustomeCell : DataGridViewCell 
{ 
    public override Type ValueType 
    { 
     get { return typeof(CustomUserControl); } 
    } 

    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) 
    { 
     var ctrl = (CustomUserControl) value; 
     var img = new Bitmap(cellBounds.Width, cellBounds.Height); 
     ctrl.DrawToBitmap(img, new Rectangle(0, 0, ctrl.Width, ctrl.Height)); 
     graphics.DrawImage(img, cellBounds.Location); 
    } 

    protected override void OnClick(DataGridViewCellEventArgs e) 
    { 
     List<InfoObject> objs = DataGridView.DataSource as List<InfoObject>; 
     if (objs == null) 
      return; 
     if (e.RowIndex < 0 || e.RowIndex >= objs.Count) 
      return; 

     CustomUserControl ctrl = objs[e.RowIndex].Ctrl; 
     // Take any action - I will just change the color for now. 
     ctrl.BackColor = Color.Red; 
     ctrl.Refresh(); 
     DataGridView.InvalidateCell(e.ColumnIndex, e.RowIndex); 
    } 
} 

L'esempio rende il CustomControl nella CustomCell di CustomColumn;). Quando l'utente fa clic sulla cella, lo OnClick gestisce il clic. Idealmente, vorrei delegare questo clic al controllo utente personalizzato CustomControl - che dovrebbe gestire l'evento come se fosse un clic su se stesso (il controllo utente personalizzato può ospitare internamente più controlli) - quindi il suo complesso piccolo lì.

public class CustomColumn : DataGridViewColumn 
{ 
    public CustomColumn() : base(new CustomeCell()) { } 

    public override DataGridViewCell CellTemplate 
    { 
     get { return base.CellTemplate; } 
     set 
     { 
      if (value != null && !value.GetType() 
       .IsAssignableFrom(typeof (CustomeCell))) 
       throw new InvalidCastException("It should be a custom Cell"); 
      base.CellTemplate = value; 
     } 
    } 
} 
+0

Ho combinato questa soluzione con il modello del peso mosca. È fantastico - funziona alla grande. – karephul

1

Il controllo DataGridView supporta solo la visualizzazione di un controllo effettivo quando una cella è in modalità di modifica. Il controllo DataGridView non è progettato per visualizzare più controlli o ripetere una serie di controlli per riga. Il controllo DataGridView disegna una rappresentazione del controllo quando la cella non viene modificata. Questa rappresentazione può essere dettagliata come vuoi. Ad esempio, DataGridViewButtonCell disegna un pulsante indipendentemente dal fatto che la cella sia in modifica o meno.

Tuttavia, è possibile aggiungere controlli attraverso DataGridView.Controls.Add() metodo e impostare la propria posizione e le dimensioni per renderli ospitati nelle cellule, but showing controls in all cells regardless of editing make no sense.

Leggi here

[Update - Da MS DataGridView squadra Prog mons]

http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/394e04a8-d918-4fdd-be03-dfa13f6a1e66?persist=True

+1

MS non supporta qualcosa di diverso - ma non sono d'accordo con "ma mostra i controlli in tutte le celle indipendentemente dalla modifica non ha senso." - Considera che stai guardando l'elenco degli ordini dei clienti - ogni ordine può avere notifiche diverse (nessun inventario, indirizzo incompleto, ordine duplicato, reso ordinato ... ecc.) Vorrei che i miei utenti "visualizzassero" queste notifiche - idealmente nella colonna chiamata Notifiche! - senza poterli modificare !! - ma puoi vedere più dettagli se cliccano su uno di essi. – karephul

+0

Interessante! È possibile leggere i commenti di _DataGridView Program Manager. Ho aggiornato la risposta con msdn link. –

+0

Non sono d'accordo né con "ma mostrando i controlli in tutte le celle indipendentemente dalla modifica non ha senso". Ho appena trovato questa domanda perché vorrei mettere un pulsante personalizzato in una cella per fare qualche azione sulla riga selezionata. Se questo non ha senso per te, perché c'è un DataGridViewButtonCell? – tapatio

Problemi correlati