Update control when property haschanged



Hi,

I finally found how to update the render of my custom control when one of its property value changed.

However, i would like to know if there is not another way, because i'm afraid about memory usage or leak.

The following code is only a change color property update, but it is easy to adapt it to other properties.
However, i'm scared about the custom control constructor. Every time i must add/link there an eventhandler... is it a must or does it exist another solution ?

thanks a lot,

Al.

---------------------
Here is my custom control class code :
namespace MyComponent
{
public partial class Frame : UserControl
{
#region Event Handler

private EventHandler HandlerColorChanged;

#endregion

public Frame()
{
InitializeComponent();
HandlerColorChanged = new EventHandler(OnGridLinePropertyChanged);
this.m_GridLines.ColorChanged += HandlerColorChanged;
}

private CGridLine m_GridLines= new CGridLine();

[Category("Appearance")]
[Browsable(true)]

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Description("Setup Style, Type and Color of gridlines to draw.")]
[TypeConverter(typeof(CGridLineConverter))]
public CGridLine GridLines
{
get
{
return this.m_GridLines;
}
set
{
this.m_GridLines = value;
if (HandlerColorChanged != null)
{
this.m_GridLines.ColorChanged -= this.HandlerColorChanged;
}
this.HandlerColorChanged = new EventHandler(OnGridLinePropertyChanged);
this.m_GridLines.ColorChanged += this.HandlerColorChanged;
}
}

protected override void OnPaint(PaintEventArgs e)
{
if (this.m_GridLines.Lines != GridLine.None)
{
Pen myPen = new Pen(this.m_GridLines.Color);
e.Graphics.DrawRectangle(myPen, new Rectangle(0,0,this.Width-1,this.Height-1));
}
}

private void OnGridLinePropertyChanged(object Sender, EventArgs e)
{
// redraw the control
Invalidate();
}
}
}

and my GridClass code :

namespace MyComponent
{
/// <summary>
/// Specifies how a Table draws grid lines between its rows and columns
/// </summary>
public enum GridLine
{
/// <summary>
/// No grid lines are drawn
/// </summary>
None = 0,

/// <summary>
/// Grid lines are only drawn between columns
/// </summary>
Columns = 1,

/// <summary>
/// Grid lines are only drawn between rows
/// </summary>
Rows = 2,

/// <summary>
/// Grid lines are drawn between rows and columns
/// </summary>
All = 3
}

/// <summary>
/// Specifies the style of the lines drawn when a Table draws its grid lines
/// </summary>
public enum GridLineStyle
{
/// <summary>
/// Specifies a solid line
/// </summary>
Solid = 0,

/// <summary>
/// Specifies a line consisting of dashes
/// </summary>
Dash = 1,

/// <summary>
/// Specifies a line consisting of dots
/// </summary>
Dot = 2,

/// <summary>
/// Specifies a line consisting of a repeating pattern of dash-dot
/// </summary>
DashDot = 3,

/// <summary>
/// Specifies a line consisting of a repeating pattern of dash-dot-dot
/// </summary>
DashDotDot = 4
}

public class CGridLine
{

#region Event Handler

public event EventHandler ColorChanged;

#endregion

#region Class Data

private GridLine m_GridLines;
private GridLineStyle m_GridLinesStyle;
private Color m_GridLinesColor;

#endregion

#region Constructor

public CGridLine()
{
this.m_GridLines = GridLine.None;
this.m_GridLinesColor = System.Drawing.SystemColors.ActiveBorder;
this.m_GridLinesStyle = GridLineStyle.Solid;
}

public CGridLine(GridLine LineType, GridLineStyle LineStyle, Color LineColor)
{
this.m_GridLines = LineType;
this.m_GridLinesColor = LineColor;
this.m_GridLinesStyle = LineStyle;
}
#endregion

#region Properties

/// <summary>
/// Style of the GridLines
/// </summary>
///
[RefreshProperties(RefreshProperties.Repaint)]
[NotifyParentProperty(true)]
[DefaultValue(typeof(GridLineStyle), "Solid")]
public GridLineStyle Style
{
get
{
return this.m_GridLinesStyle;
}
set
{
this.m_GridLinesStyle = value;
//this.OnColorChanged(EventArgs.Empty);
}
}

/// <summary>
/// Types of GridLines
/// </summary>
[RefreshProperties(RefreshProperties.Repaint)]
[NotifyParentProperty(true)]
[DefaultValue(typeof(GridLine), "None")]
public GridLine Lines
{
get
{
return this.m_GridLines;
}
set
{
this.m_GridLines = value;
//this.OnPropertyChanged(EventArgs.Empty);
}
}

/// <summary>
/// Color of the GridLine
/// </summary>
[RefreshProperties(RefreshProperties.Repaint)]
[NotifyParentProperty(true)]
[DefaultValue(typeof(Color), "ActiveBorder")]
public Color Color
{
get
{
return this.m_GridLinesColor;
}
set
{
if (this.m_GridLinesColor != value)
{
this.m_GridLinesColor = value;
OnColorChanged(EventArgs.Empty);
}
}
}

#endregion

#region Event

private void OnColorChanged(EventArgs e)
{
// event has been raised
if (ColorChanged != null)
{
ColorChanged(this, e);
}
}

#endregion

}

public class CGridLineConverter : ExpandableObjectConverter
{
...
}
}
.



Relevant Pages

  • issue in property window
    ... I've created a simple class "GridLines" having 3 properties (Prop1, Prop2, and Prop3). ... To show the GridLines properties as my custom control subproperties, i used an expandable ExpandableObjectConverter class for my GridLineConverter. ... Everything works well if i use my custom control subproperties to setup the GridLine property. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Basic question about Neumann boundary conditions
    ... then yuo have unknowns at the grid lines ... since at the gridline number n you have the dirichlet data. ... grid lines 0,...,n-1. ...
    (sci.math.num-analysis)
  • Re: draw grid lines over an image in Javascript
    ... The grid will be used so that users can align objects correctly on the ... underlying image, so two requirements would be to turn the grid "on" ... dragged within a couple pixels of a gridline, ...
    (comp.lang.javascript)