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