【问题标题】:DataGridView Control doesn't draw cell backcolor correctDataGridView 控件未正确绘制单元格背景色
【发布时间】:2014-10-02 00:17:00
【问题描述】:

我想在我的 DataGridView 控件中设置几个单元格的背景色。 Backcolor 在用 RowsAdded 事件处理程序中的行填充控件时动态设置。这是代码

private void dataGridView_RowsAdded( object sender, DataGridViewRowsAddedEventArgs e )
{
  if( dataGridView.Rows[e.RowIndex].Cells[2].Value as string == "Color" ) 
  {
    dataGridView.Rows[e.RowIndex].Cells[3].ReadOnly = true;
    SetCellColor( dataGridView.Rows[e.RowIndex].Cells[3], dataGridView.Rows[e.RowIndex].Cells[3].Value.ToString()    );  
  }
}

private void SetCellColor( DataGridViewCell cell, Color clr )
{
  cell.Style.BackColor = clr;
  cell.Style.SelectionBackColor = clr;
}

private void SetCellColor( DataGridViewCell cell, string HEXColorVal )
{
  Int32 clrVal;
  System.Globalization.CultureInfo provider = new System.Globalization.CultureInfo( "en-US" );
  if( Int32.TryParse( HEXColorVal, System.Globalization.NumberStyles.HexNumber, provider, out clrVal ) )
  {
    Color clr = Color.FromArgb( clrVal );
    SetCellColor( cell, clr );
  }
}

在最后一列中存储了透明度 = 0 的颜色的 srting 表示。在运行时我可以看到,背景属性设置为正确的值,但实际上背景仍然是白色的,当我制作这个单元格时活跃的一切也都变白了。这种行为的原因是什么?我尝试通过在 cellFormating 事件处理程序中设置此属性来修复它,但结果相似。同时,当我使用 ColorDialog 中的颜色设置此属性时(此处显示为双击),一切正常。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    Color.FromArgb 的格式要求提供 ARGB 值。 A是Alpha通道;这不是“透明度”,而是“不透明度”。 I 范围从 0-255 或 00 到 FF,其中 00 表示透明,FF 表示完全不透明。

    如果您的输入字符串省略了 4(!) 个字节中的第一个,则结果仍然是透明的。

    您应该确保十六进制字符串包含所有四个字节并且以'FF'开头!

    或者你可以这样写,明确分离组件:

     Color.FromArgb(255, (clrVal >> 16) & 0xFF, (clrVal >> 8) & 0xFF, clrVal & 0xFF);
    

    或者你可以写

     Color.FromArgb(255,  Color.FromArgb(clrVal) );
    

    ..默默地将 Alpha 通道校正为完全不透明。

    【讨论】:

    • 不一定是透明的;这取决于传入的十六进制值的格式。如果十六进制字符串是#RRGGBB 格式,那么alpha 通道将设置为RR 的值。如果它是#BBGGRR 格式,那么 alpha 通道将设置为 BB 的值。您可能会随机获得 0 或 255,但您也可以轻松获得介于两者之间的值。
    • 不确定你的意思。 AFAIK 没有 十六进制字符串的格式Color.FromArgb() 采用 integer 和固定的format
    • 他正在使用Int32.TryParse 解析一个十六进制字符串,然后将结果传递给Color.FromArgb。这就是整数的来源。
    【解决方案2】:

    在将颜色从十六进制转换为颜色类型时似乎存在问题。如果值存储在像#FFAABB这样的网格中,那就简单了

    private void SetCellColor( DataGridViewCell cell, string HEXColorVal)
    {
      SetCellColor( cell, System.Drawing.ColorTranslator.FromHtml(HEXColorVal));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-08
      • 2013-04-12
      • 2014-02-27
      • 2012-02-17
      • 2011-08-06
      • 2011-09-07
      • 2016-05-27
      • 2015-07-11
      相关资源
      最近更新 更多