Remove Conditional formatting after button click

9 posts, 1 answers
  1. David
    David avatar
    6 posts
    Member since:
    Dec 2019

    Posted 13 Jan Link to this post

    Hi,

    I have a grid-view with multiple grids working together, and one of the tasks at hand is if a value changes in a cell in one grid, then the main grid has to highlight any objects that shared that data that were affected by the change. The customer then needs to compile that data and at that point, the row for that object needs to have the highlight removed. I am able to get the conditional formatting for the highlight to work, but removing it from the entire row after the button click is proving to be a challenge. currently my code is set to do this using the following:

          public void GridHighLighterSetConditions()
          {
             int x = -1;
             double Index1 = - 1;
             double Index2 = - 1;
             double Index3 = - 1;
             string MIDindex = "";
             int RowIndex = 0;
             int MID = 0;


             foreach (GridViewDataRowInfo Index in MainGridView.SelectedRows)
             {

                if (MainGridView.SelectedRows.Count > 0)
                {
                   for (x = 0; x < MainGridView.SelectedRows.Count; x++)
                   {
                      RowIndex = MainGridView.SelectedRows[x].Index;

                      MIDindex = MainGridVIew.Rows[RowIndex].Cells[0].Value.ToString();

                      MID = int.Parse(MIDindex);
                   }
                   break;
                }
             }

             foreach (GridViewDataRowInfo Event in GridView2.Rows)

             {

                if (GridView2.SelectedRows.Count > 0)
                {
                   for (x = 0; x < GridView2.SelectedRows.Count; x++)
                   {
                      Index1 = GridView2.SelectedRows[x].Index + 1;
                   }
                   break;
                }
             }

             foreach (GridViewDataRowInfo Vevent in GridView3.Rows)
             {

                if (GridView3.SelectedRows.Count > 0)
                {
                   for (x = 0; x < GridView3.SelectedRows.Count; x++)
                   {
                      Index2 = GridView3.SelectedRows[x].Index + 1;
                   }
                   break;
                }
             }

             foreach (GridViewDataRowInfo REvent in GridView4.Rows)
             {

                if (GridView4.SelectedRows.Count > 0)
                {
                   for (x = 0; x < GridView4.SelectedRows.Count; x++)
                   {
                      Index3 = GridView4.SelectedRows[x].Index + 1;
                   }
                   break;
                }
             }

             ConditionalFormattingObject HL_1 = new ConditionalFormattingObject("Highlighter", ConditionTypes.Equal, Index1.ToString(), "", true);
             Font newFont = new Font("Arial", 8f, FontStyle.Bold);
             HL_1.CellFont = newFont;
             HL_1.CellForeColor = Color.DarkRed;
             HL_1.RowBackColor = Color.Gold;

             ConditionalFormattingObject HL_2= new ConditionalFormattingObject("Highlighter", ConditionTypes.Equal, Index2.ToString(), "", true);
             Font newPBVFont = new Font("Arial", 8f, FontStyle.Bold);
             HL_2.CellFont = newPBVFont;
             HL_2.CellForeColor = Color.DarkRed;
             HL_2.RowBackColor = Color.Gold;


             ConditionalFormattingObject HL_3 = new ConditionalFormattingObject("Highlighter", ConditionTypes.Equal, Index3.ToString(), "", true);
             Font newRVFont = new Font("Arial", 8f, FontStyle.Bold);
             HL_3.CellFont = newRVFont;
             HL_3.CellForeColor = Color.DarkRed;
             HL_3.RowBackColor = Color.Gold;

             ConditionalFormattingObject No_HL = new ConditionalFormattingObject("No Highlighter", ConditionTypes.Equal, MIDindex, "", true);
             Font newUMCFont = new Font("Arial", 8f, FontStyle.Regular);
             No_HL.CellFont = newUMCFont;
             No_HL.RowBackColor = Color.White;
             No_HL.CellForeColor = Color.Black;

             if (Index1 > Index2 && Index1 > Index3)
             {
                MainGridView.Columns["Column1"].ConditionalFormattingObjectList.Add(HL_1);

                GridView2.ClearSelection();
             }

             else if (Index2 > Index1 && Index2 > Index3)
             {
                MainGridView.Columns["column2"].ConditionalFormattingObjectList.Add(HL_2);

                GridView3.ClearSelection();
             }

             else if (Index3 > Index1 && Index3 > Index2)
             {
                MainGridView.Columns["Column3"].ConditionalFormattingObjectList.Add(HL_3);

                GridView4.ClearSelection();
             }
             else if (MIDindex != null && MID > Index1 && MID > Index2 && MID > Index3)
             {
                Index1 = -1;
                Index2 = -1;
                Index3 = -1;

                MainGridView.Columns["Column0"].ConditionalFormattingObjectList.Add(No_HL);
                

                MainGridView.ClearSelection();
                MainGridView.Refresh();
             }
             return;
          }

     

    I Feel as though there must be a much easier way to do this.

    Thanks.

  2. David
    David avatar
    6 posts
    Member since:
    Dec 2019

    Posted 13 Jan in reply to David Link to this post

    The button  click would trigger the 

     else if (MIDindex != null && MID > Index1 && MID > Index2 && MID > Index3)
             {
                Index1 = -1;
                Index2 = -1;
                Index3 = -1;

                MainGridView.Columns["Column0"].ConditionalFormattingObjectList.Add(No_HL);
                

                MainGridView.ClearSelection();
                MainGridView.Refresh();
             }

  3. David
    David avatar
    6 posts
    Member since:
    Dec 2019

    Posted 14 Jan in reply to David Link to this post

    Update* I am using MainGridView.Columns["Column"].ConditionalFormattingObjectList.Clear(); for the time being but it clears all rows and I need to clear only the currently selected row after the user clicks a button.
  4. Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3952 posts

    Posted 16 Jan Link to this post

    Hello, David,    

    According to the provided information, I think that using the RowFormatting or CellFormatting events would be a more appropriate solution for your case. You can use the data row's Tag property whether it should be highlighted or not and check the row's Tag value in the formatting event to apply the desired style. Once a row is updated, you can simply call its InvalidateRow method of the GridViewRowInfo and thus the respective formatting event will be forced and the appropriate style applied.

    Additional information how to use the RowFormatting or CellFormatting events is available here: 
    https://docs.telerik.com/devtools/winforms/controls/gridview/rows/formatting-rows
    https://docs.telerik.com/devtools/winforms/controls/gridview/cells/formatting-cells

    Please give this approach a try and see how it works for your case.

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

    Regards,
    Dess | Tech Support Engineer, Sr.
    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.
  5. David
    David avatar
    6 posts
    Member since:
    Dec 2019

    Posted 21 Jan in reply to Dess | Tech Support Engineer, Sr. Link to this post

    Thanks For Responding Dess,

    I attempted to use the RowFormatting and CellFormatting as you suggested, but it's not working.

    Just to clarify, I have Multiple RadGridView's each tabbed separately. What I want to do is, if information is changed in any of the cells for the currently selected row in RadGridView2 I want it to highlight that data row's index to be Changed to red in the corresponding cell in RadGridView1 as well as highlight that row in RadGridView1. Which I was able to accomplish with code I provided above.

    But when the user clicks a button that will compile the information in the highlighted row in RadGridView1 after they select that row, if it compiles successfully, I want to have the currently selected row in RadGridView1 go back to normal (no highlights or changed font) without any of the info in the Currently Selected row changing.

    is this possible?

    Thanks in advance.

  6. Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3952 posts

    Posted 22 Jan Link to this post

    Hello, David,  

    I have prepared a sample code snippet demonstrating the idea of handling the CellFormatting event. The attached gif file illustrates better the obtained result. 
            public RadForm1()
            {
                InitializeComponent();
    
                this.radGridView1.CellFormatting += radGridView1_CellFormatting;
    
                DataTable dt = new DataTable();
                dt.Columns.Add("Id", typeof(int));
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("CReatedOn", typeof(DateTime));
                for (int i = 0; i < 10; i++)
                {
                    dt.Rows.Add(i, "Item" + i, DateTime.Now.AddDays(i));
                }
                this.radGridView1.DataSource = dt;
                this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
                this.radGridView2.DataSource = dt;
                this.radGridView2.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
    
                this.radGridView2.CellValueChanged += radGridView2_CellValueChanged;
            }
    
            Font f = new Font("Arial", 8f, FontStyle.Bold);
    
            private void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
            {
                if (e.Row.Cells[e.ColumnIndex].Tag != null && e.Row.Cells[e.ColumnIndex].Tag == "changed")
                {
                    e.CellElement.ForeColor = Color.Red;
                    e.CellElement.Font = f;
                }
                else
                {
                    e.CellElement.ResetValue(LightVisualElement.ForeColorProperty, ValueResetFlags.Local);
                    e.CellElement.ResetValue(LightVisualElement.FontProperty, ValueResetFlags.Local);
                }
            }
    
            private void radGridView2_CellValueChanged(object sender, GridViewCellEventArgs e)
            {
                this.radGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Tag = "changed";
                this.radGridView1.Rows[e.RowIndex].InvalidateRow();
            }
    
            private void radButton1_Click(object sender, EventArgs e)
            {
                if (this.radGridView1.CurrentRow!=null)
                {
                    foreach (GridViewCellInfo cell in this.radGridView1.CurrentRow.Cells)
                    {
                        cell.Tag = null;
                    }
                    this.radGridView1.CurrentRow.InvalidateRow();
                }
            }
    You can find attached the complete project as well. Please give it a try and see whether it works for your case.

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

     

    Regards,
    Dess | Tech Support Engineer, Sr.
    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.
  7. David
    David avatar
    6 posts
    Member since:
    Dec 2019

    Posted 22 Jan in reply to Dess | Tech Support Engineer, Sr. Link to this post

    Thank you for your reply Dess,

    That was an awesome example of how to use the tagging feature, but it's still not quite what I'm looking for. I tried tweaking the code you provided to do what I needed, but it is still not cooperating. I attached some screenshots to give you an example of exactly what I'm attempting to do.

  8. Answer
    Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3952 posts

    Posted 27 Jan Link to this post

    Hello, David,  

    Thank you for providing the screenshot. According to it, you want to get the Index cell's value of the edited row and highlight the cells on the right grid that refer to the same index of the affected row. Actually, you can use a similar approach as the one illustrated in the previously prvided example. You just need to iterate all rows on the right grid and check whether the respective row's Index is equal to theaffected row's Index. Then, mark the row with the Tag property as in the project.

    I have updated the sample project. The achieved result is illustrated in the attached gif file. 

    Should you have further questions please let me know.

     

    Regards,
    Dess | Tech Support Engineer, Sr.
    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.
  9. David
    David avatar
    6 posts
    Member since:
    Dec 2019

    Posted 27 Jan in reply to Dess | Tech Support Engineer, Sr. Link to this post

    Thanks so much for your help Dess that worked perfectly! I marked this as closed
Back to Top