我已经创建了一个DataGridView并添加了一个DataGridViewImageColumn(使用Designer)。
DataGridView具有“AllowUserToAddRows = true”,因此会显示一个空白行,供用户输入新行。在此空行中,DataGridViewImageColumn显示红色x。我想始终在列中显示相同的图像,无论该行是否有任何数据(我绑定单元格的单击事件,因此使用DataGridViewImageColumn作为按钮)。
如何摆脱红色x?
答案 0 :(得分:4)
我使用ImageList来保存我的所有图像,但这是一个应该有所帮助的修剪版本。你设置Value是正确的,但你应该将它设置为位图的null - 等效,这只是一个静态的空白图像。我用:
e.Value = (imageIndex != int.MinValue) ? imageList.Images[imageIndex] : nullImage;
其中nullImage在类的前面定义为:
private readonly Image nullImage = new Bitmap(1, 1);
答案 1 :(得分:2)
我查看了这些解决方案,我开始使用它的方法是在构造函数中调用InitializeComponent()
后使数据绑定行的默认图像为空图像
dataGridView1.Columns[0].DefaultCellStyle.NullValue = null;
并挂钩RowPrePaintEvent
以删除网格末尾空行的红色X,因为AllowUserToAddRows = true
:
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex >= numberOfRows)
{
dataGridView1.Rows[e.RowIndex].Cells[0].Value = null;
}
}
其中numberOfRows
是网格中有效行的数量。只花了几个小时处理这个问题。希望这可以让别人头疼...
答案 2 :(得分:2)
我使用了grid.row的IsNewRow属性,就像这样
private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) {
DataGridViewRow row = dgUserFileList.Rows[e.RowIndex];
if (row.IsNewRow) {
row.Cells[0].Value = null;
}
}
}
答案 3 :(得分:1)
我找到了解决方案,但我不确定这是最好的方法。
我覆盖RowsAdded事件并将DataGridViewImageColumn的值设置为null。我认为因为值为null,它会显示图像。
private void dgvWorksheet_RowsAdded(object sender,
DataGridViewRowsAddedEventArgs e)
{
dgvWorksheet.Rows[e.RowIndex].Cells[colStartClock.Index].Value = null;
}
我还在Form_Load
中将Column的NullValue设置为nullcolStartClock.DefaultCellStyle.NullValue = null;
我不确定我还有什么需要做的。它似乎工作但似乎有点儿麻烦 - 随机点击有时会导致异常,因此需要更多的调查。
答案 4 :(得分:1)
MSDN documentation对此非常冗长:
默认情况下,空单元格显示默认错误图形。阻止 此图形出现的单元格值等于 null 或 DBNull.Value,设置的DataGridViewCellStyle.NullValue属性 DefaultCellStyle属性返回的单元格样式对象 null 在向控件添加行之前。这不会影响行 然而,新记录。防止出现错误图形 控件AllowUserToAddRows属性时新记录的行 值为 true ,您还必须将单元格值显式设置为 控件RowsAdded事件的处理程序中的 null 或设置列 CellTemplate属性到a的实例 DataGridViewImageCell - 带有重写的派生类型 返回 null 的DefaultNewRowValue属性。
转换为代码意味着您可以在添加任何行之前执行此操作:
var column = new DataGridViewImageColumn();
column.DefaultCellStyle.NullValue = null;
column.CellTemplate = new DataGridViewEmptyImageCell();
然后把这个课放在某个地方:
private class DataGridViewEmptyImageCell : DataGridViewImageCell
{
public override object DefaultNewRowValue { get { return null; } }
}
或者在Cell.Value
事件中将Rows.Added
设置为空。
答案 5 :(得分:0)
另一种避免DataGridView中所有DataGridViewImageColumn元素的默认行为的方法是拦截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;
};
这样,组件将始终使用NullValue图像作为单元格而不是默认的&#34;不可用图像&#34;。