CreateCell event cellelement is always null

35 posts, 3 answers
  1. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 04 Nov 2010 Link to this post

    Hi, this is my first post. I'm using RadGridView and I want some cells have different colour if a condition is fulfilled or some cells disabled if the same condition or another is fulfilled. I am handling CreateCell event but the problem is e.cellelement is always nothing and I get exception. I'm using RadControls for Windows 2010 Q2 SP2 trial.
    I'm using Visual Studio 2008 (.NET 3.5 Framework, VB. NET) and I'm new using telerik rad controls.
    Am I doing something wrong? Is this event the best for doing what I try to get? Thanks for the answers.



  2. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 04 Nov 2010 Link to this post

    Hi LLC,

    Welcome to the forums...

    You need to use the CellFormatting event. the below example shows changing the cell back color if the cell text property = "Name" (change to suite your condition)

    Let me know if you need further help
    Richard

    Private Sub RadGridView1_CellFormatting(ByVal sender As System.Object, ByVal e As Telerik.WinControls.UI.CellFormattingEventArgs) Handles RadGridView.CellFormatting
        Dim cell As GridDataCellElement = TryCast(e.CellElement, GridDataCellElement)
        If cell IsNot Nothing Then
            If cell.Text = "Name" Then
                cell.BackColor = Color.Aqua
                cell.GradientStyle = GradientStyles.Solid
                cell.DrawFill = True
            Else
                cell.ResetValue(LightVisualElement.DrawBorderProperty, ValueResetFlags.Local)
                cell.ResetValue(LightVisualElement.BorderBoxStyleProperty, ValueResetFlags.Local)
                cell.ResetValue(LightVisualElement.BorderWidthProperty, ValueResetFlags.Local)
                cell.ResetValue(LightVisualElement.BorderColorProperty, ValueResetFlags.Local)
            End If
        End If
    End Sub
  3. UI for WinForms is Visual Studio 2017 Ready
  4. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 05 Nov 2010 Link to this post

    Thanks, Richard. It's a little more complicated. I would only want to do the process only once because it doesn't depend on the values in the cells, it depens on the values I have in another table of a database (Let's say it's the structure) and these values correspond to the values I have in the grid in position (I hope you have understood me). If for example I sort the grid the values don't correspond and it makes the process again. If I'm not mistaken Cellformating fires each time the grid is modified. I was trying to do this process in DataBindingComplete event but it seems cell.style.backcolor doesn't work (it doesn't change the colour). Another question: Could I access enabled property in this event?, I don't find it. I would need it in order to disable some checkboxes which don't fulfil the condition.
     
    Thanks for your help and I apologize for my bad english.
  5. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 05 Nov 2010 Link to this post

    Hi LLC, 

    You would still need to use the CellFormatting event because of the new virtualization system that the RadGridView uses which gives it it's good performance. For more information on virtualization and it's implications see this link

    I'd suggest getting your database values outside of this event and comparing them. 

    As per the example, you should be using 
    cell.BackColor
    Not
    cell.style.backcolor

    The enabled property for the cell is part of the CellElement, and you can reach it from within the CellFormatting event. 

    hope that helps, but let me know if you have further questions. 

    Richard
  6. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 05 Nov 2010 Link to this post

    Thanks Richard. I'll investigate about the new virtualization system. Anyways I think cell.style.backcolor doen't work in DataBindingComplete event (for example cell.style.forecolor it works. I've checked it out).  And I'd like to know if it's normal that e.cellelement in CreateCell event is always nothing (maybe the value doesn't still exist because it's about to create the cell?)

    Thanks for your answers.
  7. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 05 Nov 2010 Link to this post

    Hi LLC, 

    No problem. A good read of the link about UI virtualization should explain it. 

    Please remember to mark as answer so others can quickly find the solution too. 
    All the best
    Richard
  8. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 05 Nov 2010 Link to this post

    P.S - Yes, in your scenario, e.CellElement will always be nothing in CreateCell
    Richard
  9. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 05 Nov 2010 Link to this post

    Hello,

    It is always null because there you can set another type of the cell, based on some conditions, basically you can do something like this:
    void radGridView1_CreateCell(object sender, GridViewCreateCellEventArgs e)
    {
        e.CellElement = new CustomCellElement(e.Column, e.Row);
    }
    Where you can say that this cell should be a custom cell element.

    But as Richard said you can use either the CellFormatting event to color specific cells, or the RowFormatting to format rows:
    A very basic example could be this:
    void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
    {
        if (e.CellElement.IsSelected)
        {
            e.CellElement.BackColor = Color.Red;
        }
        else
        {
            e.CellElement.ResetValue(LightVisualElement.BackColorProperty, Telerik.WinControls.ValueResetFlags.Local);
        }
    }
     
    void radGridView1_RowFormatting(object sender, RowFormattingEventArgs e)
    {
        if (e.RowElement.IsSelected)
        {
            e.RowElement.BackColor = Color.Red;
        }
        else
        {
            e.RowElement.ResetValue(LightVisualElement.BackColorProperty, Telerik.WinControls.ValueResetFlags.Local);
        }
    }

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga
  10. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 05 Nov 2010 Link to this post

    Thanks to both. I'm using CellFormatting event but I'm having problems with some cells. Namely they are checkboxes and I want some of them disabled. I'm doing some tests simply asking about the value of the checkbox (if it's unchecked I try to disable it setting cell.enabled=false, it works in most of the cells but in some it isn't working; sometimes it disable cells with value true and sometimes it doesn't disable cells with value false). Another question is about method resetvalue, the compiler doesn't recognize LightVisualElement: I see is  a radproperty object and I declare it but it hasn't backcolorproperty or drawborder property. I'm investigating about its use: Is it necessary for what I want to get?

     

    Thanks for your answers.

  11. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 05 Nov 2010 Link to this post

    Hi, 

    The LightVisualElement is a member of Telerik.WinControls.UI. If you are running the latest version, then the compiler should recognise it. This is needed to be able to reset the look and fell of the cell when the condition isn't met (and as the grid uses UI virtulization and the cells are re-used, I'd say that this is required)

    May I ask how you are trying to disable the cell? You may need to cast the cell to it's actual type to see a correct result, though it would be good to see your code for this event handler to confirm how you are doing this. 

    Thanks
    Richard

  12. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 05 Nov 2010 Link to this post

    Hello again LLC,

    Can you please post your code here, i will be more than happy to assist you more, everything will go easier and smoother like that.

    Best Regards,
    Emanuel Varga
  13. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 08 Nov 2010 Link to this post

    Thanks to both (Richard and Emanuel) for assisting me.

    This is the code: (I've made some progress but I'm still not getting the functionality I want).

    Some considerations:
    -Rad is an alias for Telerik.Wincontrols.UI

    -primeraVez (spanish for first time) it's a boolean declared in the form. Its purpose is avoiding the code to execute every time cellformatting is handled. I only want this to be done the first time the grid is painted because I don't want the cells enabled to disable if I uncheck them. Maybe this should be done in another event? (I've tried in DataBindingComplete but I don't have access to enabled property and besides it can have some problems due to UI virtualization as Richard pointed).

    Curious thing about this: If I remove the code concerning  primeraVez it works well (it disables cells with checkbox value false and enables cells with checkbox value true) but as I have said before if I uncheck a cell enabled it will been disabled after editing.

    -I've tried casting the cell to GridCheckBoxCellElement but I get the same result.

    -I attach a picture of the form showing the grid indicating the wrong cells. (The initial values of the checkbox cells have been set in DataBindingComplete event depending on the values of a table in a database). 

    Thanks guys again for your help. 

    Private Sub DG1_CellFormatting(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.CellFormattingEventArgs) Handles DG1.CellFormatting
          If primeraVez Then
                 Dim celda As Rad.GridDataCellElement = TryCast(e.CellElement, Rad.GridDataCellElement)
                 Dim indiceFila As Integer = e.CellElement.RowIndex
                 Dim indiceColumna As Integer = e.CellElement.ColumnIndex
               If celda IsNot Nothing Then
                   Select Case celda.ColumnInfo.HeaderText.ToUpper
                       Case "BIEN".ToUpper, "MAL".ToUpper
                           If celda.Value = False Then
                               celda.BackColor = Color.Red
                               celda.Enabled = False
                           Else
                               celda.ResetValue(Rad.LightVisualElement.BackColorProperty, Telerik.WinControls.ValueResetFlags.Local)
                               'celda.BackColor = Color.White
                               celda.Enabled = True
                           End If
                   End Select
                   'Last cell: I set boolean variable to false to indicate I don't want the code to be executed when grid is painted for the first time.
                        'I control it asking if I have reached the last cell of the grid (Maybe there is a better way).
                        'If I remove this verification cells enable and disable well so I think the problem is here.
                   If primeraVez And indiceFila = DG1.Rows.Count - 1 AndAlso indiceColumna = DG1.Columns.Count - 1 Then
                       primeraVez = False
                   End If
               End If
           End If
       End Sub
  14. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Nov 2010 Link to this post

    Hola LLC,

    In my view, you won't be able to get the PrimeraVez system working as you want all the time because of the afore mentioned UI Virtualization. Because the RadGridView re-uses the cells for the data, the data in each cell changes. You will need to use the CellFormatting event, but wrap in the appropriate IF statements to you colour the cells based on the current condition or the cell, or other cells in the row.

    Hope that helps
    Richard
  15. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 08 Nov 2010 Link to this post

    "You will need to use the CellFormatting event, but wrap in the appropriate IF statements to you colour the cells based on the current condition or the cell, or other cells in the row."
     
    Excuse me Richard. I think I'm not undestanding well now. For what I understand should I control other conditions in the other cells of the grid? Could you post an example, please?
  16. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Nov 2010 Link to this post

    Hi LLC,

    I'm a little unsure as to the issue you are left with. I will try to summarize:

    + Without the "PrimeraVez" boolean, all is working well, and the Checkboxes are coloured and enabled or disabled correctly
    + If you then click on one of the enabled checkboxes to uncheck it (and therefore you want to disable it), it does not change.

    Is that correct?
    Richard
  17. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 08 Nov 2010 Link to this post

    Hello LLC,

    The CellFormatting event has to fire every time, this is the behavior of the grid, so please remove that if with primeraVez and everything will work as expected.

    If you want i can try to explain the virtualization mechanism of the grid. Or you can take a look at this article, it should explain everything.

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga
  18. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 08 Nov 2010 Link to this post

    Hi, Richard. It's this way:

    +Without "PrimeraVez" boolean all cells are OK but If I uncheck a cell (enabled) this cell gets disabled, I want to keep it enabled.
    +With "PrimeraVez" boolean some cells are wrong (disabled when they should be enabled and enabled when they should be disabled) but when I uncheck cells enabled they keep enabled (it's what I want).

    I hope you understand me  

    PS: Check out the attached picture.
  19. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 08 Nov 2010 Link to this post

    Hi, Emanuel.

     

    If I remove if with primeraVez you're right: cells are drawn correctly but when I uncheck a cell it gets disabled and I want it to keep enabled.

    I don't know if there were another way of achieving what I want (maybe another event) or if I could access enabled property any other way.

     

    Thanks for your help and Richard's.

  20. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Nov 2010 Link to this post

    Hi LLC,

    I think I understand. But as both Emanuel and I have said, you need to let the grid fire the Cellformatting event everytime.

    Your issue is, is that on your CellFormatting event, you have already said that you want the any checkboxes that are unchecked to be disabled, and any checkboxes that are checked to be enabled.

    I would suggest addibng another column with a value that does not change (a boolean) and tie the enabled property of the checkbox to that.

    Richard
  21. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 08 Nov 2010 Link to this post

    Hello again,

    Why do you want to disable the cell?

    Just set it as a different color and treat that case when updating the data source...

    Best Regards,
    Emanuel Varga
  22. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 08 Nov 2010 Link to this post

    Hello again LLC,

    Please let us know if you have solved this problem if you need any more help, if you still have problems i would suggest creating a very small example and posting it here along with the exact requirements, this will allow us to help you solve your problems faster and possibly better.


    Best Regards,
    Emanuel Varga
  23. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 08 Nov 2010 Link to this post

    Hi, Emanuel. Initially I tried to set the cells with another color in DataBindingComplete event but it doesn't work. I do it casting the cell to RadGridViewCellInfo and setting cell.style.backcolor but it doesn't work (I've seen there are four backcolor properties, why?).

    It doesn't work in cellformatting event setting backcolor even removing the if with primeraVez.

     

     Thanks again for your assistance.

  24. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Nov 2010 Link to this post

    Hi LLC,

    To change the back colour of a cell you need to use the Cellformatting event. Please try the very first exmaple that I gave: I.e.

    Private Sub RadGridView1_CellFormatting(ByVal sender As System.Object, ByVal e As Telerik.WinControls.UI.CellFormattingEventArgs) Handles RadGridView.CellFormatting 
        Dim cell As GridDataCellElement = TryCast(e.CellElement, GridDataCellElement) 
        If cell IsNot Nothing Then
            If cell.Text = "Name" Then
                cell.BackColor = Color.Aqua 
                cell.GradientStyle = GradientStyles.Solid 
                cell.DrawFill = True
            Else
                cell.ResetValue(LightVisualElement.DrawBorderProperty, ValueResetFlags.Local) 
                cell.ResetValue(LightVisualElement.BorderBoxStyleProperty, ValueResetFlags.Local) 
                cell.ResetValue(LightVisualElement.BorderWidthProperty, ValueResetFlags.Local) 
                cell.ResetValue(LightVisualElement.BorderColorProperty, ValueResetFlags.Local) 
            End If
        End If
    End Sub


    the reason that there is more than one back color is that you can apply a gradient to blend in color from one to another.

    Please try the above example so we can continue to hel solve your issues

    Thanks
    Richard
  25. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 08 Nov 2010 Link to this post

    Hi, Richard. Using your example setting the backcolor is working (By the way in DataBindingComplete it doesn't never work, however forecolor it works).  But I still have the same problem, if I uncheck the cell the color changes and I don't want that (I'd like it always stayed the same color if initially was checkes though after I uncheck it). I've set readonly to false in the cells I don't want to be modified in DataBindingComplete event. This way cells initially unchecked can't be modified and they have the backcolor I want but as I have told you if I uncheck a cell initially checked (its readonly property is false) the backcolor changes and I don't want that. Is there any way to access readonly property in CellFormatting event?  If I could verify its value I think I could solve this definitely.

    Maybe I should try the aproach you told some posts ago: "Adding another column with a value that does not change (a boolean) and tie the enabled property of the checkbox to that." (I would need two extra columns in that case I think one for each boolean column I want to control).

    Anyways, thanks again for your effort and assistance.

  26. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 08 Nov 2010 Link to this post

    Hello LLC,

    Don't create another column, just use the Tag property of the cell to store a value there, and read it in the CellFormatting event, and based on that value decide what to do.

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga
  27. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Nov 2010 Link to this post

    Hi LLC, 

    That's the idea. if you want to maintain the color based on the initial values, it would be best to have an additional column to store these (that are not visible to the user) and base your color on those.

    This way, you will not encounter the issue of the checkbox changing. 
    Hope this helps. If you have any other questions, just let me know, or if you find that this has worked for you, please remember to mark as answer so others can find the solution too. 

    All the best
    Richard
  28. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 10 Nov 2010 Link to this post

    Hi, Emanuel, Richard.

    Both approaches (property tag and extra hidden column in datatable) tested and both worked.
    Thanks to both for your effort and assistance. :)
     
    PS: Is there anyway to mark both answers or only one of them can be marked?
  29. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 10 Nov 2010 Link to this post

    Hello again,

    You can mark / should mark all of the answers that are / were helpful in saving your problem.

    Glad to be able to help,
    If you have any more questions please just let me know,

    Best Regards,
    Emanuel Varga
  30. LLC
    LLC avatar
    17 posts
    Member since:
    Nov 2010

    Posted 16 Nov 2010 Link to this post

    Hi. I've tested this again and It seems I didn't test it well. Richard's approach works (extra columns, eventually I'm using this) but Emanuel's approach doesn't work well. The color of the cell is changing. The reason is that the tag property doesn't maintain its value between DataBindingComplete event (I set its value for the first time (true or false)) and CellFormatting (I read its value and yields nothing in every case). 

    Thanks for your answer guys.

     

  31. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 16 Nov 2010 Link to this post

    Hello LLC,

    Because in the DataBindingComplete you are setting the Tag value for the CellInfo and in the CellFormatting you are reading it for the CellElement, please take a look at the following code:
    void radGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
    {
        if (e.CellElement.RowInfo.Cells[0].Tag != null && e.CellElement.RowInfo.Cells[0].Tag.Equals(true))
        {
            e.CellElement.BackColor = Color.Red;
            e.CellElement.DrawFill = true;
        }
        else
        {
            e.CellElement.ResetValue(LightVisualElement.BackColorProperty, ValueResetFlags.Local);
            e.CellElement.ResetValue(LightVisualElement.DrawFillProperty, ValueResetFlags.Local);   
        }
    }
     
    void radGridView1_DataBindingComplete(object sender, GridViewBindingCompleteEventArgs e)
    {
        foreach (var row in radGridView1.Rows)
        {
            if (row.Index % 2 == 0)
            {
                row.Cells[0].Tag = true;
            }
        }
    }

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga
    Telerik WinForms MVP
Back to Top
UI for WinForms is Visual Studio 2017 Ready