2009-06-02 10 views
5

Ho creato un DataGridView e aggiunto un oggetto DataGridViewImageColumn (utilizzando Designer).DataGridViewImageColumn red x

DataGridView ha "AllowUserToAddRows = true" in modo che venga visualizzata una riga vuota per consentire all'utente di immettere una nuova riga in. In questa riga vuota, DataGridViewImageColumn visualizza una x rossa. Voglio sempre visualizzare la stessa immagine nella colonna indipendentemente dal fatto che la riga abbia o meno dati (lego l'evento click della cella in modo che usi DataGridViewImageColumn come un pulsante).

Come si elimina la x rossa?

+0

Se una riga non ha dati, perché viene visualizzata/visibile? – Cerebrus

+0

Cerebrus, viene visualizzata una riga vuota perché "AllowUserToAddRows = true". Ho modificato la mia domanda per includerla. –

risposta

4

Uso una ImageList per contenere tutte le mie immagini, ma questa è una versione ridotta che dovrebbe aiutare. Hai ragione a impostare il valore, ma dovresti impostarlo sull'equivalente null di una bitmap, che è solo un'immagine statica vuota. Io uso:

e.Value = (imageIndex != int.MinValue) ? imageList.Images[imageIndex] : nullImage; 

dove nullImage è definito in precedenza nella classe come:

private readonly Image nullImage = new Bitmap(1, 1); 
1

Ho trovato una soluzione, ma non sono sicuro che sia il modo migliore.

Sovrascrivo l'evento RowsAdded e imposta il valore di DataGridViewImageColumn su null. Penso che poiché il valore è nullo, visualizza l'immagine.

private void dgvWorksheet_RowsAdded(object sender, 
    DataGridViewRowsAddedEventArgs e) 
{ 
    dgvWorksheet.Rows[e.RowIndex].Cells[colStartClock.Index].Value = null; 
} 

Ho anche impostare il NullValue della colonna per nulla nel Form_Load

colStartClock.DefaultCellStyle.NullValue = null; 

non sono sicuro se c'è qualcosa che devo fare. Sembra che funzioni, ma sembra un po 'buggato: i clic casuali a volte risultano in eccezioni, quindi sono necessarie ulteriori indagini.

2

Ho guardato attraverso queste soluzioni e il modo in cui ho ottenuto questo al lavoro è stato quello di fare questo dopo InitializeComponent() chiamata nel costruttore per rendere l'immagine predefinita per i dati associati righe un'immagine vuota

dataGridView1.Columns[0].DefaultCellStyle.NullValue = null; 

E agganciare il RowPrePaintEvent per rimuovere la X rossa per la riga vuota alla fine della griglia perché AllowUserToAddRows = true:

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
     if (e.RowIndex >= numberOfRows) 
     { 
      dataGridView1.Rows[e.RowIndex].Cells[0].Value = null; 
     } 
} 

Dove numberOfRows è il numero di righe valide nella griglia. Ho passato solo poche ore a occuparmi di questo. Spero che questo salva qualcun altro il mal di testa ...

2

ho usato proprietà IsNewRow di Grid.Row come questo

private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { 
     DataGridViewRow row = dgUserFileList.Rows[e.RowIndex]; 
     if (row.IsNewRow) { 
      row.Cells[0].Value = null; 
     } 
     } 
    } 
0

Un altro modo per evitare questo comportamento predefinito per tutti gli elementi DataGridViewImageColumn in un DataGridView è quello di intercettare il evento CellFormatting:

dataGridView1.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.RowIndex < 0 || e.ColumnIndex < 0) 
     return; 

    var grid = (DataGridView)sender; 
    if (grid.Columns[e.ColumnIndex] is DataGridViewImageColumn && 
     grid[e.ColumnIndex, e.RowIndex].DefaultNewRowValue.Equals(e.Value)) 
     e.Value = null; 
}; 

in questo modo il componente sempre utilizzare l'immagine NullValue per la cella al posto dell ' "immagine non disponibile" di default.

1

Il MSDN documentation risulta abbastanza su questo:

Per default, celle vuote visualizzare un grafico errore predefinito. Per evitare questa grafica visualizzazione per valori di cella pari a nullo o DBNull.Value, impostare la proprietà DataGridViewCellStyle.NullValue dell'oggetto stile cellule restituito dalla proprietà DefaultCellStyle di nullo prima di aggiungere righe al controllo. Ciò non influisce sulla riga per i nuovi record , tuttavia. Per evitare che l'errore grafico di apparire nella riga per i nuovi record quando il controllo AllowUserToAddRows proprietà valore è vero, è inoltre necessario sia impostare in modo esplicito il valore della cella nulla in un gestore per l'evento di controllo RowsAdded o set colonna CellTemplate struttura a un'istanza di un tipo -derived DataGridViewImageCell un override DefaultNewRowValue proprietà che restituisce nullo.

Tradotto in codice che significa che si può fare questo prima di aggiungere le righe:

var column = new DataGridViewImageColumn(); 
column.DefaultCellStyle.NullValue = null; 
column.CellTemplate = new DataGridViewEmptyImageCell(); 

E poi mettere questa classe da qualche parte:

private class DataGridViewEmptyImageCell : DataGridViewImageCell 
{ 
    public override object DefaultNewRowValue { get { return null; } } 
} 

O impostare Cell.Value a null nel Rows.Added evento.

+0

Funziona per me. Grazie! – camino

Problemi correlati