You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataGridView交替行(未选中/正常状态)单元格文本颜色修改异常

DataGridView交替行文本颜色未显示为白色的解决办法

问题情况

我尝试把DataGridView交替行的单元格文本颜色设为白色,但实际显示是黑色。需求是让未选中/正常状态下的所有单元格文本都显示白色。注:用的是默认DataGridView,不是BunifuDataGridView,变量名还没改,问题截图如下:

问题截图

当前设计器代码

// 
// bunifuDataGridView
// 
this.bunifuDataGridView.AllowUserToAddRows = false;
this.bunifuDataGridView.AllowUserToDeleteRows = false;
this.bunifuDataGridView.AllowUserToOrderColumns = true;
dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(44)))), ((int)(((byte)(48)))), ((int)(((byte)(52)))));
dataGridViewCellStyle1.ForeColor = System.Drawing.Color.White;
this.bunifuDataGridView.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
this.bunifuDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;
this.bunifuDataGridView.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(16)))), ((int)(((byte)(18)))));
this.bunifuDataGridView.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleHorizontal;
this.bunifuDataGridView.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
this.bunifuDataGridView.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(16)))), ((int)(((byte)(18)))));
dataGridViewCellStyle2.Font = new System.Drawing.Font("Segoe UI Semibold", 11.75F, System.Drawing.FontStyle.Bold);
dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White;
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(65)))));
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.Color.White;
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.bunifuDataGridView.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2;
this.bunifuDataGridView.ColumnHeadersHeight = 40;
dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(33)))), ((int)(((byte)(37)))), ((int)(((byte)(41)))));
dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F, System.Drawing.FontStyle.Bold);
dataGridViewCellStyle3.ForeColor = System.Drawing.Color.White;
dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(117)))), ((int)(((byte)(119)))));
dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.WhiteSmoke;
dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.bunifuDataGridView.DefaultCellStyle = dataGridViewCellStyle3;
this.bunifuDataGridView.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;
this.bunifuDataGridView.EnableHeadersVisualStyles = false;
this.bunifuDataGridView.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(56)))), ((int)(((byte)(62)))));
this.bunifuDataGridView.Location = new System.Drawing.Point(10, 12);
this.bunifuDataGridView.Name = "bunifuDataGridView";
this.bunifuDataGridView.ReadOnly = true;
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.bunifuDataGridView.RowHeadersDefaultCellStyle = dataGridViewCellStyle4;
this.bunifuDataGridView.RowHeadersVisible = false;
this.bunifuDataGridView.RowTemplate.Height = 40;
this.bunifuDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect;
this.bunifuDataGridView.Size = new System.Drawing.Size(920, 479);
this.bunifuDataGridView.TabIndex = 11;
this.bunifuDataGridView.VirtualMode = true;

解决办法

问题根源是你开启了VirtualMode = true,在虚拟模式下,DataGridView不会自动把DefaultCellStyle和AlternatingRowsDefaultCellStyle应用到单元格,需要手动处理:

方案1:关闭虚拟模式(如果不需要的话)

直接把VirtualMode设为false,原来的样式设置就会正常生效:

this.bunifuDataGridView.VirtualMode = false;

方案2:在虚拟模式下手动应用样式

如果必须保留虚拟模式,需要绑定CellValueNeeded事件并手动设置单元格样式:

  1. 在窗体构造函数或者设计器中绑定事件:
this.bunifuDataGridView.CellValueNeeded += bunifuDataGridView_CellValueNeeded;
  1. 实现事件处理方法:
private void bunifuDataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
    // 先处理数据绑定逻辑,比如从数据源获取对应单元格的值
    // e.Value = 你的数据源[e.RowIndex][e.ColumnIndex];

    // 根据行索引判断是否为交替行,应用对应样式
    var dgv = sender as DataGridView;
    if (dgv == null) return;

    DataGridViewCellStyle targetStyle = e.RowIndex % 2 == 1 
        ? dgv.AlternatingRowsDefaultCellStyle 
        : dgv.DefaultCellStyle;

    var cell = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
    cell.Style.ForeColor = targetStyle.ForeColor;
    cell.Style.BackColor = targetStyle.BackColor;
    cell.Style.Font = targetStyle.Font;
}

内容的提问来源于stack exchange,提问作者sagar raval

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:57:34