This is a migrated thread and some comments may be shown as answers.

Conditional Formatting on DisplayMember of GridViewComboBoxColumn rather than the ValueMember

7 Answers 261 Views
GridView
This is a migrated thread and some comments may be shown as answers.
Matt
Top achievements
Rank 1
Matt asked on 27 Apr 2015, 11:43 PM

I cannot believe I couldn't find a question about this anywhere... Which usually means I'm missing something extremely simple. I have a RadGridView and I add a column via the following code:

// Generate Status column
GridViewComboBoxColumn Status = new GridViewComboBoxColumn();
Status.Name = "Status";
Status.HeaderText = "Status";
Status.FieldName = "Status";
Status.DataSource = ListsMain.Tables[4];
Status.DisplayMember = ListsMain.Tables[4].Columns["name"].Caption;
Status.ValueMember = ListsMain.Tables[4].Columns["id"].Caption;
Status.DisplayMemberSort = true;
 
radgridview_troubletickets.Columns.Add(Status);

 

I really like the conditional formatting option available in the prebuilt form that the RadGridView offers. However, if I want to put a condition on the GridViewComboBoxColumn I added, the condition is based on the ValueMember. This makes no sense to the user, because the value member is just a key from the database, so the end user would never have any idea what the value member is. There has to be an easy way to base the condition on the text selected in the RadViewComoBoxColumn instead of the value of the cell.

 Any advice would be GREATLY appreciated.

7 Answers, 1 is accepted

Sort by
0
Dess | Tech Support Engineer, Principal
Telerik team
answered on 30 Apr 2015, 12:29 PM
Hello Matt,

Thank you for writing.

By default, ConditionalFormattingObjects consider the cell value when evaluating the condition. However, you can create a derivative of the ConditionalFormattingObject and override its Evaluate method where the returned result determines whether the condition is met. Thus, you can check the cell's text instead of value. Here is a sample code snippet which result is illustrated on the attached screenshot:
private void Form1_Load(object sender, EventArgs e)
{
    this.productsTableAdapter.Fill(this.nwindDataSet.Products);
 
    GridViewComboBoxColumn comboColumn = new GridViewComboBoxColumn("Product");
    comboColumn.DataSource = this.productsBindingSource;
    comboColumn.ValueMember = "ProductID";
    comboColumn.DisplayMember = "ProductName";
    comboColumn.FilteringMode = GridViewFilteringMode.DisplayMember;
    this.radGridView1.Columns.Add(comboColumn);
    this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
 
    Random rand = new Random();
    for (int i = 0; i < 30; i++)
    {
        this.radGridView1.Rows.Add(rand.Next(1, 30));
    }
    CustomConditionalFormattingObject obj = new CustomConditionalFormattingObject("MyCondition", ConditionTypes.Contains, "w", "", false);
    obj.CellBackColor = Color.SkyBlue;
    obj.CellForeColor = Color.Red;
    obj.TextAlignment = ContentAlignment.MiddleRight;
    this.radGridView1.Columns["Product"].ConditionalFormattingObjectList.Add(obj);
}
 
public class CustomConditionalFormattingObject:ConditionalFormattingObject
{
    private string p1;
    private ConditionTypes conditionTypes;
    private string p2;
    private string p3;
    private bool p4;
 
    public CustomConditionalFormattingObject(string p1, ConditionTypes conditionTypes, string p2, string p3, bool p4)
        : base(p1,conditionTypes,p2,p3,p4)
    {
    }
 
    public override bool Evaluate(GridViewRowInfo row, GridViewColumn column)
    {
        GridViewComboBoxColumn comboColumn = column as GridViewComboBoxColumn;
        if (comboColumn == null)
        {
            return base.Evaluate(row, column);
        }
        object actualValue = row.Cells[column.Name].Value;
        if (actualValue == null)
        {
            return base.Evaluate(row, column);
        }
        string lookUpValue = comboColumn.GetLookupValue(actualValue).ToString();
        switch (this.ConditionType)
        {
            case ConditionTypes.StartsWith:
            case ConditionTypes.EndsWith:
            case ConditionTypes.Contains:
            case ConditionTypes.DoesNotContain:
                return StringCompare(lookUpValue, this.TValue1, this.ConditionType);
            default:
                return false;
        }
    }
 
    private bool StringCompare(object cellValue, string expression, ConditionTypes condition)
    {
        if ((cellValue is DBNull) || (cellValue == null))
            return expression == null;
 
        if (expression == null)
            return cellValue == null;
 
        string stringCellValue = cellValue.ToString();
        string compareExpression = expression;
        if (!this.CaseSensitive)
        {
            stringCellValue = stringCellValue.ToLower();
            compareExpression = compareExpression.ToLower();
        }
 
        bool result = false;
 
        switch (condition)
        {
            case ConditionTypes.Contains:
                result = stringCellValue.Contains(compareExpression);
                break;
            case ConditionTypes.DoesNotContain:
                result = !stringCellValue.Contains(compareExpression);
                break;
            case ConditionTypes.EndsWith:
                result = stringCellValue.EndsWith(compareExpression);
                break;
            case ConditionTypes.StartsWith:
                result = stringCellValue.StartsWith(compareExpression);
                break;
        }
 
        return result;
    }
}

I hope this information helps. Should you have further questions, I would be glad to help.
 
Regards,
Dess
Telerik
 

See What's Next in App Development. Register for TelerikNEXT.

 
0
Matt
Top achievements
Rank 1
answered on 30 Apr 2015, 02:18 PM
Thanks for the response! Will this only be possible if I create the conditional formatting objects via code, or can this work with the conditional formatting GUI that is built in that allows end users to define these at runtime?
0
Dess | Tech Support Engineer, Principal
Telerik team
answered on 05 May 2015, 11:42 AM
Hello Matt,

Thank you for writing back.

The introduced approach from my previous reply is a clear solution to achieve the desired behavior. It can be applied even when using the conditional formatting GUI. Note that you can subscribe to the GridViewColumn.ConditionalFormattingObjectList.CollectionChanged event and replace the default ConditionalFormattingObject with the custom one. However, it is important to unsubscribe from the GridViewColumn.ConditionalFormattingObjectList.CollectionChanged event in the event handler when manipulating the GridViewColumn.ConditionalFormattingObjectList collection and subscribe to it again when you are ready with adding the custom ConditionalFormattingObject.

I hope this information helps. If you have any additional questions, please let me know.

Regards,
Dess
Telerik
 

See What's Next in App Development. Register for TelerikNEXT.

 
0
Luca
Top achievements
Rank 1
answered on 24 Sep 2018, 11:50 AM

Hello,

would it be possible to have a sample code for the CollectionChanged event handler for replacing the default ConditionalFormattingObject with the custom one in order to have it working with the conditional formatting GUI?

Thanks
Luca

0
Dess | Tech Support Engineer, Principal
Telerik team
answered on 24 Sep 2018, 01:17 PM
Hello, Luca,  

You can find attached a sample project demonstrating how to replace the default ConditionalFormattingObject with a custom one.

I hope this information helps. If you need any further assistance please don't hesitate to contact me. 

Regards,
Dess
Progress Telerik
Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
0
Luca
Top achievements
Rank 1
answered on 24 Sep 2018, 03:42 PM

Hi Dess,

I've applied the code you provided to my project and it worked fine for me. I had to make it more generic in order to add the custom behavior to multiple columns and now it's an easy to add  formatting for any  column from the GUI.

Thanks a lot!
Luca

0
Dess | Tech Support Engineer, Principal
Telerik team
answered on 25 Sep 2018, 08:23 AM
Hello, Luca,  

I am glad that the provided sample project was useful for your scenario. Indeed, it doesn't provide a general solution but it demonstrates a sample approach how you can handle the adding of a ConditionalFormattingObject and replace it with a custom one. Feel free to customize and extend it in a way to achieve the exact goal that you have.  

If you need any further assistance please don't hesitate to contact me. 

Regards,
Dess
Progress Telerik
Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Tags
GridView
Asked by
Matt
Top achievements
Rank 1
Answers by
Dess | Tech Support Engineer, Principal
Telerik team
Matt
Top achievements
Rank 1
Luca
Top achievements
Rank 1
Share this question
or