Author: jackson
Date: 2006-03-16 01:05:18 -0500 (Thu, 16 Mar 2006)
New Revision: 58057

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs
   
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ControlBindingsCollection.cs
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs
Log:

        * BindingContext.cs: Check the binding after its added so that
        * it
        can initialize the binding managers and hookup to events.
        * Binding.cs: Data members seem to sometimes include rows/cols
        * in
        the format Row.Column we now take this into account.
        - Hookup to the position changed event so we can update the
        control when the position has changed in the data set.
        * CurrencyManager.cs: Take into account the row/col naming
        convention when creating dataset tables.
        * BindingContext.cs: Using a newer better way of storing
        datasource/datamember pairs.  Hopefully this better matches MS
for
        looking up binding managers.



Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs       
2006-03-16 00:56:50 UTC (rev 58056)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs       
2006-03-16 06:05:18 UTC (rev 58057)
@@ -35,6 +35,10 @@
                private string property_name;
                private object data_source;
                private string data_member;
+
+               private string row_name;
+               private string col_name;
+
                private BindingMemberInfo binding_member_info;
                private Control control;
 
@@ -56,6 +60,12 @@
                        data_source = dataSource;
                        data_member = dataMember;
                        binding_member_info = new BindingMemberInfo 
(dataMember);
+
+                       int sp = data_member.IndexOf ('.');
+                       if (sp != -1) {
+                               row_name = data_member.Substring (0, sp);
+                               col_name = data_member.Substring (sp + 1, 
data_member.Length - sp - 1);
+                       }
                }
                #endregion      // Public Constructors
 
@@ -134,6 +144,7 @@
                        control.Validating += new CancelEventHandler 
(ControlValidatingHandler);
 
                        this.control = control;
+                       control.DataBindings.Add (this);
                }
 
                internal void Check (BindingContext binding_context)
@@ -141,8 +152,12 @@
                        if (control == null)
                                return;
 
-                       manager = control.BindingContext [data_source];
+                       string member_name = data_member;
+                       if (row_name != null)
+                               member_name = row_name;
+                       manager = control.BindingContext [data_source, 
row_name];
                        manager.AddBinding (this);
+                       manager.PositionChanged += new EventHandler 
(PositionChangedHandler);
 
                        WirePropertyValueChangedEvent ();
 
@@ -174,7 +189,11 @@
                                }
                        }
 
-                       if (data_member != null) {
+                       if (row_name != null && col_name != null) {
+                               PropertyDescriptor pd = 
TypeDescriptor.GetProperties (manager.Current).Find (col_name, true);
+                               object pulled = pd.GetValue (manager.Current);
+                               data = ParseData (pulled, pd.PropertyType);
+                       } else if (data_member != null) {
                                PropertyDescriptor pd = 
TypeDescriptor.GetProperties (manager.Current).Find (data_member, true);
                                object pulled = pd.GetValue (manager.Current);
                                data = ParseData (pulled, pd.PropertyType);
@@ -189,7 +208,7 @@
 
                internal void UpdateIsBinding ()
                {
-                       PushData ();
+                       PullData ();
                }
 
                private void SetControlValue (object data)
@@ -199,7 +218,10 @@
 
                private void SetPropertyValue (object data)
                {
-                       PropertyDescriptor pd = TypeDescriptor.GetProperties 
(manager.Current).Find (data_member, true);
+                       string member_name = data_member;
+                       if (col_name != null)
+                               member_name = col_name;
+                       PropertyDescriptor pd = TypeDescriptor.GetProperties 
(manager.Current).Find (member_name, true);
                        if (pd.IsReadOnly)
                                return;
                        pd.SetValue (manager.Current, data);
@@ -234,6 +256,11 @@
                        PullData ();
                }
 
+               private void PositionChangedHandler (object sender, EventArgs e)
+               {
+                       PullData ();
+               }
+
                private object ParseData (object data, Type data_type)
                {
                        ConvertEventArgs e = new ConvertEventArgs (data, 
data_type);

Modified: 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs
===================================================================
--- 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs    
    2006-03-16 00:56:50 UTC (rev 58056)
+++ 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs    
    2006-03-16 06:05:18 UTC (rev 58057)
@@ -36,6 +36,39 @@
 
                private Hashtable managers;
 
+               private class DataSourceEntry {
+
+                       private object source;
+                       private Hashtable members;
+                       // private BindingManagerBase default_manager;
+                       
+                       public DataSourceEntry (object source)
+                       {
+                               this.source = source;
+                               members = new Hashtable ();
+                       }
+
+                       public BindingManagerBase AddMember (string member)
+                       {
+                               BindingManagerBase res = members [member] as 
BindingManagerBase;
+                               if (res != null)
+                                       return res;
+                               res = CreateBindingManager (source, member);
+                               members [member] = res;
+                               return res;
+                       }
+
+                       public void AddMember (string member, 
BindingManagerBase manager)
+                       {
+                               members [member] = manager;
+                       }
+
+                       public bool Contains (string member)
+                       {
+                               return members.Contains (member);
+                       }
+               }
+
                private class ManagerEntry {
 
                        private object source;
@@ -92,25 +125,16 @@
 
                public BindingManagerBase this [object data_source, string 
data_member] {
                        get {
-                               ManagerEntry e = CreateEntry (data_source, 
data_member);
-                               WeakReference wref = managers [e] as 
WeakReference;
-
-                               if (wref != null && wref.Target != null)
-                                       return wref.Target as 
BindingManagerBase;
-                               BindingManagerBase res = AddManager 
(data_source, data_member);
-                               return res;
+                               DataSourceEntry ds = managers [data_source] as 
DataSourceEntry;
+                               if (ds == null) {
+                                       ds = new DataSourceEntry (data_source);
+                                       managers [data_source] = ds;
+                               }
+                               return ds.AddMember (data_member);
                        }
                }
 
-               private BindingManagerBase AddManager (object data_source, 
string data_member)
-               {
-                       BindingManagerBase res = CreateBindingManager 
(data_source, data_member);
-                       managers [CreateEntry (data_source, data_member)] = new 
WeakReference (res);
-
-                       return res;
-               }
-
-               private BindingManagerBase CreateBindingManager (object 
data_source, 
+               private static BindingManagerBase CreateBindingManager (object 
data_source, 
                        string data_member)
                {
                        if (data_source is IList || 
@@ -131,9 +155,11 @@
 
                public bool Contains (object dataSource, string dataMember)
                {
-                       ManagerEntry entry = CreateEntry (dataSource, 
dataMember);
+                       DataSourceEntry ds = managers [dataSource] as 
DataSourceEntry;
+                       if (ds == null)
+                               return false;
+                       return ds.Contains (dataMember);
 
-                       return managers.ContainsKey (entry);
                }
                #endregion      // Public Instance Methods
 
@@ -151,7 +177,12 @@
                                throw new ArgumentNullException ("dataSource");
                        if (listManager == null)
                                throw new ArgumentNullException ("listManager");
-                       managers.Add (CreateEntry (dataSource, String.Empty), 
new WeakReference (listManager));
+                       DataSourceEntry ds = managers [dataSource] as 
DataSourceEntry;
+                       if (ds == null) {
+                               ds = new DataSourceEntry (dataSource);
+                               managers [dataSource] = ds;
+                       }
+                       ds.AddMember (String.Empty, listManager);
                }
 
                protected internal void Clear ()
@@ -180,7 +211,7 @@
 
                protected virtual void RemoveCore (object dataSource)
                {
-                       managers.Remove (CreateEntry (dataSource, 
String.Empty));
+                       managers.Remove (dataSource);
                }
                #endregion      // Protected Instance Methods
 

Modified: 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ControlBindingsCollection.cs
===================================================================
--- 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ControlBindingsCollection.cs
     2006-03-16 00:56:50 UTC (rev 58056)
+++ 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ControlBindingsCollection.cs
     2006-03-16 06:05:18 UTC (rev 58057)
@@ -123,6 +123,7 @@
                        }
 
                        binding.SetControl (control);
+                       binding.Check (control.BindingContext);
                        base.AddCore (binding);
                }
 

Modified: 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs
===================================================================
--- 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs   
    2006-03-16 00:56:50 UTC (rev 58056)
+++ 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs   
    2006-03-16 06:05:18 UTC (rev 58057)
@@ -64,8 +64,13 @@
                        if (table == null && data_source is DataView)
                                table = ((DataView) data_source).Table;
 
+                       
                        if (table == null) {
                                DataSet dataset = data_source as DataSet;
+                               int sp = data_member.IndexOf ('.');
+                               if (sp != -1) {
+                                       data_member = data_member.Substring (0, 
sp);
+                               }
                                if (dataset != null) {
                                        table = dataset.Tables [data_member];
                                }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to