GridView cell formatting in custom columns

0 Answers 5 Views
GridView
Marian
Top achievements
Rank 2
Bronze
Iron
Iron
Marian asked on 30 Dec 2025, 05:01 PM

Hello,

I would like to ask two questions about custom columns in GridView. I'm putting them into one thread since they're related.

1. What's the relationship between SetContentCore and OnCellFormatting? Is it ok to set formatting in SetContentCore? This is how it seems to me to be correct:

		protected override void SetContentCore(object value)
		{
			if (value is Quality q)
			{
				if (q == Quality.None)
					Text = "--";
				else
					Text = q.ToString();
			}
			else
				base.SetContentCore(value);
		}

		protected override void OnCellFormatting(CellFormattingEventArgs e)
		{
			ResetValue(VisualElement.BackColorProperty, ValueResetFlags.Local);
			ResetValue(VisualElement.ForeColorProperty, ValueResetFlags.Local);
			ResetValue(LightVisualElement.NumberOfColorsProperty, ValueResetFlags.Local);
			ResetValue(LightVisualElement.DrawFillProperty, ValueResetFlags.Local);

			if (Value is Quality q)
			{
				switch (q)
				{
					case Quality.OK:
						BackColor = Color.Lime;
						NumberOfColors = 1;
						DrawFill = true;
						break;
					case Quality.NOK:
						BackColor = Color.Red;
						NumberOfColors = 1;
						DrawFill = true;
						break;
					case Quality.Error:
						BackColor = Color.DodgerBlue;
						NumberOfColors = 1;
						DrawFill = true;
						break;
				}
			}

			base.OnCellFormatting(e);
		}

But this also works. I tried it mainly because of the second question, and Copilot actually suggested it as the first styling approach.

		protected override void SetContentCore(object value)
		{
			if (value is Quality q)
			{
				if (q == Quality.None)
					Text = "--";
				else
					Text = q.ToString();

				ResetValue(VisualElement.BackColorProperty, ValueResetFlags.Local);
				ResetValue(VisualElement.ForeColorProperty, ValueResetFlags.Local);
				ResetValue(LightVisualElement.NumberOfColorsProperty, ValueResetFlags.Local);
				ResetValue(LightVisualElement.DrawFillProperty, ValueResetFlags.Local);

				switch (q)
				{
					case Quality.OK:
						BackColor = Color.Lime;
						NumberOfColors = 1;
						DrawFill = true;
						break;
					case Quality.NOK:
						BackColor = Color.Red;
						NumberOfColors = 1;
						DrawFill = true;
						break;
					case Quality.Error:
						BackColor = Color.DodgerBlue;
						NumberOfColors = 1;
						DrawFill = true;
						break;
				}
			}
			else
				base.SetContentCore(value);
		}

 

2. Is there any way to override how Value is retrieved from the DataBoundItem? In one of my column types, I can't use FieldName directly. In classic DataGridView, I could override GetValue / SetValue like this:

		protected override object GetValue(int rowIndex)
		{
			DgvRealResultColumn col = OwningColumn as DgvRealResultColumn;
			object obj = DataGridView.Rows[rowIndex].DataBoundItem;
			if ((col == null) || (obj == null))
				return base.GetValue(rowIndex);

			object resultValue = GetResultValue(rowIndex, col, obj);
			Quality q = (Quality)Convert.ToInt32(resultValue);
			if (!QualityHelper.HasValue(q))
				return null;

			if (obj is RealResult rr)
				return rr.Value;

			string propName = string.Format("R{0:D3}Value", col.ItemIndex);
			PropertyInfo pi = obj.GetType().GetProperty(propName);
			return pi.GetValue(obj, null);
		}

I don't see anything like that in Telerik GridView. So far, I came up with this workaround:

		protected override void SetContentCore(object value)
		{
			TestResult r = null;
			var obj = RowInfo.DataBoundItem;
			if (obj is TestResult)
				r = (TestResult)obj;
			else if (obj is TestItem item)
			{
				var col = ColumnInfo as RgvTestResultColumn;
				if ((col != null) && (item.Results != null) && (col.ResultIndex < item.Results.Length))
					r = item.Results[col.ResultIndex];
			}

			ResetValue(VisualElement.BackColorProperty, ValueResetFlags.Local);
			ResetValue(VisualElement.ForeColorProperty, ValueResetFlags.Local);
			ResetValue(LightVisualElement.NumberOfColorsProperty, ValueResetFlags.Local);
			ResetValue(LightVisualElement.DrawFillProperty, ValueResetFlags.Local);

			if (r == null)
			{
				base.SetContentCore(value);
				return;
			}

			switch (r.Result)
			{
				case Quality.OK:
					Text = r.Value.ToString("F1");
					BackColor = Color.Lime;
					NumberOfColors = 1;
					DrawFill = true;
					break;
				case Quality.NOK:
					Text = r.Value.ToString("F1");
					BackColor = Color.Red;
					NumberOfColors = 1;
					DrawFill = true;
					break;
				case Quality.Error:
					Text = "X";
					BackColor = Color.DodgerBlue;
					NumberOfColors = 1;
					DrawFill = true;
					break;
				default:
					Text = "--";
					break;
			}
		}

But in this case, it doesn't set the internal Value, so when I write rgv.Rows[0].Cells["colR0"].Value in code, I always get null. Is there any way to solve this? I am attaching my test code for testing.

No answers yet. Maybe you can help?

Tags
GridView
Asked by
Marian
Top achievements
Rank 2
Bronze
Iron
Iron
Share this question
or