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 { /// /// Windows Forms extender control that resolves the /// data refresh issue with data bound detail controls /// as discussed in Chapter 5. /// [DesignerCategory("")] [ProvideProperty("ReadValuesOnChange", typeof(BindingSource))] public class BindingSourceRefresh : Component, IExtenderProvider { private Dictionary _sources = new Dictionary(); /// /// Creates an instance of the object. /// /// Container of the control. public BindingSourceRefresh(IContainer container) { container.Add(this); } /// /// Gets a value indicating whether the extender control /// can extend the specified control. /// /// The control to be extended. /// /// This control only extends controls. /// public bool CanExtend(object extendee) { if (extendee is BindingSource) return true; return false; } /// /// Gets the value of the custom ReadValuesOnChange extender /// property added to extended controls. /// /// Control being extended. public bool GetReadValuesOnChange(BindingSource source) { if (_sources.ContainsKey(source)) return _sources[source]; return false; } /// /// Sets the value of the custom ReadValuesOnChange extender /// property added to extended controls. /// /// Control being extended. /// New value of property. /// 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(); } } }