Event ValueChanged when I set checkbox programmatically

3 posts, 0 answers
  1. Fernan
    Fernan avatar
    10 posts
    Member since:
    May 2010

    Posted 24 May 2010 Link to this post

    Hi,

    I've put a custom checkbox in the header in order to select/unselect all row's checkbox. I use this code:

    public class CheckBoxHeaderCell : GridHeaderCellElement 
        { 
            RadCheckBoxElement checkbox; 
     
            public CheckBoxHeaderCell(GridViewColumn column, GridRowElement row) 
                : base(column, row) 
            { 
            } 
     
            protected override void DisposeManagedResources() 
            { 
                checkbox.ToggleStateChanged -= new StateChangedEventHandler(checkbox_ToggleStateChanged); 
                base.DisposeManagedResources(); 
            } 
     
     
            protected override void CreateChildElements() 
            { 
                base.CreateChildElements(); 
                checkbox = new RadCheckBoxElement(); 
                checkbox.ToggleStateChanged += new StateChangedEventHandler(checkbox_ToggleStateChanged); 
                this.Children.Add(checkbox); 
                ApplyThemeToElement(checkbox, "ControlDefault"); 
            } 
     
            protected override SizeF ArrangeOverride(SizeF finalSize) 
            { 
                base.ArrangeOverride(finalSize); 
                if (checkbox != null
                { 
                    RectangleF rect = GetClientRectangle(finalSize); 
                    checkbox.Arrange(new RectangleF(rect.Right - 20, (rect.Height - 20) / 2, 20, 20)); 
                } 
                return finalSize; 
            } 
     
            private void checkbox_ToggleStateChanged(object sender, StateChangedEventArgs args) 
            { 
                this.GridControl.BeginEdit();                   
                for (int i = 0; i < this.GridControl.Rows.Count; i++) 
                { 
                    this.GridControl.Rows[i].IsSelected = true
                    this.GridControl.Rows[i].IsCurrent = true;                 
                    this.GridControl.Rows[i].Cells["Mostrar"].Value = this.checkbox.IsChecked; 
                } 
                this.GridControl.EndEdit(); 
            } 
     
            private void ApplyThemeToElement(RadItem item, string themeName) 
            { 
                DefaultStyleBuilder builder = ThemeResolutionService.GetStyleSheetBuilder((RadControl)item.ElementTree.Control, 
                    item.GetThemeEffectiveType().FullName, string.Empty, themeName) as DefaultStyleBuilder; 
     
                if (builder != null
                { 
                    item.Style = new XmlStyleSheet(builder.Style).GetStyleSheet(); 
                } 
            } 
        }  

    and:

     private void radGridView1_CreateCell(object sender, GridViewCreateCellEventArgs e) 
            { 
                if (e.Row is GridTableHeaderRowElement && e.Column.HeaderText == "Mostrar"
                { 
                    e.CellElement = new SMPDataAnalyzer.TelerikHeaderGrid.CheckBoxHeaderCell(e.Column, e.Row); 
                }  
            } 


    This works fine. But the problem is the following:

    I have to detect when the row's checkbox value is change to true or false. I use the ValueChanged event :
    private void radGridView1_ValueChanged(object sender, EventArgs e) 
            { 
                try 
                { 
                    if (this.radGridView1.ActiveEditor is RadCheckBoxEditor) 
                    { 
                        if (radGridView1.CurrentRow.Tag != null
                        { 
                            if ((bool)(this.radGridView1.ActiveEditor.Value) && !tendencias.ContainsKey(Convert.ToInt32(radGridView1.CurrentRow.Tag))) 
                            { 
                                if (radGridView1.SelectedRows.Count > 0) 
                                { 
                                    medidastendencia = Controller.CargarValoresMedidas 
                                        (long.Parse(radGridView1.CurrentRow.Cells["PuntoId"].Value.ToString()), 
                                        fechaIni, fechaFin, 
                                        long.Parse(radGridView1.SelectedRows[0].Cells["TipoEspectro"].Value.ToString()), 
                                        long.Parse(radGridView1.SelectedRows[0].Cells["Nbanda"].Value.ToString())); 
     
                                    if (medidastendencia.Count > 0) 
                                    { 
                                        ScatterPlot scatterPlot = new ScatterPlot(); 
                                        scatterPlot.XAxis = xAxis2; 
                                        scatterPlot.YAxis = yAxis2; 
                                        scatterPlot.Tag = Convert.ToInt32(radGridView1.CurrentRow.Tag); 
                                        scatterGraphTendencias.Plots.Add(scatterPlot); 
                                        int i = 0; 
                                        double[] fechas = new double[medidastendencia.Count]; 
                                        double[] values = new double[medidastendencia.Count]; 
                                        foreach (MedidaTendencia mt in medidastendencia) 
                                        { 
                                            fechas[i] = (Double)(DataConverter.Convert(mt.FechaMedida, typeof(Double))); 
                                            values[i] = mt.Valor; 
                                            i++; 
                                        } 
                                        scatterPlot.PlotXY(fechas, values); 
                                        xyCursor2.Plot = scatterPlot; 
                                        xyCursor2.SnapMode = CursorSnapMode.NearestPoint; 
                                        xyCursor2.MoveNext(); 
                                        xyCursor2.MovePrevious(); 
                                        xyCursor2.Visible = true
                                        if (!isTendenciaVisible) 
                                        { 
                                            isTendenciaVisible = true
                                            activeTend(); 
                                        } 
                                        tendencias.Add(Convert.ToInt32(radGridView1.CurrentRow.Tag), values); 
                                    } 
                                    else 
                                    { 
                                        MessageBox.Show(Properties.Resources.ERROR_MEDIDAS_TEND); 
                                    } 
                                } 
                            } 
                            else 
                            { 
                                //Se ha puesto a false 
                                if (tendencias.ContainsKey(Convert.ToInt32(radGridView1.CurrentRow.Tag))) 
                                { 
                                    int i = 0; 
                                    foreach (ScatterPlot plot in scatterGraphTendencias.Plots) 
                                    { 
                                        if (plot.Tag.ToString() == radGridView1.CurrentRow.Tag.ToString()) 
                                        { 
                                            if (i > 1) 
                                            { 
                                                xyCursor2.Plot = scatterGraphTendencias.Plots[i - 1]; 
                                                xyCursor2.MoveNext(); 
                                                xyCursor2.MovePrevious(); 
                                            } 
                                            else 
                                            { 
                                                if (scatterGraphTendencias.Plots.Count > 2) 
                                                { 
                                                    xyCursor2.Plot = scatterGraphTendencias.Plots[i + 1]; 
                                                    xyCursor2.MoveNext(); 
                                                    xyCursor2.MovePrevious(); 
                                                } 
                                                else 
                                                { 
                                                    xyCursor2.Plot = scatterPlot2; 
                                                    xyCursor2.Visible = false
     
                                                    desactiveTend(); 
                                                } 
                                            } 
                                            scatterGraphTendencias.Plots.Remove(plot); 
                                            plot.Dispose(); 
                                            break
                                        } 
                                        i++; 
                                    } 
                                    tendencias.Remove(Convert.ToInt32(radGridView1.CurrentRow.Tag)); 
                                } 
                            } 
                        } 
                    } 
                } 
                catch (Exception ex) 
                { 
                    string message = ex.Message; 
                } 
            } 


    But..., when I use the header checkbox in order to select/unselect all,the ActiveEditor property is null.

    ┬┐How do I this?

    Thank you,

    Fernan,

  2. Svett
    Admin
    Svett avatar
    728 posts
    Member since:
    Oct 2014

    Posted 27 May 2010 Link to this post

    Hello Fernan,

    GridHeaderCellElement is not a data cell. Therefore, it does not store a value from your data source. The ActiveEditor property of RadGridView points to editors contained only in data cells, so you cannot set your editor to the ActiveEditor property. As a workaround, you can use RadGridView's Tag property as a field where you can store the header cell's check box when you change its toggle state:

    private void checkbox_ToggleStateChanged(object sender, StateChangedEventArgs args)
    {
        this.GridControl.Tag = this.checkbox;
        this.GridControl.BeginEdit();
        for (int i = 0; i < this.GridControl.Rows.Count; i++)
        {
            this.GridControl.Rows[i].Cells[this.ColumnIndex].Value = this.checkbox.IsChecked;
        }
     
        this.GridControl.EndEdit();
        this.GridControl.Tag = null;
    }

    Then you can access it in ValueChanged event:
    private void radGridView1_ValueChanged(object sender, EventArgs e)
    {
         if (this.radGridView1.ActiveEditor is RadCheckBoxEditor || this.radGridView1.Tag is RadCheckBoxElement)
         {
        // TO DO: your operation here
         }
         else
         {
        // TO DO: your else-operation here
         }
    }


    All the best,
    Svett
    the Telerik team

    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.

  3. Fernan
    Fernan avatar
    10 posts
    Member since:
    May 2010

    Posted 27 May 2010 Link to this post

    Thank you, it's a perfect solution!

    Fernan,

Back to Top