96 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.ComponentModel;
 | |
| using System.Collections.Generic;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| // code from Bill McCarthy
 | |
| // http://msmvps.com/bill/archive/2005/10/05/69012.aspx
 | |
| // used with permission
 | |
| 
 | |
| namespace Csla.Windows
 | |
| {
 | |
|   /// <summary>
 | |
|   /// Windows Forms extender control that resolves the
 | |
|   /// data refresh issue with data bound detail controls
 | |
|   /// as discussed in Chapter 5.
 | |
|   /// </summary>
 | |
|   [DesignerCategory("")]
 | |
|   [ProvideProperty("ReadValuesOnChange", typeof(BindingSource))]
 | |
|   public class BindingSourceRefresh : Component, IExtenderProvider
 | |
|   {
 | |
| 
 | |
|     private Dictionary<BindingSource, bool> _sources = new Dictionary<BindingSource, bool>();
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Creates an instance of the object.
 | |
|     /// </summary>
 | |
|     /// <param name="container">Container of the control.</param>
 | |
|     public BindingSourceRefresh(IContainer container)
 | |
|     {
 | |
|       container.Add(this);
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Gets a value indicating whether the extender control
 | |
|     /// can extend the specified control.
 | |
|     /// </summary>
 | |
|     /// <param name="extendee">The control to be extended.</param>
 | |
|     /// <remarks>
 | |
|     /// This control only extends <see cref="BindingSource"/> controls.
 | |
|     /// </remarks>
 | |
|     public bool CanExtend(object extendee)
 | |
|     {
 | |
|       if (extendee is BindingSource)
 | |
|         return true;
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Gets the value of the custom ReadValuesOnChange extender
 | |
|     /// property added to extended controls.
 | |
|     /// </summary>
 | |
|     /// <param name="source">Control being extended.</param>
 | |
|     public bool GetReadValuesOnChange(BindingSource source)
 | |
|     {
 | |
|       if (_sources.ContainsKey(source))
 | |
|         return _sources[source];
 | |
|       return false;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Sets the value of the custom ReadValuesOnChange extender
 | |
|     /// property added to extended controls.
 | |
|     /// </summary>
 | |
|     /// <param name="source">Control being extended.</param>
 | |
|     /// <param name="value">New value of property.</param>
 | |
|     /// <remarks></remarks>
 | |
|     public void SetReadValuesOnChange(
 | |
|       BindingSource source, bool value)
 | |
|     {
 | |
|       if (_sources.ContainsKey(source))
 | |
|         _sources[source] = value;
 | |
|       else
 | |
|         _sources.Add(source, value);
 | |
|       if (value)
 | |
|       {
 | |
|         // hook
 | |
|         source.BindingComplete += 
 | |
|           new BindingCompleteEventHandler(Source_BindingComplete);
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         // unhook
 | |
|         source.BindingComplete -= 
 | |
|           new BindingCompleteEventHandler(Source_BindingComplete);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     private void Source_BindingComplete(
 | |
|       object sender, BindingCompleteEventArgs e)
 | |
|     {
 | |
|       e.Binding.ReadValue();
 | |
|     }
 | |
| 
 | |
|   }
 | |
| }
 |