DataGridViewImageColumn红色x

时间:2009-06-02 04:42:17

标签: winforms datagridview

我已经创建了一个DataGridView并添加了一个DataGridViewImageColumn(使用Designer)。

DataGridView具有“AllowUserToAddRows = true”,因此会显示一个空白行,供用户输入新行。在此空行中,DataGridViewImageColumn显示红色x。我想始终在列中显示相同的图像,无论该行是否有任何数据(我绑定单元格的单击事件,因此使用DataGridViewImageColumn作为按钮)。

如何摆脱红色x?

6 个答案:

答案 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设置为null
colStartClock.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;。