2009-06-02 6 views
5

Ich habe eine DataGridView erstellt und eine DataGridViewImageColumn (mit dem Designer) hinzugefügt.DataGridViewImageColumn rot x

Die DataGridView hat "AllowUserToAddRows = true", so dass eine leere Zeile angezeigt wird, in die der Benutzer eine neue Zeile eingeben kann. In dieser leeren Zeile zeigt die DataGridViewImageColumn ein rotes x an. Ich möchte immer das gleiche Bild in der Spalte anzeigen, unabhängig davon, ob die Zeile Daten enthält oder nicht (ich binde das click -Ereignis der Zelle, so dass die DataGridViewImageColumn als Schaltfläche verwendet wird).

Wie entferne ich das rote x?

+0

Wenn eine Zeile keine Daten enthält, warum wird sie angezeigt/sichtbar? – Cerebrus

+0

Cerebrus, eine leere Zeile wird angezeigt, weil "AllowUserToAddRows = true". Ich habe meine Frage bearbeitet, um dies zu berücksichtigen. –

Antwort

4

Ich verwende eine ImageList, um alle meine Bilder zu halten, aber hier ist eine abgespeckte Version, die helfen sollte. Sie haben Recht, den Wert festzulegen, aber Sie sollten es auf das Null-Äquivalent einer Bitmap festlegen, die nur ein statisches leeres Bild ist. Ich benutze:

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

wo nullImage wie früher in der Klasse definiert ist:

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

Ich habe eine Lösung gefunden, aber ich bin mir nicht sicher, es ist der beste Weg.

Ich überschreibe das RowsAdded-Ereignis und setze den Wert von DataGridViewImageColumn auf null. Ich denke, da der Wert null ist, wird das Bild angezeigt.

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

Ich habe auch die Nullvalue der Spalte auf Null in der Form_Load

colStartClock.DefaultCellStyle.NullValue = null; 

Ich bin nicht sicher, ob alles, was ich tun müssen, es gibt. Es scheint zu funktionieren, aber es scheint ein bisschen buggy - zufälliges Klicken führt manchmal zu Ausnahmen, so dass weitere Untersuchungen erforderlich sind.

2

ich durch diese Lösungen gesucht und die Art, wie ich dies zu Arbeit bekam dies nach InitializeComponent() Aufruf im Konstruktor zu tun das Standardbild für die Daten gebunden Zeilen ein leeres Bild, um die RowPrePaintEvent

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

und Haken macht die roten X für die leere Zeile am Ende zu entfernen, des Gitters weil AllowUserToAddRows = true:

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

Wo numberOfRows die Anzahl der gültigen Zeilen im Raster ist. Habe nur ein paar Stunden damit verbracht. Hoffe, das spart jemand anderes die Kopfschmerzen ...

2

I IsNewRow Eigenschaft Grid.Row wie diese

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

Eine weitere Möglichkeit zur Vermeidung dieses Standardverhalten für alle DataGridViewImageColumn Elemente in einem Datagridview verwendet wird, ist die abfängt Cellformatting-Ereignis:

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

Auf diese Weise wird die Komponente immer die Nullvalue Bild für die Zelle anstelle des Standard „nicht verfügbar Bild“ verwenden.

1

Die MSDN documentation ist ziemlich ausführliche dazu:

standardmäßig leere Zellen eine Standardfehler Grafik angezeigt werden soll. Um zu verhindern, diese Grafik erscheinen für Zellwerte gleich null oder DBNull.Value, stellen Sie die DataGridViewCellStyle.NullValue Eigenschaft des Zelle Stil Objekt durch die DefaultCellStyle Eigenschaft null vor dem Hinzufügen von Zeilen an die Steuerung zurückgeführt. Dies wirkt sich jedoch nicht auf die Zeile für neue Datensätze aus. die Fehler Grafik in die Zeilen zu verhindern, für neue Datensätze angezeigt wird, wenn die Steuer AllowUserToAddRows Eigenschaft Wert wahr ist, müssen Sie auch festlegen entweder explizit den Zellenwert zu null in einem Handler für die Steuerung RowsAdded Ereignis oder eingestellt die Spalte CellTemplate Eigenschaft auf eine Instanz eines DataGridViewImageCell -abgeleiteten Typ mit einer überschriebenen DefaultNewRowValue Eigenschaft, die null zurückgibt.

Übersetzt es zu codieren bedeutet, dass Sie diese alle Zeilen vor dem Hinzufügen tun können:

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

Und dann irgendwo diese Klasse setzen:

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

Oder gesetzt Cell.Value auf null in der Rows.Added Ereignis.

+0

Es funktioniert für mich. Vielen Dank! – camino