I have encountered a problem where I enabled a GridCommandCellElement in the ViewCellFormatting event handler. The cell/button is enabled but it appears disabled (grayed out). The cell/button only appears enabled (not grayed out) after the focus is shifted to the row that contains the cell/button.
I have attached a sample project that I used to reproduce the issue. To reproduce this issue:
1. Delete the fourth row which has a Year of '4'. This will enable the insert ('+') button for the third row.
2. You can click on the insert ('+') button for the third row even though it appears disabled and a new row will be inserted.
3. If you click in the row header for the third row, the insert ('+') button, will now appear enabled.
The issue is why does the cell/button appear to be disabled still after it has been enabled in the code.
Here is the cs file:
Here is the Designer.cs file:
I have attached a sample project that I used to reproduce the issue. To reproduce this issue:
1. Delete the fourth row which has a Year of '4'. This will enable the insert ('+') button for the third row.
2. You can click on the insert ('+') button for the third row even though it appears disabled and a new row will be inserted.
3. If you click in the row header for the third row, the insert ('+') button, will now appear enabled.
The issue is why does the cell/button appear to be disabled still after it has been enabled in the code.
Here is the cs file:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using Telerik.WinControls.Primitives;using Telerik.WinControls.UI;namespace GridCellEnabled{ public partial class Form1 : Form { private GridViewTextBoxColumn _yearColumn = null; private GridViewTextBoxColumn _valueColumn = null; private GridViewCommandColumn _insertRowColumn = null; private GridViewCommandColumn _deleteRowColumn = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { SetupGrid(); } private void SetupGrid() { // Add Columns { // Year Column { _yearColumn = new GridViewTextBoxColumn(); _yearColumn.Name = "Year"; _yearColumn.HeaderText = "Year"; _grid.Columns.Add(_yearColumn); } // Value Column { _valueColumn = new GridViewTextBoxColumn(); _valueColumn.Name = "Value"; _valueColumn.HeaderText = "Value"; _grid.Columns.Add(_valueColumn); } // Insert Row Column { _insertRowColumn = new GridViewCommandColumn(); _insertRowColumn.Name = "InsertRow"; _insertRowColumn.HeaderText = string.Empty; _insertRowColumn.UseDefaultText = true; _insertRowColumn.DefaultText = "+"; _insertRowColumn.MinWidth = 20; _insertRowColumn.TextAlignment = ContentAlignment.MiddleCenter; _grid.Columns.Add(_insertRowColumn); } // Delete Row Column { _deleteRowColumn = new GridViewCommandColumn(); _deleteRowColumn.Name = "DeleteRow"; _deleteRowColumn.HeaderText = string.Empty; _deleteRowColumn.UseDefaultText = true; _deleteRowColumn.DefaultText = "-"; _deleteRowColumn.MinWidth = 20; _deleteRowColumn.TextAlignment = ContentAlignment.MiddleCenter; _grid.Columns.Add(_deleteRowColumn); } } // Add Rows { for (int i = 1; i <= 5; i++) { GridViewRowInfo row = _grid.Rows.AddNew(); row.Cells[_yearColumn.Name].Value = i; row.Cells[_valueColumn.Name].Value = i * 10; } } _grid.BestFitColumns(); } private void _grid_CommandCellClick(object sender, EventArgs e) { GridViewCellEventArgs args = e as GridViewCellEventArgs; if (args.Column == _insertRowColumn) { InsertRow(args.RowIndex); } else if (args.Column == _deleteRowColumn) { DeleteRow(args.RowIndex); } } private void InsertRow(int aRow) { GridViewDataRowInfo rowInfo = new GridViewDataRowInfo(_grid.MasterView); int startYear = Convert.ToInt32(_grid.Rows[aRow].Cells["Year"].Value) + 1; rowInfo.Cells[_yearColumn.Name].Value = startYear; rowInfo.Cells[_valueColumn.Name].Value = startYear * 10; _grid.Rows.Insert(aRow + 1, rowInfo); } private void DeleteRow(int aRow) { _grid.Rows.RemoveAt(aRow); } private void _grid_ViewCellFormatting(object sender, CellFormattingEventArgs e) { if (e.CellElement is GridCommandCellElement && e.RowIndex >= 0) { if (e.Column == _insertRowColumn) { if (e.RowIndex + 1 < _grid.RowCount) { int startYear = Convert.ToInt32(_grid.Rows[e.RowIndex].Cells[_yearColumn.Name].Value); int nextYear = Convert.ToInt32(_grid.Rows[e.RowIndex + 1].Cells[_yearColumn.Name].Value); if ((startYear + 1) == nextYear) { e.CellElement.Enabled = false; } else { e.CellElement.Enabled = true; } } else { e.CellElement.Enabled = true; } } else if (e.Column == _deleteRowColumn) { if (e.RowIndex == 0) { e.CellElement.Enabled = false; } else { e.CellElement.Enabled = true; } } } } }}Here is the Designer.cs file:
namespace GridCellEnabled{ partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this._grid = new Telerik.WinControls.UI.RadGridView(); ((System.ComponentModel.ISupportInitialize)(this._grid)).BeginInit(); this.SuspendLayout(); // // _grid // this._grid.Location = new System.Drawing.Point(12, 12); this._grid.Name = "_grid"; this._grid.Size = new System.Drawing.Size(260, 238); this._grid.TabIndex = 0; this._grid.ViewCellFormatting += new Telerik.WinControls.UI.CellFormattingEventHandler(this._grid_ViewCellFormatting); this._grid.CommandCellClick += new Telerik.WinControls.UI.CommandCellClickEventHandler(this._grid_CommandCellClick); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this._grid); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this._grid)).EndInit(); this.ResumeLayout(false); } #endregion private Telerik.WinControls.UI.RadGridView _grid; }}