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事件并手动设置单元格样式:
- 在窗体构造函数或者设计器中绑定事件:
this.bunifuDataGridView.CellValueNeeded += bunifuDataGridView_CellValueNeeded;
- 实现事件处理方法:
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
相关产品推荐
相关产品推荐

